본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

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-config ConfigMap.

이어지는 섹션에서 구성 가능한 파라미터를 더 자세히 다뤄요.

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 클러스터에서 이 매니페스트를 사용하려면 다음을 수행해야 해요:

  1. 설치 방법에 맞는 v3.33 매니페스트를 내려받아요.

    Calico for policy and networking

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/calico-etcd.yaml -O
    

    Calico for policy and flannel for networking

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.33.0/manifests/canal.yaml -O
    
  2. 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'
    
  3. etcd_ca 값이 담긴 파일, etcd_key 값이 담긴 파일, etcd_cert 값이 담긴 파일, 세 개를 준비했는지 확인해요.

  4. 다음과 같은 명령으로 파일에서 개행을 제거하고 내용을 base64로 인코딩해요.

    cat <file> | base64 -w 0
    
  5. 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=
    
  6. 매니페스트를 적용해요.

    Calico for policy and networking

    kubectl apply -f calico.yaml
    

    Calico 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을 바꿔야 해요.