Amazon Elastic Kubernetes Service
Amazon Elastic Kubernetes Service (EKS)
Amazon EKS 관리형 Kubernetes 서비스에서 Calico를 활성화하는 방법을 안내해요. AWS VPC CNI를 그대로 두고 Calico 네트워크 정책만 추가하는 방법과, Calico 네트워킹으로 전환하는 방법 모두를 다뤄요. EKS에 내장된 Calico 지원을 활용하면 전체 Kubernetes Network Policy API를 견고하게 구현할 수 있어요.
출처: 문서
본문
큰 그림
EKS 관리형 Kubernetes 서비스에서 Calico를 활성화해요.
가치
EKS에는 Calico가 내장 지원되어, 전체 Kubernetes Network Policy API의 견고한 구현을 제공해요. Kubernetes 네트워크 정책 기능 이상을 원하는 EKS 사용자는 Calico Network Policy API를 온전히 활용할 수 있어요.
또한 기본 AWS VPC 네트워킹 대신 Calico 네트워킹을 EKS에서 사용할 수도 있는데, 이때 하부 VPC의 IP 주소를 쓸 필요가 없어요. 이렇게 하면 Calico의 유연한 IP 주소 관리 기능을 포함한 Calico 네트워킹 기능 전체를 활용할 수 있어요.
방법
Amazon VPC 네트워킹으로 EKS 설치
여러분이 얻게 되는 것의 세부 구성은 다음과 같아요.
| 정책 | IPAM | CNI | 오버레이 | 라우팅 | 데이터스토어 |
|---|---|---|---|---|---|
| Calico | AWS | AWS | 아니요 | VPC Native | Kubernetes |
?
SECONDARY: Amazon VPC CNI 플러그인을 사용할 때, Calico는
ENABLE_V4_EGRESS가true로 설정된 IPv6 파드에 대한 네트워크 정책 적용을 지원하지 않아요.
-
먼저 Amazon EKS 클러스터를 만들어요.
eksctl create cluster --name <my-calico-cluster>AWS VPC CNI의 네트워크 정책은 Calico와 충돌하므로 활성화하지 마세요.
-
AWS VPC CNI가 파드에 자기 IP를 어노테이션하도록 구성해요. 권한 오류를 피하려면
aws-node데몬셋에 "patch" 권한을 부여해야 한다는 요구 사항을 유의해요. 이 설정 덕분에 파드 IP가 AWS VPC CNI에서 Calico로 빠르게 전파돼요.cat << EOF > append.yaml - apiGroups: - "" resources: - pods verbs: - patch EOF kubectl apply -f <(cat <(kubectl get clusterrole aws-node -o yaml) append.yaml) kubectl set env -n kube-system daemonset/aws-node ANNOTATE_POD_IP=true -
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 설치를 구성해요.
kubectl create -f - <<EOF apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: kubernetesProvider: EKS cni: type: AmazonVPC calicoNetwork: bgp: Disabled --- # This section configures the Calico API server. # For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer apiVersion: operator.tigera.io/v1 kind: APIServer metadata: name: default spec: {} --- # Configures the Calico Goldmane flow aggregator. apiVersion: operator.tigera.io/v1 kind: Goldmane metadata: name: default --- # Configures the Calico Whisker observability UI. apiVersion: operator.tigera.io/v1 kind: Whisker metadata: name: default EOF -
STATUS를 확인해 설치를 검증해요. 클러스터 노드들이Ready상태여야 해요.kubectl get nodes -o wide다음과 비슷한 출력이 나와야 해요.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME <your-hostname> Ready master 52m v1.12.2 10.128.0.28 <none> Ubuntu 18.04.1 LTS 4.15.0-1023-gcp docker://18.6.1
Calico 네트워킹으로 EKS 설치
여러분이 얻게 되는 것의 세부 구성은 다음과 같아요.
| 정책 | IPAM | CNI | 오버레이 | 라우팅 | 데이터스토어 |
|---|---|---|---|---|---|
| Calico | Calico | Calico | VXLAN | Calico | Kubernetes |
?
SECONDARY: 현재로서는 EKS 컨트롤 플레인 노드에 Calico 네트워킹을 설치할 수 없어요. 그 결과 컨트롤 플레인 노드는 Calico 파드로 네트워크 연결을 시작할 수 없어요. (이것은 EKS 커스텀 네트워킹 지원의 일반적인 한계이지 Calico 고유의 문제는 아니에요.) 우회 방법으로, admission controller webhook 구현체처럼 컨트롤 플레인 노드가 자신에게 연결해야 하는 신뢰된 파드는 pod spec에
hostNetwork:true를 포함할 수 있어요. 이 설정에 대한 자세한 내용은 Kubernetes API pod spec 정의를 참고하세요.
이 안내에서는 eksctl로 클러스터를 프로비저닝해요. 다만 Amazon EKS 시작하기의 어떤 방법을 사용해도 돼요.
시작하기 전에 필요한 사전 요구 사항을 내려받고 구성했는지 확인해요.
-
먼저 노드 없이 Amazon EKS 클러스터를 만들어요.
eksctl create cluster --name my-calico-cluster --without-nodegroup -
이 클러스터는 네트워킹에 Calico를 사용할 거라서, 파드용 AWS VPC 네트워킹을 비활성화하도록
aws-node데몬셋을 삭제해야 해요.kubectl delete daemonset -n kube-system aws-node -
이제 클러스터 구성이 끝났으니 Calico를 설치할 수 있어요.
Tab: Operator
-
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 설치를 구성해요.
kubectl create -f - <<EOF apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: kubernetesProvider: EKS cni: type: Calico calicoNetwork: bgp: Disabled --- # This section configures the Calico API server. # For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer apiVersion: operator.tigera.io/v1 kind: APIServer metadata: name: default spec: {} --- # Configures the Calico Goldmane flow aggregator. apiVersion: operator.tigera.io/v1 kind: Goldmane metadata: name: default --- # Configures the Calico Whisker observability UI. apiVersion: operator.tigera.io/v1 kind: Whisker metadata: name: default EOF -
마지막으로 클러스터에 노드를 추가해요.
eksctl create nodegroup --cluster <my-calico-cluster> --node-type t3.medium --max-pods-per-node 100
Tab: Manifest
-
Calico 매니페스트를 설치해요.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/calico-vxlan.yaml -
AWS src/dst 검사를 비활성화하도록 Calico를 구성해요.
kubectl -n kube-system set env daemonset/calico-node FELIX_AWSSRCDSTCHECK=Disable -
마지막으로 클러스터에 노드를 추가해요.
eksctl create nodegroup --cluster my-calico-cluster --node-type t3.medium --max-pods-per-node 100
Tab: Helm
-
Helm 리포지터리에 Calico를 추가해요.
helm repo add projectcalico https://docs.tigera.io/calico/charts -
이미 Calico를 추가했다면, 최신 릴리스 버전을 받도록 업데이트해요.
helm repo update -
tigera-operator네임스페이스를 만들어요.kubectl create namespace tigera-operator -
Calico 오퍼레이터와 커스텀 리소스 정의의 v3.33.0 버전을 설치해요.
helm install calico projectcalico/tigera-operator --version v3.33.0 --namespace tigera-operator -
CNI 타입을
Calico값으로 패치해요.kubectl patch installation default --type='json' -p='[{"op": "replace", "path": "/spec/cni", "value": {"type":"Calico"} }]' -
마지막으로 클러스터에 노드를 추가해요.
eksctl create nodegroup --cluster my-calico-cluster --node-type t3.medium --max-pods-per-node 100
SUCCESS: 위의
--max-pods-per-node옵션이 없으면 EKS가 노드 타입 기준 파드 수를 제한해요. 노드 그룹 옵션 전체 목록은eksctl create nodegroup --help를 참고하세요.
다음 단계
필수
추천
더 알아보기 (Learn more)
EKS에서는 AWS VPC CNI를 유지한 채 정책 기능만 더하느냐, Calico 네트워킹으로 완전히 교체하느냐 두 갈래가 있어요. 전자는 AWS VPC CNI의 네트워크 정책 기능과 충돌하지 않도록 주의하고, 후자는 aws-node 데몬셋 삭제와 --max-pods-per-node 옵션이 핵심이에요.