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

CNI 플러그인 설치

원문 보기 위키 갱신

Kubernetes는 Calico 같은 네트워킹 제공자와 상호작용할 때 CNI(Container Network Interface)를 사용해요. 이 문서는 Kubernetes 클러스터의 모든 노드에 Calico CNI 플러그인 바이너리를 설치하고 kubelet에 연결하는 과정을 안내해요. "the hard way" 방식이라서 각 단계를 직접 실행하며 내부 동작을 제대로 이해할 수 있다는 게 매력이에요.

출처: 문서

본문

Kubernetes는 Calico 같은 네트워킹 제공자와 상호작용할 때 CNI(Container Network Interface)를 사용해요. 이 API를 Kubernetes에 제공하는 Calico 바이너리를 CNI 플러그인이라고 부르며, Kubernetes 클러스터의 모든 노드에 설치해야 해요.

CNI(Container Network Interface)가 Kubernetes와 어떻게 동작하고, Kubernetes 네트워킹을 어떻게 강화하는지 이해하려면 Kubernetes CNI 가이드를 읽어 보세요.

플러그인을 위한 Kubernetes 사용자 계정 프로비저닝하기

CNI 플러그인은 pod를 생성하면서 Kubernetes API 서버와 상호작용해요. 추가 정보를 얻기 위해서도, 그리고 pod에 대한 정보로 데이터스토어를 갱신하기 위해서도 말이에요.

Kubernetes 컨트롤 플레인 노드에서 CNI 플러그인이 인증에 사용할 키와 인증서 서명 요청(CSR)을 만들어요.

openssl req -newkey rsa:4096 \
           -keyout cni.key \
           -nodes \
           -out cni.csr \
           -subj "/CN=calico-cni"

이 인증서는 메인 Kubernetes CA로 서명해요.

sudo openssl x509 -req -in cni.csr \
                  -CA /etc/kubernetes/pki/ca.crt \
                  -CAkey /etc/kubernetes/pki/ca.key \
                  -CAcreateserial \
                  -out cni.crt \
                  -days 365
sudo chown $(id -u):$(id -g) cni.crt

다음으로 CNI 플러그인이 Kubernetes에 접근할 때 사용할 kubeconfig 파일을 만들어요. 이 cni.kubeconfig 파일은 클러스터의 모든 노드에 복사해요.

APISERVER=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}')
kubectl config set-cluster kubernetes \
    --certificate-authority=/etc/kubernetes/pki/ca.crt \
    --embed-certs=true \
    --server=$APISERVER \
    --kubeconfig=cni.kubeconfig

kubectl config set-credentials calico-cni \
    --client-certificate=cni.crt \
    --client-key=cni.key \
    --embed-certs=true \
    --kubeconfig=cni.kubeconfig

kubectl config set-context default \
    --cluster=kubernetes \
    --user=calico-cni \
    --kubeconfig=cni.kubeconfig

kubectl config use-context default --kubeconfig=cni.kubeconfig

RBAC 프로비저닝하기

CNI 플러그인이 Kubernetes에 접근할 때 사용할 클러스터 롤을 정의해요.

kubectl apply -f - <<EOF
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: calico-cni
rules:
  # The CNI plugin needs to get pods, nodes, and namespaces.
  - apiGroups: [""]
    resources:
      - pods
      - nodes
      - namespaces
    verbs:
      - get
  # The CNI plugin patches pods/status.
  - apiGroups: [""]
    resources:
      - pods/status
    verbs:
      - patch
 # These permissions are required for Calico CNI to perform IPAM allocations.
  - apiGroups: ["crd.projectcalico.org"]
    resources:
      - blockaffinities
      - ipamblocks
      - ipamhandles
    verbs:
      - get
      - list
      - create
      - update
      - delete
  - apiGroups: ["crd.projectcalico.org"]
    resources:
      - ipamconfigs
      - clusterinformations
      - ippools
    verbs:
      - get
      - list
EOF

클러스터 롤을 calico-cni 계정에 바인딩해요.

kubectl create clusterrolebinding calico-cni --clusterrole=calico-cni --user=calico-cni

플러그인 설치하기

클러스터의 각 노드에서 다음 단계를 수행하세요.

root로 명령을 실행해요.

sudo su

CNI 플러그인 바이너리를 설치해요.

curl -L -o /opt/cni/bin/calico https://github.com/projectcalico/cni-plugin/releases/download/v3.14.0/calico-amd64
chmod 755 /opt/cni/bin/calico
curl -L -o /opt/cni/bin/calico-ipam https://github.com/projectcalico/cni-plugin/releases/download/v3.14.0/calico-ipam-amd64
chmod 755 /opt/cni/bin/calico-ipam

설정 디렉터리를 만들어요.

mkdir -p /etc/cni/net.d/

이전 절에서 만든 kubeconfig를 복사해요.

cp cni.kubeconfig /etc/cni/net.d/calico-kubeconfig
chmod 600 /etc/cni/net.d/calico-kubeconfig

CNI 구성을 작성해요.

cat > /etc/cni/net.d/10-calico.conflist <<EOF
{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "mtu": 1500,
      "ipam": {
          "type": "calico-ipam"
      },
      "policy": {
          "type": "k8s"
      },
      "kubernetes": {
          "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "snat": true,
      "capabilities": {"portMappings": true}
    }
  ]
}
EOF

su에서 빠져나와 다시 로그인한 사용자로 돌아가요.

exit

이 시점에서 Kubernetes는 네트워킹 제공자와 구성을 갖추었기 때문에 노드가 Ready 상태가 될 거예요.

kubectl get nodes

다음 단계

Calico 컴포넌트 통신 보호하기

더 알아보기 (Learn more)

CNI 플러그인은 pod 생성/삭제 시점에 kubelet과 협력해 네트워크 인터페이스와 IPAM 할당을 실제로 수행하는 역할이에요. hard way 설치를 마쳤다면 CNI가 데이터스토어와 IPAM에 접근하는 흐름도 자연스럽게 이해하게 될 거예요.