[k8s] Kubernetes Operations (kOps) Install in AWS

Hayley Shim
techblog-hayleyshim
7 min readMar 5, 2023

안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를 하며 어떻게 k8s에 적용할지 고민하며 정리해봤습니다.

kOps는 클라우드 플랫폼(aws, gcp, azure 등)에서 쉽게 k8s 를 설치할 수 있도록 도와주는 도구입니다.

kOps 설치

[사전 작업]

  • kubectl 설치
  • 반드시 64-bit (AMD64 그리고 Intel 64)디바이스 아키텍쳐에kops설치
  • AWS 계정이 있고 IAM 키를 생성하고 구성. IAM 사용자는 적절한 권한이 필요
  • 클러스터에 사용할 route53 domain 생성 — kops는 클러스터 내부와 외부 모두에서 검색을 위해 DNS을 사용하기에 클라이언트에서 쿠버네티스 API 서버에 연결할 수 있음

[설치 참고]

[kOps 설치 확인]

  • 아래와 같이 node IP, pod IP 확인
  • Hosted Zone 에 추가된 3개 A 레코드 확인
Route53에 kops 관련 A 레코드 3개가 추가됨

[DNS 관련 이슈]

Error: error doing DNS lookup for NS records for “XXXXXXXX.com”: lookup XXXXXXX.com on 10.0.0.2:53: no such host

  • Hosted Zone에 생성된 NS를 등록된 도메인의 NS 서버에 등록해줄 것
  • NS 서버 등록 시, 3–4시간이 걸리므로 기다립니다

Error: Unable to connect to the server: dial tcp: lookup api.pkos.XXXX.link on 168.126.63.1:53: no such host 발생

  • 시간이 지나고 나니 정상적으로 동작. Route 53에 등록되는데 시간이 걸렸던 것으로 추정됩니다
# kops 클러스터 정보 확인
$ kops get cluster
NAME CLOUD ZONES
wellbeconnected.com aws ap-northeast-2a,ap-northeast-2c

$ kops get cluster -o yaml
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
...

# 인스턴스그룹 정보 확인
$ kops get ig
NAME ROLE MACHINETYPE MIN MAX ZONES
master-ap-northeast-2a Master 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 get ig -o yaml
...

# 인스턴스 정보 확인
$ kops get instances
D NODE-NAME STATUS ROLES STATE INTERNAL-IP INSTANCE-GROUP MACHINE-TYPE
i-02faf2526767e7030 i-02faf2526767e7030 UpToDate node 172.30.39.139 nodes-ap-northeast-2a.wellbeconnected.com t3.medium
i-07b0409d7d5f2caed i-07b0409d7d5f2caed UpToDate node 172.30.67.64 nodes-ap-northeast-2c.wellbeconnected.com t3.medium
i-0fe84c07d0e80bd1d i-0fe84c07d0e80bd1d UpToDate master 172.30.47.89 master-ap-northeast-2a.masters.wellbeconnected.com t3.medium


# 클러스터 정보 확인
$ kubectl cluster-info
Kubernetes control plane is running at https://api.wellbeconnected.com
CoreDNS is running at https://api.wellbeconnected.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ kubectl cluster-info dump
...


# CRI 컨테이너 런타임 확인
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
i-02faf2526767e7030 Ready node 32m v1.24.10 172.30.39.139 3.35.174.114 Ubuntu 20.04.5 LTS 5.15.0-1028-aws containerd://1.6.10
i-07b0409d7d5f2caed Ready node 32m v1.24.10 172.30.67.64 3.34.48.149 Ubuntu 20.04.5 LTS 5.15.0-1028-aws containerd://1.6.10
i-0fe84c07d0e80bd1d Ready control-plane 34m v1.24.10 172.30.47.89 3.36.114.106 Ubuntu 20.04.5 LTS 5.15.0-1028-aws containerd://1.6.10


# volume(sc)
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
default kubernetes.io/aws-ebs Delete Immediate false 35m
gp2 kubernetes.io/aws-ebs Delete Immediate false 35m
kops-csi-1-21 (default) ebs.csi.aws.com Delete WaitForFirstConsumer true 35m
kops-ssd-1-17 kubernetes.io/aws-ebs Delete WaitForFirstConsumer true 35m

$ kubectl get sc kops-csi-1-21 -o jsonpath={.parameters} ;echo
{"encrypted":"true","type":"gp3"}

$ kubectl get sc kops-ssd-1-17 -o jsonpath={.parameters} ;echo
{"encrypted":"true","type":"gp2"}

# pod ip 확인
$ kubectl get pod -n kube-system

$ kubectl get pod -n kube-system -owide

--

--