[24단계 실습으로 정복하는 쿠버네티스] 책으로 스터디를 진행하였다.
KOPS란?
KOPS는 Kubernetes OPerationS의 약어로, Kubernetes 클러스터를 배포하고 관리하기 위한 도구로,
KOPS를 사용하면 클라우드 서비스에서 Kubernetes 클러스터를 직접 배포해 관리할 수 있다.
현재 KOPS는 AWS(Amazon Web Services) 및 GCE(Google Cloud Platform)만 공식적으로 지원하고,
DigitalOcean, Hetzner 및 OpenStack은 베타 지원으로, Azure는 알파로 지원된다고 한다.
KOPS와 같이 Kubernetes를 관리하는 도구로 Kubeadm, Kubespray 등이 있는데,
이번 스터디에서는 KOPS를 사용하기로 하였다.
- KOPS 홈페이지 : https://kops.sigs.k8s.io
- KOPS github : https://github.com/kubernetes/kops
- KOPS, Kubeadm, Kubespray 대한 비교 글 : https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md
스터디를 하면서 KOPS의 몇가지 특징을 확인할 수 있었는데 아래와 같다.
- 멀티 마스터 클러스터를 지원한다.
- 단, 홀수개를 권장한다 : https://etcd.io/docs/v3.5/faq/#what-is-failure-tolerance - EKS에 비해 배포 시간이 빠르다. (시간과 비용적으로 이득)
- EKS는 provisioning에 약 15~20분 가량이 소요되었는데, KOPS는 10분 내외로 소요되었다. - EKS에서 지원하는 POD 보안그룹은 지원하지 않는다.
- https://reaperes.medium.com/security-group-을-pod-단위로-할당하기-bef922065684 - 개인적인 생각인데 비용적으로는 EKS에 비해 낮다고 생각할 수 있으나,
KOPS에서는 Spot 인스턴스를 활용하기 어려워 EKS에 비해 극적으로 비용이 줄어든다고 생각되진 않았다.
KOPS를 사용한 Kubernetes 구성
실습할 구성의 요구사항은 아래와 같다.
- kubectl을 반드시 설치해야 한다.
- 반드시 64-bit (AMD64 그리고 Intel 64)디바이스 아키텍쳐 위에서 kops 를 설치 한다.
- AWS 계정이 있고 IAM 키를 생성하고 구성해야 한다. IAM 사용자는 적절한 권한이 필요하다.
- 외부 도메인 연결 테스트를 위해 Route53의 도메인 구매가 필요하다.
(외부 연결을 하지 않을 경우에는 Private Domain으로 가능, 이럴 경우 myVPC와 VPC1에서만 DNS 조회가 가능하다.) - S3를 통해서 K8S Cluster 자원을 생성하므로 S3가 필요하다.
kops-ec2라는 bastion 서버를 올리고 해당 서버에서 KOPS명령어를 통해 Kubernetes Cluster를 생성한다.
특이한점은 kops-ec2에서 S3를 통해 K8S Cluster를 생성하는 점인데, 이를 위해 kops-ec2에서 사용할 IAM 계정 정보가 필요하다. (보안을 위해서는 최소 권한이 주어져야하지만, 원활한 실습을 위해 AdministratorAccess 권한을 사용하였다.)
kops명령어 수행 시 클러스터 이름에 구매한 Domain을 넣어주면 Route53 DNS가 자동으로 연동된다.
자동 생성된 레코드의 매칭 값은 생성이 완료되면 Master Node의 IP 등 kops cluster에서 구성된 IP로 변경된다.
cluster 생성 후 아래와 같이 정상적으로 구성되었는지 validate 명령어를 제공한다.
보안그룹 설정으로 막아두지 않았다면, 아래와 같이 외부 도메인을 통해서 Master Node에 접속이 가능하다.
[root@kops-ec2 ~]# ssh -i ~/.ssh/id_rsa ubuntu@api.ersia.net
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-1031-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sat Mar 11 14:18:13 UTC 2023
추가내용 (ExternalDNS Addon)
Private한 kubernetes dns와 다르게 Public 도메인서버를 통해 K8S서비스 배포 시 DNS Record를 자동으로 관리해주는 오픈소스이다.
- 조금 더 구체적으로 말하면 K8S 서비스를 생성/삭제할 때 Domain을 설정하면 자동으로 도메인 서버에 A Record를 생성/삭제해준다.
- AWS Route53이나 Google Cloud DNS, AzureDNS 등이 지원된다.
- github : https://github.com/kubernetes-sigs/external-dns
해당 ExternalDNS에서 Route53에 접근해서 Record를 추가/삭제할 수 있어야하므로, 아래의 IAM 권한이 추가로 필요하다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}
KOPS에서는 자동으로 ExternalDNS를 포함하고 있기 때문에, 아래의 구문을 추가하고 cluster를 업데이트 해주면된다. https://kops.sigs.k8s.io/cluster_spec/#externaldns
spec:
#### 추가 내용 ####
certManager: # certManager는 https 접속을 위한 addon이다.
enabled: true
externalDns:
provider: external-dns
###################
## cluster 업데이트
[root@kops-ec2 ~]# kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster
*********************************************************************************
A new kubernetes version is available: 1.24.11
Upgrading is recommended (try kops upgrade cluster)
## external dns pod 확인
[root@kops-ec2 ~]# kubectl get pod -n kube-system -l k8s-app=external-dns
NAME READY STATUS RESTARTS AGE
external-dns-5fcdc9b4b8-2srhg 1/1 Running 0 21m
[root@kops-ec2 ~]#
ExternalDNS 구성 완료 후 아래의 명령을 통해 DNS Record를 등록한다.
## 원하는 외부 DNS 이름으로 서비스에 주석을 추가
## 연결할 서비스 명은 mario
## ersia.net이 사용하는 Route53 도메인
## 최종으로 사용할 url은 mario.ersia.net
kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.ersia.net"
## 필요에 따라 DNS 레코드의 TTL 값을 지정할 수도 있다.
## annotation이 변경되긴하지만 TTL은 테스트 해보지 못하였다.
kubectl annotate service mario "external-dns.alpha.kubernetes.io/ttl=10"
## 도메인 확인
[root@kops-ec2 ~]# dig +short mario.ersia.net
3.34.71.129
13.209.120.254
서비스를 삭제하면 관련 Record는 자동으로 삭제된다.
실습 정리 및 후기
## 생성한 서비스 삭제
kubectl delete deploy,svc mario
## kops로 생성한 k8s cluster 삭제
kops delete cluster --yes
## kops-ec2 생성 시 사용한 cloudformation 스택 제거
## kops 사용을 위해 생성한 s3 삭제
스터디에서도 언급된 내용인데 개인적으로도 KOPS는 개발 또는 교육용으로 사용하는게 좋다고 생각된다.
AWS를 사용할 경우 운영시스템은 EKS를 쓰는게 조금 더 보안(pod 보안그룹과 같은)이나 유지보수 차원에서 유리하다고 생각한다.
KOPS를 사용해 구성할 경우 명령어 몇줄로 K8S Cluster를 빠른속도로 구성하고 삭제도 빠르게 진행할 수 있는 장점이 있었다. K8S의 다양한 구성을 사전에 테스트해보고자 하면 좋은 선택이 될 것 같다.
또한 개인적으로 이전 스터디에서 terraform 기초를 학습해서 KOPS와 Terraform을 같이 사용하는 식으로도 구성해보려고 시도했지만, KOPS 명령어로 Cluster 작업이 발생할 경우 Terraform에서의 상태관리가 깨지기 때문에 KOPS 명령어를 제대로 활용하지 못한다는 느낌이 들었다.(Terraform을 쓸 경우 굳이 KOPS를 사용해야할 이유가 없어지는 것 같다.)
참고자료
- AWS EKS vs. ECS vs. Fargate vs. kOps : https://cast.ai/blog/aws-eks-vs-ecs-vs-fargate-where-to-manage-your-kubernetes/
- 24단계 실습으로 정복하는 쿠버네티스 : http://www.yes24.com/Product/Goods/115187666
- KOPS를 사용한 Kubernetes 설치 가이드 : https://kubernetes.io/ko/docs/setup/production-environment/tools/kops/