Kubespray로 Cilium 설치하기

Kubespray로 Cilium 설치하기

이 가이드는 Kubespray를 사용해 Cilium을 CNI로 실행하는 AWS Kubernetes 클러스터를 만드는 방법을 다뤄요. Kubespray v2.6.0과 최신 Cilium 버전을 사용해요.

출처: Installation using Kubespray

본문

이 가이드는 Cilium을 CNI로 실행하는 AWS Kubernetes 클러스터를 만들기 위해 Kubespray를 사용하는 방법을 안내해요. 이 가이드는 다음을 사용해요.

Kubespray 전제조건과 Cilium System Requirements를 확인하세요.

Kubespray 설치하기

$ git clone --branch v2.6.0 https://github.com/kubernetes-sigs/kubespray

requirements.txt에서 의존성을 설치해요.

$ cd kubespray
$ sudo pip install -r requirements.txt

인프라 프로비저닝

AWS 인프라 프로비저닝에는 Terraform을 사용할게요.

AWS 자격 증명 구성

AWS 자격 증명 변수를 export 해요.

export AWS_ACCESS_KEY_ID="www"
export AWS_SECRET_ACCESS_KEY ="xxx"
export AWS_SSH_KEY_NAME="yyy"
export AWS_DEFAULT_REGION="zzz"

Terraform 변수 구성

Kubernetes 클러스터에 필요한 인프라를 지정하는 것부터 시작할게요.

$ cd contrib/terraform/aws
$ cp contrib/terraform/aws/terraform.tfvars.example terraform.tfvars

파일을 열고 기본값, 특히 master, etcd, worker 노드 수를 바꿔요. 고가용성이 필요 없는 배포라면 master와 etcd 수를 1로 바꿀 수 있어요. 기본적으로 이 튜토리얼은 다음을 생성해요.

  • 공용과 사설 서브넷 2개가 있는 VPC
  • 공용 서브넷의 Bastion Host와 NAT Gateway
  • 사설 서브넷의 각 3개(master, etcd, worker 노드)
  • 인터넷에서 Kubernetes API에 접근하기 위한 공용 서브넷의 AWS ELB
  • CoreOS를 기본 이미지로 사용하는 Terraform 스크립트

terraform.tfvars 파일 예시:

#Global Vars
aws_cluster_name = "kubespray"

#VPC Vars
aws_vpc_cidr_block = "XXX.XXX.192.0/18"
aws_cidr_subnets_private = ["XXX.XXX.192.0/20","XXX.XXX.208.0/20"]
aws_cidr_subnets_public = ["XXX.XXX.224.0/20","XXX.XXX.240.0/20"]

#Bastion Host
aws_bastion_size = "t2.medium"

#Kubernetes Cluster

aws_kube_master_num = 3
aws_kube_master_size = "t2.medium"

aws_etcd_num = 3
aws_etcd_size = "t2.medium"

aws_kube_worker_num = 3
aws_kube_worker_size = "t2.medium"

#Settings AWS ELB

aws_elb_api_port = 6443
k8s_secure_api_port = 6443
kube_insecure_apiserver_address = "0.0.0.0"

구성 적용하기

terraform init로 다음 모듈을 초기화해요.

  • module.aws-vpc
  • module.aws-elb
  • module.aws-iam
$ terraform init

초기화가 끝나면 다음을 실행해요.

$ terraform plan -out=aws_kubespray_plan

그러면 AWS에 생성될 인프라의 실행 계획을 나타내는 aws_kubespray_plan 파일이 생성돼요. 적용하려면 다음을 실행해요.

$ terraform init
$ terraform apply "aws_kubespray_plan"

Terraform은 inventory/hosts에 Ansible Inventory 파일을 자동으로 생성해요.

Cilium을 CNI로 사용하는 Kubernetes 클러스터 설치하기

Kubespray는 프로비저닝과 오케스트레이션의 기반으로 Ansible을 사용해요. 인프라가 생성되면 Ansible 플레이북을 실행해 Kubernetes와 필요한 모든 의존성을 설치할 수 있어요. kubespray 클론 저장소에서 아래 명령을 실행하되, ansible_ssh_private_key_file=<path to EC2 SSH private key file>에 AWS EC2 ssh 개인 키 파일의 올바른 경로를 제공하세요.

ansible-playbook 명령을 실행할 때 변수를 전달해 최신 Cilium 릴리스 버전을 사용하는 것을 권장해요. 예를 들어 아래 명령에 -e cilium_version=v1.11.0 플래그를 추가하면 돼요.

$ ansible-playbook -i ./inventory/hosts ./cluster.yml -e ansible_user=core -e bootstrap_os=coreos -e kube_network_plugin=cilium -b --become-user=root --flush-cache  -e ansible_ssh_private_key_file=<path to EC2 SSH private key file>

Kubernetes 클러스터 구성을 직접 설정하고 싶다면 샘플 inventory를 복사하는 것을 고려해 보세요. 그런 다음 group_vars 디렉터리의 관련 파일에서 변수를 편집할 수 있어요.

$ cp -r inventory/sample inventory/my-inventory
$ cp ./inventory/hosts ./inventory/my-inventory/hosts
$ echo 'cilium_version: "v1.11.0"' >> ./inventory/my-inventory/group_vars/k8s_cluster/k8s-net-cilium.yml
$ ansible-playbook -i ./inventory/my-inventory/hosts ./cluster.yml -e ansible_user=core -e bootstrap_os=coreos -e kube_network_plugin=cilium -b --become-user=root --flush-cache -e ansible_ssh_private_key_file=<path to EC2 SSH private key file>

클러스터 검증

클러스터가 성공적으로 생성됐는지 확인하려면 core 사용자로 bastion 호스트에 ssh 접속해요.

$ # Get information about the basiton host
$ cat ssh-bastion.conf
$ ssh -i ~/path/to/ec2-key-file.pem core@public_ip_of_bastion_host

bastion 호스트에서 아래 명령을 실행해요. bastion 호스트에 kubectl이 설치되어 있지 않다면 master 노드에 로그인해 아래 명령을 테스트할 수 있어요. master 노드에 접근하려면 개인 키를 bastion 호스트로 복사해야 할 수 있어요.

설치 검증하기

최신 버전의 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

클러스터 삭제하기

$ cd contrib/terraform/aws
$ terraform destroy

더 알아보기 (Learn more)