최근 회사를 옮기게 되면서 데브옵스 엔지니어에서 솔루션즈 아키텍트로 직무 전환을 하게 되었다. 그런데 클라우드 서비스에 대한 지식과 경험이 없는 채로 입사를 하게 되다보니;; 기초적인 클라우드 서비스에 대해 공부하느라 원래 제일 관심있었던 쿠버네티스에 대한 공부를 미루고만 있었는데… 마침 이전 직장의 팀원 분이 참여하셨던 쿠버네티스 스터디의 다음 기수가 오픈해서 참여해보게 되었다. 이번에 참여하게 된 스터디는 가시다님이 운영하시는 쿠버네티스 스터디로 매번 스터디 테마가 약간씩 다른 것으로 알고있는데, 이번 기수에는 현업에서 쿠버네티스를 사용한 경험이 있는 분들을 대상으로 쿠버네티스의 각 요소에 대해 실습을 통해 학습하게 된다.
스터디 1주차의 내용은 Kops라는 쿠버네티스 배포 도구를 설치하고, 해당 도구를 이용해 AWS 상에서 쿠버네티스 클러스터를 구축해보는 것이다.
1. kOps란?
kOps를 설치하기 전, Kops란 무엇인지에 대해 간단히 알아보도록 하자.
CSP사의 Managed k8s 서비스를 사용하지 않고, VM에 직접 쿠버네티스 클러스터를 구축해보거나, CKA 시험에서 클러스터 설치에 대한 부분을 학습해본 사람들은 kubeadm이라는 쿠버네티스 배포 도구를 사용해보았을 것이다.
Kops는 바로 이 kubeadm과 같이 쿠버네티스 클러스터를 배포, 관리, 업그레이드를 자동화 해주는 도구인데, AWS와 GCP같은 클라우드 플랫폼의 여러 서비스와의 연동까지 자동화해서 사용할 수 있게 해주는 오픈소스 소프트웨어이다(쿠버네티스 프로젝트의 하위 프로젝트).
kOps 공식 Docs를 살펴보면, 현재 실제 업무 환경에서 kOps를 활용할만한 클라우드 플랫폼은 AWS와 GCP(공식 지원)이고, DigitalOcean, Hetzner, Openstack은 베타 지원, 그리고 Azure는 아직 알파 지원 단계라고 한다. 쿠버네티스 공식 문서에도 AWS상에서 kOps를 이용한 클러스터 설치 방법이 나와있는데, 구글링을 해봐도 그렇지만 kOps도 AWS 쪽 자료가 많은 듯 하다.
사전 준비 사항
실습을 위해서는 AWS Free Tier 계정 생성 및 IAM User 생성이 필요하다.
AWS에서 이메일 주소로 계정을 새로 생성하면 1년 동안 각종 서비스를 무료로 사용할 수 있는 Free Tier 계정이 발급된다(다만, 실습에서 사용하는 인스턴스 타입은 Free Tier에 해당 되지 않아 실습 후 바로 삭제하지 않으면 비용이 부과된다).
AWS 서비스를 사용해본 경험이 있는 사람이면 모두 알겠지만 root 계정은 절대 사용하지 말고 반드시 MFA를 설정해 두도록 한다(Authy 앱을 사용하면 편리).
실습은 IAM User 계정을 생성해서 사용 하게 되는데, 실습에서 콘솔과 CLI를 모두 사용할 것이기 때문에 User/Password 로그인 방식 및 Access Key 로그인 방식 모두 선택한다.
IAM User의 권한은 편의를 위해 IAM User 생성 시 AdministratorAccess 정책을 부여해서 사용한다(대부분의 AWS 서비스를 사용할 수 있는 강력한 권한을 부여했으니 보안을 위해 IAM User에도 MFA를 꼭 걸어놓도록 하자).
다음은 aws configure로 AWS CLI의 유저 정보를 업데이트 한다(AWS CLI를 설치하지 않은 경우, 이 링크를 참고해서 설치하도록 하자). Access Key ID 및 Secret Access Key 정보에는 IAM User 생성 시 발급받은 키 정보들을 넣어주면 된다. 리전은 ap-northeast-2(Seoul)로 선택한다.
다음은 로컬PC의 터미널을 이용해 EC2 인스턴스에 접속하기 위해 사용하는 ssh 키페어를 설정한다.
- AWS Management Console에서 AWS 리전 선택 :
ap-northeast-2 (서울)
- 서비스 > EC2 > 네트워크 및 보안 > 키 페어 > 키 페어 생성
- 이름 : [원하는 이름으로 생성] / 키 페어 유형 :
RSA
(공개키) / 프라이빗 키 파일 형식 :.pem
(OpenSSH와 함께 사용) > 키 페어 생성
kOps 설치
이번에 실습할 클러스터 구성은 아래와 같다.
- k8s 클러스터를 배포할 수 있는 kops가 설치된 ec2를 cloudformation에 의해 생성된다.
- k8s 설정파일을 s3에 저장한뒤, kops로 k8s클러스터를 생성하게 된다.
- 구성: k8s - v1.24.9, OS - Ubuntu 20.04 LTS
과제 1: 설치한 kOps의 클러스터 정보를 공유
kops 클러스터 생성은 AWS EKS 클러스터를 생성할 때 eksctl
유틸리티를 활용하는 것처럼, kops create cluster
명령어를 통해 생성할 수 있다. (체감상) 생성 속도로만 보면 eksctl을 사용했을 때보다 2배 이상 빠른 듯. 클러스터 생성이 완료되면, 아래 명령어로 클러스터와 인스턴스들이 잘 생성되었는지 확인 할 수 있다.
- kops get cluster
- kops get instances
재직자 발표
이번 주 스터디에서는 24단계 실습으로 정복하는 쿠버네티스
책의 저자이신 이정훈님의 발표를 들었다. 업무와 책 집필을 병행하신 것도 인상적이었지만 개인적으로는 k8s 클러스터 위에서 일반적인 웹앱 워크로드 외에 DB나 MSK까지 올려서 사용하신 것도 기억에 남는다.
쿠버네티스 및 kops 기본 사용법
kubectl로 deployment를 생성한 뒤 스케일링 및 삭제 실습을 해서 멱등성(reconciler: YAML에 정의한 바라는 상태(desired state)를 유지)을 확인하는 실습을 진행했다.
서비스 배포 테스트도 진행. 이번 실습에서는 CLB를 배포해서 실습을 진행했는데, 다음 스터디에서는 AWS Load Balancer Controller를 활용해 ALB에 배포하는 테스트도 진행할 예정.
뿐만 아니라 krew를 설치해 kubectl cli를 확장할 수 있는 플러그인을 설치해 kubectl를 조금 더 편리하게 사용할 수 있는 기능도 알려주셨다. 개인적으로는 클러스터 정보와 네임스페이스 정보를 설정할 수 있는 kube-ctx와 kube-ns가 편리하다고 느껴졌다(매번 네임스페이스나 클러스터 정보 넣어주는 거 너무 귀찮음..).
헬름(Helm)
다음은 헬름을 통해 워드프레스를 배포해보도록 하자. 헬름(Helm)은 쿠버네티스의 패키지 관리자라고 설명 되어있는데, 쿠버네티스 클러스터에 올릴 특정 워크로드 배포에 필요한 정보들을 묶어서 한꺼번에 배포할 수 있도록 관리해주는 소프트웨어라고 생각하면 된다. 배포에 필요한 정보들을 묶어 놓은 것을 차트(Chart), 차트를 실제로 배포해 생성된 차트의 인스턴스를 릴리즈(release)라고 부른다.
각종 도커 이미지를 모아놓은 도커허브(Docker Hub)처럼 헬름에서 각종 헬름 차트를 모아놓은 Artifact Hub이 존재하며, 이번 실습에서는 이 artifacthub에 올라온 워드프레스를 bitnami 저장소를 활용해 배포해보도록 할 것이다.
과제 2: Helm 활용해 Wordpress 배포
helm search 명령어를 이용해 artifact hub에서 적당한 저장소를 찾는다.
bitnami repo를 추가한 뒤, 해당 repo에서 wordpress를 찾는다.
wordpress가 배포될 네임스페이스를 생성해준다.
helm 배포 진행 (--set
으로 default 파라미터 덮어쓰기)
watch 명령어로 필요한 리소스들이 생성되는지 확인한다.
생성이 완료되면 생성된 CLB 주소로 접속할 수 있다.
관리자 계정에 들어가기 위한 계정정보를 확인하려면 아래 명령어를 입력하면 된다.
관리 페이지에 들어가 신규 글을 작성해 업로드하면 잘 반영되는 것을 확인할 수 있다.
과제 3: AWS kOps 활용 - Gossip DNS로 AWS kOps 배포하기
나는 실습 계정으로 사용하던 AWS 계정에 Route53 도메인 구입 권한이 막혀있어서 가시다님이 대안으로 말씀주신 Gossip DNS로 배포를 진행했었다.
kOps로 k8s 클러스터를 배포할 경우에는 DNS주소가 반드시 필요하게 되는데, Route53에서 퍼블릭 호스팅 도메인을 구입하지 않은 경우 Gossip DNS라는 것을 사용하면 된다.
위에서 kops로 k8s 클러스터를 배포할 경우 kops create cluster 명령어를 사용한다고 설명했는데, 배포를 하기 위해서 여러가지 파라미터 값을 넘겨줘야한다. 실습에서 지정했던 환경 변수 값들은 아래와 같은데, 이 중에서 KOPS_CLUSTER_NAME이라는 환경 변수값을 Gossip DNS 값으로 지정해주어야 한다.
참고로 Gossip DNS는 반드시 .k8s.local
로 끝나야 한다.
KOPS_CLUSTER_NAME을 포함한 환경변수를 저장해준 뒤, 아래와 같은 명령어로 k8s 클러스터를 생성한다.
--zones
: AWS 가용 영역(Availability Zone) 지정--networking
: CNI 지정(예시에서는 AWS VPC CNI를 지정)--cloud
: 배포할 클라우드 플랫폼 지정(예시에서는 AWS를 지정)--master-size
: Master Node의 인스턴스 타입 지정--node-size
: Worker Node의 인스턴스 타입 지정--node-count
: Worker Node의 개수 지정--network-cidr
: 생성할 VPC의 네트워크 범위 지정 (사설 네트워크 범위로 지정)--ssh-public-key
: 노드 접속에 사용할 SSH 키 파일 생성--name
: 클러스터명 지정(Route53에서 생성한 퍼블릭 도메인 주소 혹은 Gossip DNS사용)--kubernetes-version
: k8s 버전 지정-y
: 설치 도중 묻는 질문에 모두 yes
배포가 완료된 뒤, /etc/hosts 값을 확인해보면 localhost 주소만 입력되어있는 것을 확인할 수 있다.
해당 파일에 api.
+ Gossip DNS로 생성한 DNS주소에 해당하는 IP를 함께 적어준다(생성한 서버의 kube-apiserver에 접근하기 위함).
'DevOps' 카테고리의 다른 글
PKOS 스터디 2주차: 쿠버네티스 네트워크 (0) | 2023.01.29 |
---|---|
리눅스(Linux) 다중 명령어(;, &&, ||) (0) | 2023.01.13 |
[DevOps]로컬환경에서 JMX exporter + Prometheus + Grafana로 자바 모니터링 (4)Grafana 설치 (0) | 2022.03.30 |
[DevOps]로컬환경에서 JMX exporter + Prometheus + Grafana로 자바 모니터링 (3)Prometheus 설치 (0) | 2022.03.30 |
[DevOps]로컬환경에서 JMX exporter + Prometheus + Grafana로 자바 모니터링 (1)JMX exporter 설치 (0) | 2022.03.29 |