GCE에서 셀프 관리형 Kubernetes 운영하기
Google Compute Engine(GCE)에서 직접 운영하는 셀프 관리형 Kubernetes 클러스터에 Calico 오픈 소스를 설치하는 방법을 안내해요. gcloud로 클라우드 리소스를 만들고, kubeadm으로 클러스터를 구성한 뒤 Calico를 설치하는 전 과정을 다뤄요. IP 포워딩, MTU, 라우트 제한 같은 GCE 환경 특유의 주의 사항도 함께 정리되어 있어요.
출처: 문서
본문
큰 그림
Google Compute Engine(GCE)의 셀프 관리형 Kubernetes 클러스터에서 Calico를 사용해요.
가치
GKE 같은 관리형 Kubernetes 서비스 대신 직접 Kubernetes 클러스터를 운영하면 Calico와 Kubernetes를 구성할 때 가장 큰 유연성을 얻을 수 있어요. Calico는 유연한 네트워킹 기능과 "어디서든 동작하는" 보안 적용을 결합해서, 네이티브 Linux 커널 성능과 진정한 클라우드 네이티브 확장성을 갖춘 솔루션을 제공해요.
개념
kubeadm은 Kubernetes 설치에 사용되는 클러스터 관리 도구예요.
시작하기 전에...
Google Cloud CLI 도구를 설치하고 구성하세요.
방법
GCE에서 Kubernetes를 설치하고 관리하는 방법은 여러 가지가 있어요. 대부분에게 kubeadm이 좋은 기본 선택이에요. Calico의 유연하고 강력한 네트워킹 기능을 모두 사용할 수 있기 때문이에요. 다만 여러분의 환경에는 다른 옵션이 더 잘 맞을 수도 있어요.
Calico 네트워킹과 네트워크 정책을 위한 kubeadm
클라우드 리소스 만들기
컨트롤 플레인 노드 역할을 할 VM 하나 이상과 워커 노드 하나 이상이 필요해요. (컨트롤 플레인 노드가 워커 역할까지 겸할 수도 있지만, 대부분의 경우 권장하지 않고 이 가이드에서도 다루지 않아요.) 이 VM들의 OS 요구 사항은 요구 사항 문서를 참고하세요.
다음 실습 예제는 전용 가상 프라이빗 네트워크(VPC) 위에 컨트롤 노드 하나와 워커 세 개를 만들어요. 요구 사항에 맞게 예제를 조정하세요. 클라우드 리소스 관리에는 Terraform 같은 전용 인프라 관리 도구를 고려해 보세요. (이 예제는 Kubernetes the Hard Way에서 가져와 수정했어요.)
- VPC를 만들어요.
gcloud compute networks create example-k8s --subnet-mode custom
- example-k8s VPC 네트워크에 k8s-nodes 서브넷을 만들어요.
gcloud compute networks subnets create k8s-nodes \
--network example-k8s \
--range 10.240.0.0/24
- Calico 오버레이에서 사용할 TCP, UDP, ICMP, IP in IP까지 내부 통신을 허용하는 방화벽 규칙을 만들어요.
gcloud compute firewall-rules create example-k8s-allow-internal \
--allow tcp,udp,icmp,ipip \
--network example-k8s \
--source-ranges 10.240.0.0/24
- 외부 SSH, ICMP, HTTPS를 허용하는 방화벽 규칙을 만들어요.
gcloud compute firewall-rules create example-k8s-allow-external \
--allow tcp:22,tcp:6443,icmp \
--network example-k8s \
--source-ranges 0.0.0.0/0
- 컨트롤러 VM을 만들어요.
gcloud compute instances create controller \
--async \
--boot-disk-size 200GB \
--can-ip-forward \
--image-family ubuntu-2204-lts \
--image-project ubuntu-os-cloud \
--machine-type n1-standard-2 \
--private-network-ip 10.240.0.11 \
--scopes compute-rw,storage-ro,service-management,service-control,logging-write,monitoring \
--subnet k8s-nodes \
--zone us-central1-f \
--tags example-k8s,controller
- 워커 VM 세 개를 만들어요.
for i in 0 1 2; do
gcloud compute instances create worker-${i} \
--async \
--boot-disk-size 200GB \
--can-ip-forward \
--image-family ubuntu-2204-lts \
--image-project ubuntu-os-cloud \
--machine-type n1-standard-2 \
--private-network-ip 10.240.0.2${i} \
--scopes compute-rw,storage-ro,service-management,service-control,logging-write,monitoring \
--subnet k8s-nodes \
--zone us-central1-f \
--tags example-k8s,worker
done
- 컨트롤러 VM과 각 워커 VM에 Docker를 설치해요. 각 VM에서 다음을 실행해요.
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker.service
sudo apt install -y apt-transport-https curl
Kubernetes 설치하고 클러스터 만들기
-
각 워커 노드와 컨트롤러 노드에
kubeadm,kubelet,kubectl을 설치해요(자세한 내용은 kubeadm 문서를 참고하세요).각 노드에 접속해 다음 명령을 실행해요.
curl -fsSL https://dl.k8s.io/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://pkgs.k8s.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
-
새 클러스터의 컨트롤러 노드를 만들어요.
컨트롤러 VM에 접속해 다음 명령을 실행해요.
sudo kubeadm init --pod-network-cidr 192.168.0.0/16
SECONDARY:
kubeadm init출력의 마지막 줄에는 워커를 컨트롤러에 조인시키는 명령이 들어 있어요. 이 명령은 이후 단계에서 쓰니 잘 기록해 두세요.명령은 대체로 다음과 비슷하게 생겼어요.
kubeadm join 10.240.0.11:6443 --token ar77y2.7274jxuumt8vhhvw \ --discovery-token-ca-cert-hash sha256:d913182b646660c7be5bd76c1b9e9fa3e613ed9c18ef36ad0d475f8f7c887331
-
Ubuntu 사용자를 위해 kubectl을 설정해요.
컨트롤러 VM에 접속해 다음 명령을 실행해요.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 워커 노드를 컨트롤러 노드에 조인시켜요.
SECONDARY: 앞 단계에서 복사해 둔 명령을 사용하세요.
각 워커에서 이 명령을 실행해요. root로 실행하도록 앞에 sudo를 붙여요. 대체로 다음과 비슷하게 생겼어요.
sudo kubeadm join 10.240.0.11:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
- 모든 노드가 조인됐는지 확인해요.
컨트롤러 노드에서 이 명령을 실행해요.
kubectl get nodes
다음과 비슷한 출력이 나와야 해요.
NAME STATUS ROLES AGE VERSION
controller NotReady master 5m49s v1.17.2
worker-0 NotReady <none> 3m38s v1.17.2
worker-1 NotReady <none> 3m7s v1.17.2
worker-2 NotReady <none> 5s v1.17.2
Calico 설치하기
- 컨트롤러에서 Calico 커스텀 리소스 정의를 설치해요.
클러스터가 Kubernetes 1.36 이상 기반이라면 다음을 실행해요.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org.yaml
클러스터가 Kubernetes 1.34 또는 1.35 기반이라면 다음을 실행해요.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/v3_projectcalico_org-v1beta1.yaml
- Tigera Operator를 설치해요.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/tigera-operator.yaml
- Calico를 구성하는 데 필요한 커스텀 리소스를 내려받아요.
curl https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/custom-resources.yaml -O
- Calico 설치를 커스터마이즈하고 싶다면 내려받은 custom-resources.yaml 매니페스트를 수정해요. 그다음 Calico를 설치하도록 매니페스트를 생성해요.
kubectl create -f custom-resources.yaml
여기서 얻게 되는 것의 세부 내용이에요.
| Policy | IPAM | CNI | Overlay | Routing | Datastore |
|---|---|---|---|---|---|
| Calico | Calico | Calico | IPIP | BGP | Kubernetes |
?
다른 도구와 옵션
Terraform
위 절차 대부분이 클러스터용 Google Cloud 리소스를 프로비저닝하고 Kubernetes를 설치하는 내용이라는 걸 눈치챘을 수도 있어요. Terraform은 선언적 구성으로 인프라 프로비저닝을 자동화하는 도구예요. Terraform "provisioner"를 사용하면 Docker, kubeadm, Kubernetes 설치까지 자동화할 수도 있어요. 자세한 내용은 Terraform 문서를 참고하세요.
Kubespray
Kubespray는 Google Compute Engine을 포함한 여러 클라우드를 지원하는 Kubernetes 클러스터 프로비저닝/관리 도구예요. Calico가 기본 네트워킹 제공자이거나, kube_network_plugin 변수를 calico로 설정할 수 있어요. 자세한 내용은 Kubespray 문서를 참고하세요.
다음 단계
필수
권장
더 알아보기 (Learn more)
GCE에서는 노드에 IP 포워딩을 켜고 MTU와 라우트 한도를 확인하는 것이 중요해요. 이 가이드는 Kubernetes the Hard Way 절차를 기반으로 하니, 프로덕션에서는 Terraform 같은 도구로 자동화하는 걸 추천해요. 설치 후에는 네트워크 정책 시작 가이드로 Calico의 실제 동작을 체험해 보세요.