Calico 구성 사용자 정의
온프레미스 환경에 Calico를 설치하기 전에 흔히 쓰는 설정을 바꾸는 방법을 설명해요. pod IP 대역, BGP, MTU 같은 Installation 리소스 필드를 다루죠. operator 설치와 매니페스트 설치 각각의 커스터마이징 절차를 나눠서 안내해요.
출처: 문서
본문
큰 그림
Calico 설치에서 자주 쓰는 커스터마이징을 수행해요.
개념
Calico operator
Calico는 설치, 업그레이드, 클러스터 전체 수명 주기를 관리하는 operator가 설치해요. operator는 Deployment 형태로 클러스터에 직접 설치되고, 하나 이상의 커스텀 쿠버네티스 API 리소스로 구성돼요.
Calico 매니페스트
Calico는 operator 대신 원시 매니페스트로 설치할 수도 있어요. 매니페스트에는 쿠버네티스 클러스터의 각 노드에 Calico를 설치하는 데 필요한 리소스가 담겨 있어요. 매니페스트는 operator처럼 Calico 수명 주기를 자동으로 관리하지 못하기 때문에 권장하지 않아요. 다만 기반이 되는 쿠버네티스 리소스를 아주 특수하게 수정해야 하는 클러스터에는 유용할 수 있어요.
방법
Tab: Operator
operator 설치 커스터마이징에 대해
operator 설치는 특정 쿠버네티스 API 세트에서 구성을 읽어요. 이 API들은 operator.tigera.io/v1 API 그룹에 속하며 tigera-operator.yaml의 일부로 클러스터에 설치돼요.
- Installation: 이름이 "default"인 싱글턴 리소스로, Calico 클러스터의 공통 설치 파라미터를 구성해요.
- APIServer: 이름이 "default"인 싱글턴 리소스로, Calico API 서버 익스텐션 설치를 구성해요.
pod IP 대역 구성
대부분의 환경에서는 Calico가 올바른 pod IP 대역을 자동으로 감지하거나, 클러스터에서 아직 사용되지 않는 대역을 골라요.
특정 pod IP 대역을 지정하려면 Installation API 리소스의 spec.calicoNetwork.ipPools 배열을 수정하면 돼요.
kind: Installation
apiVersion: operator.tigera.io/v1
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- cidr: 198.51.100.0/24
:::
VXLAN 사용
클러스터에서 VXLAN을 활성화하려면 IPv4 풀에 이 옵션을 설정해요. spec.calicoNetwork.bgp 필드로 BGP를 끌 수도 있어요.
kind: Installation
apiVersion: operator.tigera.io/v1
metadata:
name: default
spec:
calicoNetwork:
bgp: Disabled
ipPools:
- cidr: 198.51.100.0/24
encapsulation: VXLAN
Tab: Manifest
Calico 배포를 쉽게 하도록 여러 매니페스트를 제공해요. 적용하기 전에 매니페스트를 수정할 수도 있고, 설정을 바꾸기 위해 매니페스트를 수정한 뒤 다시 적용할 수도 있어요.
Calico 매니페스트 커스터마이징에 대해
각 매니페스트에는 쿠버네티스 클러스터의 각 노드에 Calico를 설치하는 데 필요한 리소스가 모두 들어 있어요.
매니페스트는 다음 쿠버네티스 리소스를 설치해요:
- DaemonSet으로 각 호스트에
calico/node컨테이너를 설치해요. - DaemonSet으로 각 호스트에 Calico CNI 바이너리와 네트워크 구성을 설치해요.
calico/kube-controllers를 deployment로 실행해요.- etcd TLS 자산을 선택적으로 제공할 수 있게 해 주는
calico-etcd-secrets시크릿. - 설치 구성 파라미터를 담고 있는
calico-configConfigMap.
이어지는 섹션에서 구성 가능한 파라미터를 더 자세히 다뤄요.
pod IP 대역 구성
Calico IPAM은 IP 풀에서 IP 주소를 할당해요.
pod에 사용되는 기본 IP 대역을 바꾸려면 calico.yaml 매니페스트의 CALICO_IPV4POOL_CIDR 부분을 수정하세요. 자세한 내용은 calico/node 구성을 참고하세요.
IP-in-IP 구성
매니페스트는 기본적으로 서브넷 간 IP-in-IP 캡슐화를 활성화해요. 다음과 같은 상황에서는 IP-in-IP 캡슐화를 끄고 싶어하는 사용자가 많아요.
- 클러스터가 제대로 구성된 AWS VPC에서 실행 중인 경우
- 모든 쿠버네티스 노드가 같은 레이어 2 네트워크에 연결된 경우
- BGP 피어링을 사용해 pod IP 주소를 기반 인프라에 알리려는 경우
IP-in-IP 캡슐화를 비활성화하려면 매니페스트의 CALICO_IPV4POOL_IPIP 부분을 수정하세요. 자세한 내용은 calico/node 구성을 참고하세요.
IP-in-IP에서 VXLAN으로 전환
기본적으로 Calico 매니페스트는 IP-in-IP 캡슐화를 활성화해요. Azure처럼 IP-in-IP를 막는 네트워크에 있다면 Calico의 VXLAN 캡슐화 모드로 전환하고 싶을 거예요. 설치 시점에 이렇게 하면(VXLAN으로 기본 IP 풀을 만들어서 나중에 IP-in-IP 구성을 되돌릴 필요가 없어요):
-
Calico for policy and networking 매니페스트 중 하나로 시작해요.
-
환경 변수 이름
CALICO_IPV4POOL_IPIP를CALICO_IPV4POOL_VXLAN으로 바꿔요. 새 변수의 값은 "Always"로 그대로 둬요. -
선택 사항으로, (VXLAN만 사용하는 클러스터라면 리소스를 아끼려고) Calico의 BGP 기반 네트워킹을 완전히 끌 수 있어요:
calico_backend: "bird"를calico_backend: "vxlan"으로 바꿔요. 이러면 BIRD가 비활성화돼요.- calico/node readiness/liveness 체크에서
- -bird-ready와- -bird-live줄을 주석 처리해요(그렇지 않으면 BIRD를 끈 것이 readiness/liveness 체크를 매 노드에서 실패하게 만들어요):
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-live
- -bird-live
readinessProbe:
exec:
command:
- /bin/calico-node
- -bird-ready
- -felix-ready
calico/node 구성 변수와 추가 VXLAN 설정에 대한 자세한 내용은 calico/node 구성을 참고하세요.
SECONDARY:
CALICO_IPV4POOL_VXLAN환경 변수는 처음 시작된 calico/node가 기본 IP 풀을 만들 때만 효과가 있어요. 풀이 이미 만들어진 뒤에는 효과가 없어요. 설치 이후에 VXLAN 모드로 전환하려면 calicoctl로 IPPool 리소스를 수정하세요.
etcd 구성
기본적으로 이 매니페스트들은 etcd에 대한 보안 접근을 구성하지 않고, 각 호스트에서 etcd 프록시가 실행 중이라고 가정해요. 다음 구성 옵션으로 커스텀 etcd 클러스터 엔드포인트와 TLS를 지정할 수 있어요.
다음 표는 etcd를 위해 지원되는 ConfigMap 옵션을 정리한 거예요:
| Option | Description | Default |
|---|---|---|
| etcd_endpoints | Comma-delimited list of etcd endpoints to connect to. | http://127.0.0.1:2379 |
| etcd_ca | The file containing the root certificate of the CA that issued the etcd server certificate. Configures calico/node, the CNI plugin, and the Kubernetes controllers to trust the signature on the certificates provided by the etcd server. |
None |
| etcd_key | The file containing the private key of the calico/node, the CNI plugin, and the Kubernetes controllers client certificate. Enables these components to participate in mutual TLS authentication and identify themselves to the etcd server. |
None |
| etcd_cert | The file containing the client certificate issued to calico/node, the CNI plugin, and the Kubernetes controllers. Enables these components to participate in mutual TLS authentication and identify themselves to the etcd server. |
None |
TLS가 활성화된 etcd 클러스터에서 이 매니페스트를 사용하려면 다음을 수행해야 해요:
-
설치 방법에 맞는 v3.33 매니페스트를 내려받아요.
Calico for policy and networking
curl https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/calico-etcd.yaml -OCalico for policy and flannel for networking
curl https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/canal.yaml -O -
ConfigMap섹션에서etcd_ca,etcd_key,etcd_cert줄의 주석을 해제해서 다음과 같이 만들어요.etcd_ca: '/calico-secrets/etcd-ca' etcd_cert: '/calico-secrets/etcd-cert' etcd_key: '/calico-secrets/etcd-key' -
etcd_ca값이 담긴 파일,etcd_key값이 담긴 파일,etcd_cert값이 담긴 파일, 세 개를 준비했는지 확인해요. -
다음과 같은 명령으로 파일에서 개행을 제거하고 내용을 base64로 인코딩해요.
cat <file> | base64 -w 0 -
calico-etcd-secrets라는Secret에서etcd_ca,etcd_key,etcd_cert의 주석을 해제하고 맞는 base64 인코딩 값을 붙여 넣어요.apiVersion: v1 kind: Secret type: Opaque metadata: name: calico-etcd-secrets namespace: kube-system data: # Populate the following files with etcd TLS configuration if desired, but leave blank if # not using TLS for etcd. # This self-hosted install expects three files with the following names. The values # should be base64 encoded strings of the entire contents of each file. etcd-key: LS0tLS1CRUdJTiB...VZBVEUgS0VZLS0tLS0= etcd-cert: LS0tLS1...ElGSUNBVEUtLS0tLQ== etcd-ca: LS0tLS1CRUdJTiBD...JRklDQVRFLS0tLS0= -
매니페스트를 적용해요.
Calico for policy and networking
kubectl apply -f calico.yamlCalico for policy and flannel for networking
kubectl apply -f canal.yaml
인가 옵션
Calico 매니페스트는 구성 요소에 두 서비스 계정 중 하나를 부여해요. 클러스터의 인가 모드에 따라 이 서비스 계정에 필요한 권한을 연결해 주면 돼요.
기타 구성 옵션
다음 표는 나머지 지원되는 ConfigMap 옵션을 정리한 거예요.
| Option | Description | Default |
|---|---|---|
| calico_backend | The backend to use. | bird |
| cni_network_config | The CNI Network config to install on each node. Supports templating as described below. |
CNI 네트워크 구성 템플릿
cni_network_config 구성 옵션은 다음 템플릿 필드를 지원하고, calico/cni 컨테이너가 자동으로 값을 채워요:
| Field | Substituted with |
|---|---|
__KUBERNETES_SERVICE_HOST__ |
The Kubernetes service Cluster IP, e.g 10.0.0.1 |
__KUBERNETES_SERVICE_PORT__ |
The Kubernetes service port, e.g., 443 |
__SERVICEACCOUNT_TOKEN__ |
The service account token for the namespace, if one exists. |
__ETCD_ENDPOINTS__ |
The etcd endpoints specified in etcd_endpoints. |
__KUBECONFIG_FILEPATH__ |
The path to the automatically generated kubeconfig file in the same directory as the CNI network configuration file. |
__ETCD_KEY_FILE__ |
The path to the etcd key file installed to the host. Empty if no key is present. |
__ETCD_CERT_FILE__ |
The path to the etcd certificate file installed to the host, empty if no cert present. |
__ETCD_CA_CERT_FILE__ |
The path to the etcd certificate authority file installed to the host. Empty if no certificate authority is present. |
애플리케이션 계층 정책 매니페스트 커스터마이징에 대해
미리 수정된 Istio 매니페스트로 설치하는 대신, Istio 설치를 직접 커스터마이징하거나 다른 Istio 버전을 쓰고 싶을 수 있어요. 이 섹션에서는 애플리케이션 계층 정책이 동작하도록 일반적인 Istio 설치 매니페스트에 필요한 변경을 안내해요.
사이드카 인젝터의 표준 Istio 매니페스트에는 pod를 클러스터에 추가할 때 사용되는 템플릿이 담긴 ConfigMap이 있어요. 이 템플릿은 init 컨테이너와 Envoy 사이드카를 추가해요. 애플리케이션 계층 정책에는 Dikastes라는 추가 경량 사이드카가 필요한데, 이 친구가 Felix에서 Calico 정책을 받아 들어오는 연결과 요청에 적용해요.
아직 내려받지 않았다면 Istio 릴리스를 받아서 작업 디렉터리에 풀어두세요.
install/kubernetes/istio-demo-auth.yaml 파일을 편집기로 열고 istio-sidecar-injector ConfigMap을 찾으세요. 기존 istio-proxy 컨테이너에 새 volumeMount를 추가해요.
- mountPath: /var/run/dikastes
name: dikastes-sock
템플릿에 새 컨테이너를 추가해요.
- name: dikastes
image: calico/calico:v3.33.0
command: ["/usr/bin/calico", "component", "dikastes"]
args: ["server", "-l", "/var/run/dikastes/dikastes.sock", "-d", "/var/run/felix/nodeagent/socket"]
securityContext:
allowPrivilegeEscalation: false
livenessProbe:
exec:
command:
- /healthz
- liveness
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
exec:
command:
- /healthz
- readiness
initialDelaySeconds: 3
periodSeconds: 3
volumeMounts:
- mountPath: /var/run/dikastes
name: dikastes-sock
- mountPath: /var/run/felix
name: felix-sync
새 볼륨 두 개를 추가해요.
- name: dikastes-sock
emptyDir:
medium: Memory
- name: felix-sync
csi:
driver: 'csi.tigera.io'
추가한 볼륨은 Envoy와 Dikastes 사이, Dikastes와 Felix 사이 통신을 가능하게 하는 Unix 도메인 소켓을 만드는 데 쓰여요. Unix 도메인 소켓은 만들어지면 메모리 안에서 동작하는 통신 채널이에요. 볼륨은 디스크에 어떤 상태 저장 용도로도 쓰이지 않아요.
위 변경 사항이 반영된 예시는 Calico ConfigMap 매니페스트를 참고하세요.
더 알아보기 (Learn more)
operator 설치에서는 Installation API 리소스로 IP 풀과 캡슐화를 지정하고, 매니페스트 설치에서는 환경 변수와 ConfigMap을 수정해요. CALICO_IPV4POOL_VXLAN은 기본 IP 풀이 처음 만들어질 때만 효과가 있으니 설치 이후 전환은 calicoctl로 IPPool을 바꿔야 해요.