본문 바로가기
Kubernetes/PKOS

[1주차]Kops 를 이용하여 AWS에 쿠버네티스 클러스터 구축하기

by isn`t 2023. 3. 12.

*본 게시글의 내용은 가시다님의 노션 페이지와 스터디 자료인 '24단계 실습으로 정복하는 쿠버네티스 도서' 를 기반으로 작성하였습니다.

KOPS란

AWS에서 쿠버네티스를 사용한다 함은 곧 EKS를 떠올리는 것이 일반적인 선택지라고 생각했는데 첫 회차부터 쿠버네티스 클러스터를 직접 구성하면서 이번 기회에 Kops를 처음 사용해보게 되었다.

kubernetes 공식 문서에서도 배포 도구 3가지 중 하나로 소개하고 있으나
쿠버네티스를 처음 접할 때 kubespray를, CKA와 CKAD를 취득할 때 kubeadm을 사용해본 뒤로 Kops를 사용해 볼 기회가 마땅치 않았다.

모든 배포 툴을 섭렵할 필요를 느끼지 못했거니와, EKS가 클러스터 구성 과정에서 제공하는 강력한 편의성 덕분이기도 했는데, 마침 이번 스터디에서 Kops를 사용하여 쿠버네티스 클러스터를 구축해볼 기회가 생겨 직접 사용해보고 사용 후기와, 클러스터 구축 과정에서 주의할 점들을 살펴보고자 한다.

Prerequisite

공식문서

Kops 사용 전에 세 가지 사전 요건을 충족해야 한다.

  • kubectl이 반드시 설치되어 있어야 한다.
  • 64bit 아키텍처(AMD64, Intel64) 기반이어야 한다.
  • AWS 계정과 IAM User, 적절한 권한이 필요하다.

--> 여기까지는 공식 문서에서 언급된 사전 요건이고, 아래는 내가 직접 사용해보면서 느낀 사실상의 필수 요건이다.

추가

  • 클러스터 상태 저장을 위한 S3 버킷
    • 마치 테라폼의 tfstate 파일처럼 클러스터의 상태를 관리하는 파일이 생성되는데 이를 S3에 저장해두고 관리할 수 있다.
  • Route53 도메인
    • 사전 요건과 공식 문서 내용만 보아도 알 수 있듯이, 사실상 AWS 환경을 전제로 하고있다. (vspere나 몇몇 온프레미스 환경에서도 사용 가능한 듯 함)
      도메인도 가급적 Route53에서 구매하고 등록하는 편이 불필요한 에러 상황을 피할 수 있을 듯 하다.
      나는 외부에서 도메인을 준비하고 네임서버 레코드를 옮겨붙이는 등의 수고를 들여가며 설치를 진행했다가
      다양한 사유로 설치 실패(네임서버 변경 TTL등..)를 마주했었다.
    • 다만 비용적인 면에서는 route53의 도메인이 저렴한 편은 아니니, 용인할 수 있는 수준의 저렴한 도메인 구매가 가능하다면 route53을, 그렇지 않다면 외부에서 도메인을 구매하고 Route53에 붙이는 편이 좋을 것 같다.
    • 다른 호스팅 업체는 모르겠지만 내가 처음에 사용했던 가비아는 네임서버 변경시 24시간이 디폴트인 듯 하다.
    • Route53에서 도메인을 등록하고 사용할 수 있게 되기까지 넉넉히 30분은 잡는 편이 좋다.

kops create cluster 명령으로 클러스터를 자동으로 구성할 수 있듯이 다행히 도중에 실패하거나 변경사항이 발생하더라도
kops update cluster, kops delete cluster 명령으로 손쉽게 수정사항을 반영하거나 클러스터를 제거할 수 있었다.

[root@kops-ec2 ~]# dig ilikebigmac.link NS 
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ilikebigmac.link NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23555
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ilikebigmac.link.              IN      NS

;; ANSWER SECTION:
ilikebigmac.link.       10      IN      NS      ns-1515.awsdns-61.org.
ilikebigmac.link.       10      IN      NS      ns-2011.awsdns-59.co.uk.
ilikebigmac.link.       10      IN      NS      ns-362.awsdns-45.com.
ilikebigmac.link.       10      IN      NS      ns-687.awsdns-21.net.

;; Query time: 35 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Sun Mar 12 02:27:43 KST 2023
;; MSG SIZE  rcvd: 185

Route53에서 도메인을 등록한 경우 NS 레코드 조회시 위와 같이 ;; ANSWER SECTION:에 awsdns 네임서버가 레코드로 등록되면 사용 가능하다고 보면 된다.

클러스터 설치

[root@kops-ec2 ~]# kops create cluster --zones="$REGION"a,"$REGION"c --networking amazonvpc --cloud aws \
> --master-size t3.medium --node-size t3.medium --node-count=2 --network-cidr 172.30.0.0/16 \
> --ssh-public-key ~/.ssh/id_rsa.pub --name=$KOPS_CLUSTER_NAME --kubernetes-version "1.24.10" -y
I0312 02:29:21.781487   11574 create_cluster.go:878] Using SSH public key: /root/.ssh/id_rsa.pub
I0312 02:29:22.193314   11574 new_cluster.go:1354] Cloud Provider ID: "aws"
I0312 02:29:22.264193   11574 subnets.go:185] Assigned CIDR 172.30.32.0/19 to subnet ap-northeast-2a
I0312 02:29:22.264216   11574 subnets.go:185] Assigned CIDR 172.30.64.0/19 to subnet ap-northeast-2c

*********************************************************************************
A new kubernetes version is available: 1.24.11
Upgrading is recommended (try kops upgrade cluster)
More information: https://github.com/kubernetes/kops/blob/master/permalinks/upgrade_k8s.md#1.24.11
*********************************************************************************

W0312 02:29:33.691047   11574 builder.go:230] failed to digest image "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni:v1.12.2"
W0312 02:29:34.155805   11574 builder.go:230] failed to digest image "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni-init:v1.12.2"
I0312 02:29:37.400846   11574 executor.go:111] Tasks: 0 done / 103 total; 48 can run
W0312 02:29:37.556513   11574 vfs_castore.go:383] CA private key was not found
I0312 02:29:37.563117   11574 keypair.go:224] Issuing new certificate: "etcd-clients-ca"
I0312 02:29:37.580006   11574 keypair.go:224] Issuing new certificate: "etcd-manager-ca-main"
I0312 02:29:37.605255   11574 keypair.go:224] Issuing new certificate: "apiserver-aggregator-ca"
I0312 02:29:37.690951   11574 keypair.go:224] Issuing new certificate: "etcd-peers-ca-events"
I0312 02:29:37.713428   11574 keypair.go:224] Issuing new certificate: "etcd-manager-ca-events"
I0312 02:29:37.732351   11574 keypair.go:224] Issuing new certificate: "etcd-peers-ca-main"
W0312 02:29:37.862300   11574 vfs_castore.go:383] CA private key was not found
I0312 02:29:37.882408   11574 keypair.go:224] Issuing new certificate: "service-account"
I0312 02:29:38.063943   11574 keypair.go:224] Issuing new certificate: "kubernetes-ca"
I0312 02:29:40.572917   11574 executor.go:111] Tasks: 48 done / 103 total; 21 can run
I0312 02:29:41.547073   11574 executor.go:111] Tasks: 69 done / 103 total; 28 can run
W0312 02:29:43.117947   11574 retry_handler.go:99] Got RequestLimitExceeded error on AWS request (ec2::AuthorizeSecurityGroupIngress)
I0312 02:29:44.097371   11574 executor.go:111] Tasks: 97 done / 103 total; 3 can run
I0312 02:29:45.775980   11574 executor.go:155] No progress made, sleeping before retrying 3 task(s)
I0312 02:29:55.776826   11574 executor.go:111] Tasks: 97 done / 103 total; 3 can run
I0312 02:29:57.100268   11574 executor.go:111] Tasks: 100 done / 103 total; 3 can run
I0312 02:29:57.185075   11574 executor.go:111] Tasks: 103 done / 103 total; 0 can run
I0312 02:29:58.316590   11574 dns.go:232] Pre-creating DNS records
I0312 02:29:58.809146   11574 update_cluster.go:323] Exporting kubeconfig for cluster

kOps has set your kubectl context to ilikebigmac.link

Cluster is starting.  It should be ready in a few minutes.

Suggestions:
 * validate cluster: kops validate cluster --wait 10m
 * list nodes: kubectl get nodes --show-labels
 * ssh to a control-plane node: ssh -i ~/.ssh/id_rsa ubuntu@api.ilikebigmac.link
 * the ubuntu user is specific to Ubuntu. If not using Ubuntu please use the appropriate user based on your OS.
 * read about installing addons at: https://kops.sigs.k8s.io/addon

정상적으로 구성되고 나면 몇 분 후에 구성이 완료된다는 내용의 코멘트가 출력된다.

처음에는 route53의 A레코드에 203.0.113.123이 임시로 추가되는데, Kops의 배포가 완료되고 나면 아래와 같이 마스터 역할을 하는 EC2의 Public IP로 변경된다.

설치 확인

[root@kops-ec2 ~]# kubectl get node
NAME                  STATUS   ROLES           AGE     VERSION
i-083a10c137cf2cc91   Ready    control-plane   6m28s   v1.24.10
i-0921a4981f855f1b0   Ready    node            4m3s    v1.24.10
i-0b2ca011cf6a726e9   Ready    node            4m6s    v1.24.10

[root@kops-ec2 ~]# kubectl get pod -A
NAMESPACE     NAME                                          READY   STATUS    RESTARTS        AGE
kube-system   aws-cloud-controller-manager-2gg87            1/1     Running   0               6m1s
kube-system   aws-node-gx5xf                                1/1     Running   0               4m24s
kube-system   aws-node-nmrgd                                1/1     Running   0               6m1s
kube-system   aws-node-v2bnb                                1/1     Running   0               4m21s
kube-system   coredns-68cd66b8cc-8w86p                      1/1     Running   0               4m
kube-system   coredns-68cd66b8cc-ggdtp                      1/1     Running   0               6m1s
kube-system   coredns-autoscaler-66fbc7dd48-txdbh           1/1     Running   0               6m1s
kube-system   dns-controller-68c5695b64-442wl               1/1     Running   0               6m1s
kube-system   ebs-csi-controller-6b9447f987-2v8vm           5/5     Running   0               6m1s
kube-system   ebs-csi-node-27mmw                            3/3     Running   0               4m21s
kube-system   ebs-csi-node-7w6d4                            3/3     Running   0               4m24s
kube-system   ebs-csi-node-nr2r7                            3/3     Running   0               6m1s
kube-system   etcd-manager-events-i-083a10c137cf2cc91       1/1     Running   0               5m50s
kube-system   etcd-manager-main-i-083a10c137cf2cc91         1/1     Running   0               6m6s
kube-system   kops-controller-b8sj9                         1/1     Running   0               6m1s
kube-system   kube-apiserver-i-083a10c137cf2cc91            2/2     Running   0               5m40s
kube-system   kube-controller-manager-i-083a10c137cf2cc91   1/1     Running   3 (6m47s ago)   6m41s
kube-system   kube-proxy-i-083a10c137cf2cc91                1/1     Running   0               6m18s
kube-system   kube-proxy-i-0921a4981f855f1b0                1/1     Running   0               4m21s
kube-system   kube-proxy-i-0b2ca011cf6a726e9                1/1     Running   0               4m24s
kube-system   kube-scheduler-i-083a10c137cf2cc91            1/1     Running   0               6m21s

kops create cluster 명령 수행하면서 각 az별로 하나씩 2개의 워커노드가 준비되었고,
vpc-cni를 사용하기 위한 aws-node, coredns와 ebs-csi-controller 같은 add-on도 모두 배포 되어있다.

[root@kops-ec2 ~]# kops get cluster
NAME                    CLOUD   ZONES
ilikebigmac.link        aws     ap-northeast-2a,ap-northeast-2c
[root@kops-ec2 ~]# kops get ig
NAME                            ROLE            MACHINETYPE     MIN     MAX     ZONES
control-plane-ap-northeast-2a   ControlPlane    t3.medium       1       1       ap-northeast-2a
nodes-ap-northeast-2a           Node            t3.medium       1       1       ap-northeast-2a
nodes-ap-northeast-2c           Node            t3.medium       1       1       ap-northeast-2c

kops 자체 명령으로도 클러스터의 상태정보를 확인 가능하다.

각 인스턴스들은 ASG로 구성되어 있다.

Kops 사용 후기

자동화된 툴인 만큼 간편하고 AWS 환경에 필요한 k8s add on도 함께 구성되며, DNS 레코드를 자동으로 등록해준다는 점에서 단순많은 부분이 자동화 되어있다고 느껴졌다.
사용 전에는 단순히 클러스터를 구성하는 스크립트만 돌아가고 나머지 작업은 manual하게 수행해야 할 것이라고 생각했는데, 생각 외로 잘 만들어진 배포 툴이라는 느낌을 받았다.

다만 쿠버네티스를 처음 접하거나, 약간의 인프라 지식과 AWS에 대한 이해가 있는 사용자에게 적합하다는 느낌을 받았다.
가장 첫 단계인 Route53의 도메인 구입을 위한 비용이 다른 기관에 비하여 저렴한 편이 아니기에 아무 도메인이나 덥썩 구매했다가는 실습 환경 한 번 만들어보려다 적잖은 비용을 지불해야 할 수도 있다.
또한 AWS 리소스를 다양하게 사용하기 때문에 이에 대한 이해도 어느 정도 요구된다.

Kops를 사용해보고 동작하는 방식을 살펴보면서 의문이 드는 점들이 있었다.

  1. EC2의 public IP를 A레코드로 등록하여 k8s의 api서버에 접근한다면, multi master를 어떻게 구현할 것인가? ELB 붙여야 하나?
  2. On-premise에 있는 자원들과 하이브리드 구성이 가능할까?
  3. 백업은 어떻게 하고, 어디에 저장될까?

-> 나열하고 보니 마침 스터디 노션의 Kops 활용 주제에 해당하는 내용이 있어 다음 글에서 다루어 보고자 한다.

클러스터 구성 과정에서 EKS가 주는 강력한 편의성은 비교할 바가 아니겠지만, 클라우드 서비스로 추상화된 상태의 쿠버네티스를 사용하고 싶지 않으면서도 AWS 환경 기반의 클러스터를 구축하고자 한다면 괜찮은 선택지가 될 수 있다고 보인다.