Kops로 Cilium 설치하기

Kops로 Cilium 설치하기

kops 1.9 릴리스부터 Cilium을 kops로 배포한 클러스터의 CNI 플러그인으로 연결할 수 있어요. 이 가이드는 AWS에서 kops와 CNI 플러그인으로 Cilium을 사용해 Kubernetes 클러스터를 만드는 단계를 다뤄요.

출처: Installation using Kops

본문

kops 1.9 릴리스부터 Cilium을 kops로 배포한 클러스터에 CNI 플러그인으로 연결할 수 있어요. 이 가이드는 AWS에서 kops와 CNI 플러그인으로 쓰는 Cilium으로 Kubernetes 클러스터를 만드는 단계를 안내해요. 참고로 kops 배포는 기본적으로 AutoScaling, Volumes, VPC 등 여러 AWS 배포 기능을 자동화해요.

Kops는 Kubernetes Without kube-proxy, AWS ENI, Cilium 전용 etcd 클러스터 등 Cilium의 여러 즉시 사용 가능한 구성을 제공해요. 이 가이드는 기본 설정만 다룰게요.

전제조건

  • aws cli
  • kubectl
  • 다음 권한이 있는 aws 계정:
  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess
  • AmazonS3FullAccess
  • IAMFullAccess
  • AmazonVPCFullAccess

kops 설치하기

curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops
brew update && brew install kops

IAM 그룹과 사용자 설정하기

모든 전제조건을 갖췄다면 다음 명령으로 kops 사용자와 그룹을 생성해요.

$ # Create IAM group named kops and grant access
$ aws iam create-group --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops
$ aws iam create-user --user-name kops
$ aws iam add-user-to-group --user-name kops --group-name kops
$ aws iam create-access-key --user-name kops

kops는 클러스터의 상태와 표현을 저장할 전용 S3 버킷을 요구해요. 버킷 이름을 바꾸고 자신만의 고유한 버킷 이름을 제공해야 해요(예를 들어 FQDN을 뒤집고 클러스터에 대한 짧은 설명을 붙인 형태). 또한 클러스터를 배포할 리전을 사용해야 해요.

$ aws s3api create-bucket --bucket prefix-example-com-state-store --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2
$ export KOPS_STATE_STORE=s3://prefix-example-com-state-store

위 단계는 동작하는 클러스터를 설치하기에 충분해요. 더 자세한 설정 안내는 kops aws documentation을 참고하세요.

Cilium 전제조건

  • System Requirements, 특히 Linux 커널과 키-값 저장소 버전을 충족하는지 확인하세요.

기본 AMI는 Cilium이 요구하는 최소 커널 버전을 충족하며, 이 가이드에서 그 AMI를 사용할 거예요.

클러스터 생성하기

  • 마스터와 워커 노드를 만들려면 --master-zones와 --zones를 지정해야 해요. 마스터 존의 수는 HA를 위해 홀수(1, 3, …)여야 해요. 간단하게 하려면 리전 1개만 써도 돼요.
  • 이 가이드를 따라갈 때 간단하게 하기 위해 gossip 기반 클러스터를 사용할게요. 즉 hosted zone을 미리 만들 필요가 없어요. gossip 프로토콜을 쓰려면 NAME 변수가 k8s.local로 끝나야 해요. 같은 kops 사용자로 여러 클러스터를 만든다면 com-company-emailid- 같은 접두사를 붙여 클러스터 이름을 고유하게 만드세요.
$ export NAME=com-company-emailid-cilium.k8s.local
$ kops create cluster --state=${KOPS_STATE_STORE} --node-count 3 --topology private --master-zones us-west-2a,us-west-2b,us-west-2c --zones us-west-2a,us-west-2b,us-west-2c --networking cilium --cloud-labels "Team=Dev,Owner=Admin" ${NAME} --yes

ssh 공개/개인 키 쌍을 만들라는 메시지가 나올 수 있어요.

$ ssh-keygen

(Deleting a Cluster를 참고하세요)

설치 검증하기

최신 버전의 Cilium CLI를 설치해요. Cilium CLI는 Cilium 설치, 설치 상태 점검, 다양한 기능(예: clustermesh, Hubble) 활성화/비활성화에 사용할 수 있어요.

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "arm64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-darwin-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}

전체 releases 페이지를 참고하세요.

Cilium이 제대로 설치됐는지 확인하려면 다음을 실행해요.

$ cilium status --wait
   /¯\
/¯\__/¯\    Cilium:         OK
\__/¯\__/    Operator:       OK
/¯\__/¯\    Hubble:         disabled
\__/¯\__/    ClusterMesh:    disabled
   \__/

DaemonSet         cilium             Desired: 2, Ready: 2/2, Available: 2/2
Deployment        cilium-operator    Desired: 2, Ready: 2/2, Available: 2/2
Containers:       cilium-operator    Running: 2
                  cilium             Running: 2
Image versions    cilium             quay.io/cilium/cilium:v1.9.5: 2
                  cilium-operator    quay.io/cilium/operator-generic:v1.9.5: 2

클러스터가 올바른 네트워크 연결을 갖췄는지 확인하려면 다음 명령을 실행해요.

$ cilium connectivity test
ℹ️  Monitor aggregation detected, will skip some flow validation steps
✨ [k8s-cluster] Creating namespace for connectivity check...
(...)
---------------------------------------------------------------------------------------------------------------------
📋 Test Report
---------------------------------------------------------------------------------------------------------------------
✅ 69/69 tests successful (0 warnings)

참고

연결성 테스트는 Pod 중 하나에 열린 파일이 너무 많아 배포에 실패할 수 있어요. 이런 오류가 보이면 호스트 머신의 inotify 리소스 한도를 늘리세요 (Pod errors due to "too many open files").

축하해요! 이제 Cilium이 동작하는 완전한 Kubernetes 클러스터가 갖춰졌어요. 🎉

Cilium과 필요한 컴포넌트들이 설치되는 과정을 다음과 같이 모니터링할 수 있어요.

$ kubectl -n kube-system get pods --watch
NAME                                    READY   STATUS              RESTARTS   AGE
cilium-operator-cb4578bc5-q52qk         0/1     Pending             0          8s
cilium-s8w5m                            0/1     PodInitializing     0          7s
coredns-86c58d9df4-4g7dd                0/1     ContainerCreating   0          8m57s
coredns-86c58d9df4-4l6b2                0/1     ContainerCreating   0          8m57s

모든 컴포넌트가 뜨기까지 몇 분이 걸릴 수 있어요.

cilium-operator-cb4578bc5-q52qk         1/1     Running   0          4m13s
cilium-s8w5m                            1/1     Running   0          4m12s
coredns-86c58d9df4-4g7dd                1/1     Running   0          13m
coredns-86c58d9df4-4l6b2                1/1     Running   0          13m

Pod 사이의 연결을 테스트하려면 "connectivity-check"를 배포할 수 있어요. 이를 위해 별도 네임스페이스를 만드는 것을 권장해요.

kubectl create ns cilium-test

다음 명령으로 체크를 배포해요.

kubectl apply -n cilium-test -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/connectivity-check/connectivity-check.yaml

이 단계는 다양한 연결 경로를 사용해 서로 연결되는 일련의 deployment들을 배포해요. 연결 경로에는 서비스 로드밸런싱 유무와 다양한 네트워크 정책 조합이 포함돼요. Pod 이름은 연결 변형(variant)을 나타내고, readiness와 liveness 게이트는 테스트의 성공 여부를 나타내요.

$ kubectl get pods -n cilium-test
NAME                                                     READY   STATUS    RESTARTS   AGE
echo-a-76c5d9bd76-q8d99                                  1/1     Running   0          66s
echo-b-795c4b4f76-9wrrx                                  1/1     Running   0          66s
echo-b-host-6b7fc94b7c-xtsff                             1/1     Running   0          66s
host-to-b-multi-node-clusterip-85476cd779-bpg4b          1/1     Running   0          66s
host-to-b-multi-node-headless-dc6c44cb5-8jdz8            1/1     Running   0          65s
pod-to-a-79546bc469-rl2qq                                1/1     Running   0          66s
pod-to-a-allowed-cnp-58b7f7fb8f-lkq7p                    1/1     Running   0          66s
pod-to-a-denied-cnp-6967cb6f7f-7h9fn                     1/1     Running   0          66s
pod-to-b-intra-node-nodeport-9b487cf89-6ptrt             1/1     Running   0          65s
pod-to-b-multi-node-clusterip-7db5dfdcf7-jkjpw           1/1     Running   0          66s
pod-to-b-multi-node-headless-7d44b85d69-mtscc            1/1     Running   0          66s
pod-to-b-multi-node-nodeport-7ffc76db7c-rrw82            1/1     Running   0          65s
pod-to-external-1111-d56f47579-d79dz                     1/1     Running   0          66s
pod-to-external-fqdn-allow-google-cnp-78986f4bcf-btjn7   1/1     Running   0          66s

참고

단일 노드 클러스터에 연결성 체크를 배포하면 멀티노드 기능을 확인하는 Pod들은 Pending 상태로 남아요. 이는 해당 Pod들이 성공적으로 스케줄되려면 노드가 최소 2개 필요하기 때문이에요. 정상적인 현상이에요.

테스트가 끝나면 cilium-test 네임스페이스를 삭제해요.

kubectl delete ns cilium-test

클러스터 삭제하기

AWS에서 kops 클러스터 생성으로 만들어진 의존성과 기타 배포 기능을 되돌리려면 --yes 파라미터로 kops를 사용해 클러스터를 즉시 삭제해요.

$ kops delete cluster ${NAME} --yes

Kops와 Cilium 사용에 대한 추가 자료

부록: 클러스터 생성에 사용된 kops 플래그 세부사항

다음 섹션은 클러스터 생성 명령에 사용된 모든 플래그를 설명해요.

  • --state=${KOPS_STATE_STORE} : KOPS는 S3 버킷을 사용해 클러스터의 상태와 표현을 저장해요.
  • --node-count 3 : Kubernetes 클러스터의 워커 노드 수.
  • --topology private : 클러스터가 private 토폴로지로 생성돼요. 즉 모든 마스터/노드가 VPC의 private 서브넷에서 실행된다는 뜻이에요.
  • --master-zones eu-west-1a,eu-west-1b,eu-west-1c : 3개의 존은 서로 다른 가용 영역에 속하며 마스터 노드의 HA를 보장해요.
  • --zones eu-west-1a,eu-west-1b,eu-west-1c : 워커 노드가 배포될 존.
  • --networking cilium : 사용할 네트워킹 CNI 플러그인 - cilium. CRD 대신 전용 etcd 클러스터를 키/값 저장소로 사용하는 cilium-etcd도 쓸 수 있어요.
  • --cloud-labels "Team=Dev,Owner=Admin" : 인스턴스에 적용될 클러스터 레이블.
  • ${NAME} : 클러스터 이름. gossip 기반 클러스터라면 이름이 k8s.local로 끝나도록 해요.

더 알아보기 (Learn more)