IT/Kubernetes

[Study][Production_Kubernetes] KOPS를 사용한 Kubernetes 구성

Ersia 2023. 3. 12. 00:34

[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의 몇가지 특징을 확인할 수 있었는데 아래와 같다.

 

 

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

수행 후 Route53 도메인에 Record 등록을 확인

서비스를 삭제하면 관련 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를 사용해야할 이유가 없어지는 것 같다.)

 

 

참고자료