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

Operator로 설치하기

원문 보기 위키 갱신

Operator로 설치하기 (Install using Operator)

이 문서는 Tigera Operator를 사용해 Kubernetes 클러스터에 Calico for Windows를 설치하는 방법을 안내해요. 테스트나 개발 환경용 설치 시나리오이고, Kubernetes의 HostProcess 컨테이너(HPC)를 활용해 Windows 노드에 수동으로 설치하지 않고도 Calico for Windows를 설치·관리할 수 있어요. Linux 클러스터와 Windows 노드가 함께 필요한 하이브리드 구성이라는 점만 기억하면 설치 절차는 어렵지 않아요.

출처: 문서

본문

큰 그림 (Big picture)

Tigera Operator를 사용해 Kubernetes 클러스터에 Calico for Windows를 설치해요.

개념 (Concepts)

Calico for Windows는 하이브리드 구현이에요. Calico 컴포넌트와 Linux 워크로드를 위한 Linux 클러스터가 필요하고, Windows 워크로드를 위한 Windows 노드도 필요하죠.

시작하기 전에 (Before you begin)

Linux 요구 사항과 Calico for Windows 요구 사항을 검토하세요.

시작하기 전에 Linux 노드에 Calico 클러스터를 구성하고 Windows 머신을 프로비저닝하세요.

방법 (How to)

Calico 네트워킹을 사용하는 클러스터의 strict affinity 구성

Calico 네트워킹을 사용하는 Linux 컨트롤 노드에서는 strict affinity를 true로 설정해야 해요. Linux 노드가 Windows 노드에서 IP 주소를 빌려 오는 걸 막기 위해 필요해요:

kubectl patch ipamconfigurations default --type merge --patch='{"spec": {"strictAffinity": true}}'

보조 정보: 위 명령이 ipamconfigurations 리소스를 찾지 못하고 실패했다면 Calico API 서버를 설치해야 해요. Calico API 서버 설치를 참고하세요.

Operator로 Calico for Windows 설치

Kubernetes v1.22에는 **HostProcess containers(HPC)**라는 새로운 Windows 컨테이너 유형이 생겼어요. HPC는 호스트 네트워크 네임스페이스, 스토리지, 디바이스에 접근하면서 호스트에서 직접 실행될 수 있어요. 이 기능 덕분에 Calico for Windows를 이제 각 노드에 수동으로 구성하고 설치하는 대신, Daemonset과 ConfigMap 같은 Kubernetes 리소스로 설치하고 관리할 수 있어요. 이 설치 방법에서는 Calico for Windows 서비스가 더 이상 호스트에 등록되지 않아요. 대신 서비스가 HostProcess 컨테이너 안에서 직접 실행돼요.

HPC 요구 사항

Calico for Windows 요구 사항에 더해, 이 설치 방법에는 추가 요구 사항이 있어요:

  • Kubernetes v1.22+
  • HostProcess containers 지원 활성화. Kubernetes v1.22라면 여기를 참고하세요. Kubernetes v1.23+에서는 HostProcess containers가 기본으로 활성화되어 있어요.
  • containerd v1.6+
  • Windows 노드가 클러스터에 가입되어 있어야 해요.

Windows 노드에 containerd를 설치하고 containerd 서비스를 구성하는 방법:

Invoke-WebRequest https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/hostprocess/Install-Containerd.ps1 -OutFile c:\Install-Containerd.ps1
c:\Install-Containerd.ps1 -ContainerDVersion 1.6.22 -skipHypervisorSupportCheck -CNIConfigPath "c:/etc/cni/net.d" -CNIBinPath "c:/opt/cni/bin"

수동 방식으로 Calico for Windows를 설치해 둔 상태라면 Windows 노드가 이미 클러스터에 가입되어 있을 수 있어요.

kubeadm으로 프로비저닝한 클러스터에 Windows 노드를 가입시키는 방법:

  • kubeadm과 kubelet 바이너리를 설치하고 kubelet 서비스를 설치해요
Invoke-WebRequest https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/hostprocess/PrepareNode.ps1 -OutFile c:\PrepareNode.ps1
c:\PrepareNode.ps1 -KubernetesVersion v1.26.6
  • 컨트롤 플레인 호스트에서 kubeadm을 실행하고 join 명령을 복사해요
kubeadm token create --print-join-command
  • kubeadm.exe 경로를 c:\k\kubeadm.exe로 바꿔서 join 명령을 수정해요.
  • Kubernetes v1.25보다 낮은 버전을 사용한다면 join 명령에 --cri-socket "npipe:////./pipe/containerd-containerd"도 덧붙이세요. join 명령 예시예요:
c:\k\kubeadm.exe join 172.16.101.139:6443 --token v8w2jt.jmc45acn85dbll1e --discovery-token-ca-cert-hash sha256:d0b7040a704d8deb805ba1f29f56bbc7cea8af6aafa78137a9338a62831739b4 --cri-socket "npipe:////./pipe/containerd-containerd"
  • Windows 노드에서 join 명령을 실행해요. 성공적으로 끝나고 얼마 지나지 않아 Windows 노드가 kubectl get nodes에 나타나요. Calico CNI가 아직 설치되지 않았기 때문에 새 노드의 상태는 NotReady예요.

Calico for Windows 수동 설치에서 operator 설치로 마이그레이션

이 가이드의 HPC 설치는 operator 기반이라, 수동 설치 방식으로 Calico for Windows가 설치된 Windows 노드를 자동으로 마이그레이션해요. 이 설치 과정은 기존 Calico for Windows 서비스를 제거하고, Calico for Windows 설치 파일을 calico/cni-windows와 calico/node-windows 이미지에 포함된 파일로 덮어써요. kubelet을 C:\CalicoWindows\kubernetes\install-kube-services.ps1로 설치했다면 이 서비스는 설치된 채로 남아요. kube-proxy 서비스도 C:\CalicoWindows\kubernetes\install-kube-services.ps1로 설치했다면 calico-node-windows HPC initContainers가 이 서비스를 멈추고 제거해요. kube-proxy-windows는 kubernetes-sigs sig-windows-tools 저장소에서 제공하는 매니페스트로 hostprocess 컨테이너 이미지로 실행하는 걸 권해요.

보조 정보: 진행하기 전에 C:\CalicoWindows\config.ps1의 구성 파라미터를 메모해 두세요. 설치할 때 이 구성 파라미터들이 필요해요.

Operator 설치

탭: Kubernetes VXLAN

  1. 크로스 서브넷 캡슐화가 비활성화되어 있는지 확인해요. IP 풀의 encapsulation:은 VXLANCrossSubnet이 아니라 반드시 VXLAN을 사용해야 해요. IP 풀이 하나뿐이라면 다음 명령으로 바꿀 수 있어요:

    kubectl patch installation default --type='json' -p='[{"op": "replace", "path": "/spec/calicoNetwork/ipPools/0/encapsulation", "value": "VXLAN"}]
    
  2. BGP가 비활성화되어 있는지 확인해요.

    • 매니페스트로 Calico를 설치했다면 BGP는 이미 비활성화되어 있어요.
    • operator로 Calico를 설치했다면 다음 명령을 실행해요: \
      kubectl patch installation default --type=merge -p '{"spec": {"calicoNetwork": {"bgp": "Disabled"}}}'
      
  3. Calico for Windows config map을 업데이트할 때 쓸 클러스터의 Kubernetes API 서버 호스트와 포트를 구해요. Calico for Windows 설치 스크립트가 Calico 서비스용 kubeconfig 파일을 만들어야 하므로 API 서버 호스트와 포트가 필요해요. Windows 노드에 이미 Calico for Windows를 수동으로 설치했다면 이 단계는 건너뛰세요. calico-windows-config ConfigMap에 KUBERNETES_SERVICE_HOST와 KUBERNETES_SERVICE_PORT 변수가 없으면 설치 스크립트가 노드의 기존 kubeconfig 파일에 있는 API 서버 호스트와 포트를 사용해요.

    먼저 API 서버의 주소를 메모해 두세요:

    • 고정 IP 주소를 가진 API 서버가 하나뿐이라면 그 IP 주소와 포트를 사용할 수 있어요. IP는 다음 명령으로 찾을 수 있어요:

      kubectl get endpoints kubernetes -o wide
      

      출력은 아래와 비슷하고, "ENDPOINTS" 아래에 IP 주소와 포트가 하나 있어요:

      NAME         ENDPOINTS             AGE
      kubernetes   172.16.101.157:6443   40m
      

      "ENDPOINTS" 아래에 항목이 여러 개라면 클러스터에 API 서버가 두 개 이상 있는 거예요. 이 경우 아래에서 클러스터에 알맞은 로드 밸런싱 옵션을 사용하세요.

    • DNS 로드 밸런싱을 사용한다면(kops가 그렇게 해요) API 서버 api.internal.<clustername>의 FQDN과 포트를 사용하세요.

    • 앞에 로드 밸런서를 둔 API 서버가 여러 개라면 로드 밸런서의 IP와 포트를 사용해야 해요.

      성공 팁: 클러스터가 ConfigMap으로 kube-proxy를 구성한다면, 그 config map을 살펴봐서 API 서버에 도달하는 "올바른" 방법을 찾을 수 있어요. 예를 들면:

      kubectl get configmap -n kube-system kube-proxy -o yaml | grep server
      server: https://d881b853ae312e00302a84f1e346a77.gr7.us-west-2.eks.amazonaws.com
      

      이 경우 서버는 d881b853aea312e00302a84f1e346a77.gr7.us-west-2.eks.amazonaws.com이고 포트는 443(표준 HTTPS 포트)이에요.

  4. 이전 단계에서 찾은 Kubernetes API 서버 호스트와 포트로 Calico 서비스용 kubeconfig 파일을 만들 때 쓸 kubernetes-services-endpoint ConfigMap을 만들어요.

    kubectl apply -f - << EOF
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kubernetes-services-endpoint
      namespace: tigera-operator
    data:
      KUBERNETES_SERVICE_HOST: "${APISERVER_ADDR}"
      KUBERNETES_SERVICE_PORT: "${APISERVER_PORT}"
    EOF
    
  5. 클러스터에 구성된 Kubernetes service clusterIP 범위를 구해요. 이 값은 kube-apiserver가 사용하는 service-cluster-ip-range와 일치해야 해요.

  6. 이전 단계에서 찾은 Kubernetes 서비스 CIDR을 추가하고 Tigera Operator installation 리소스에서 Calico for Windows를 활성화해요.

    예를 들어 Kubernetes service clusterIP 범위가 10.96.0.0/12라면:

    kubectl patch installation default --type merge --patch='{"spec": {"serviceCIDRs": ["10.96.0.0/12"], "calicoNetwork": {"windowsDataplane": "HNS"}}}'
    
  7. Windows 노드에 kube-proxy를 설치해요.

    플랫폼에 따라 Windows 노드에 이미 kube-proxy가 실행 중일 수도 있어요. Windows 노드에 kube-proxy가 이미 실행 중이라면 이 단계를 건너뛰세요. kube-proxy가 실행 중이 아니라면 클러스터의 각 Windows 노드에 kube-proxy를 설치하고 실행해야 해요. 참고: kubernetes-sigs sig-windows-tools 저장소에서 제공하는 매니페스트는 kube-system 네임스페이스의 kube-proxy ConfigMap이 제공하는 kubeconfig에 의존해요.

    daemonset이 Kubernetes 클러스터와 호환되는 kube-proxy Windows 이미지를 사용하도록 kube-proxy.yml에서 KUBE_PROXY_VERSION을 클러스터의 Kubernetes 버전으로 반드시 교체하세요. 다음과 같은 명령으로 YAML 파일을 내려받고 버전을 교체한 뒤 적용할 수 있어요:

    curl -L  https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/hostprocess/calico/kube-proxy/kube-proxy.yml | sed "s/KUBE_PROXY_VERSION/<YOUR_KUBERNETES_VERSION>/g" | kubectl apply -f -
    
  8. 설치를 모니터링해요.

    Calico for Windows HPC 설치에는 initContainers가 2개 있어요. uninstall-calico는 이전에 수동 설치한 Calico for Windows 서비스가 있을 때 이를 제거하고, install-cni는 Calico CNI를 사용할 때 필요한 CNI 바이너리와 구성을 설치해요.

    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c uninstall-calico
    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c install-cni
    

    이 initContainers의 실행이 끝나면 설치가 완료돼요. 그다음 Calico for Windows 서비스가 별도 컨테이너에서 시작돼요:

    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c node
    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c felix
    

    calico-node-windows 파드는 컨테이너들의 초기화가 끝나면 Ready 상태가 돼요.

탭: Kubernetes BGP

  1. Windows 노드에서 BGP 서비스를 활성화해요. 다음 Powershell 명령으로 RemoteAccess 서비스를 설치해요:

    Install-WindowsFeature RemoteAccess
    Install-WindowsFeature RSAT-RemoteAccess-PowerShell
    Install-WindowsFeature Routing
    

    그다음 컴퓨터를 재시작해요:

    Restart-Computer -Force
    

    그리고 다음을 실행해요:

    Install-RemoteAccess -VpnType RoutingOnly
    

    설치 후 원격 액세스 서비스가 자동으로 시작하지 못할 때가 있어요. 실행 중인지 확인하려면 다음 명령을 실행하세요:

    Start-Service RemoteAccess
    
  2. Calico for Windows config map을 업데이트할 때 쓸 클러스터의 Kubernetes API 서버 호스트와 포트를 구해요. Calico for Windows 설치 스크립트가 Calico 서비스용 kubeconfig 파일을 만들어야 하므로 API 서버 호스트와 포트가 필요해요. Windows 노드에 이미 Calico for Windows를 수동으로 설치했다면 이 단계는 건너뛰세요. calico-windows-config ConfigMap에 KUBERNETES_SERVICE_HOST와 KUBERNETES_SERVICE_PORT 변수가 없으면 설치 스크립트가 노드의 기존 kubeconfig 파일에 있는 API 서버 호스트와 포트를 사용해요.

    먼저 API 서버의 주소를 메모해 두세요:

    • 고정 IP 주소를 가진 API 서버가 하나뿐이라면 그 IP 주소와 포트를 사용할 수 있어요. IP는 다음 명령으로 찾을 수 있어요:

      kubectl get endpoints kubernetes -o wide
      

      출력은 아래와 비슷하고, "ENDPOINTS" 아래에 IP 주소와 포트가 하나 있어요:

      NAME         ENDPOINTS             AGE
      kubernetes   172.16.101.157:6443   40m
      

      "ENDPOINTS" 아래에 항목이 여러 개라면 클러스터에 API 서버가 두 개 이상 있는 거예요. 이 경우 아래에서 클러스터에 알맞은 로드 밸런싱 옵션을 사용하세요.

    • DNS 로드 밸런싱을 사용한다면(kops가 그렇게 해요) API 서버 api.internal.<clustername>의 FQDN과 포트를 사용하세요.

    • 앞에 로드 밸런서를 둔 API 서버가 여러 개라면 로드 밸런서의 IP와 포트를 사용해야 해요.

      성공 팁: 클러스터가 ConfigMap으로 kube-proxy를 구성한다면, 그 config map을 살펴봐서 API 서버에 도달하는 "올바른" 방법을 찾을 수 있어요. 예를 들면:

      kubectl get configmap -n kube-system kube-proxy -o yaml | grep server
      server: https://d881b853ae312e00302a84f1e346a77.gr7.us-west-2.eks.amazonaws.com
      

      이 경우 서버는 d881b853aea312e00302a84f1e346a77.gr7.us-west-2.eks.amazonaws.com이고 포트는 443(표준 HTTPS 포트)이에요.

  3. 이전 단계에서 찾은 Kubernetes API 서버 호스트와 포트로 Calico 서비스용 kubeconfig 파일을 만들 때 쓸 kubernetes-services-endpoint ConfigMap을 만들어요.

    kubectl apply -f - << EOF
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kubernetes-services-endpoint
      namespace: tigera-operator
    data:
      KUBERNETES_SERVICE_HOST: "${APISERVER_ADDR}"
      KUBERNETES_SERVICE_PORT: "${APISERVER_PORT}"
    EOF
    
  4. 클러스터에 구성된 Kubernetes service clusterIP 범위를 구해요. 이 값은 kube-apiserver가 사용하는 service-cluster-ip-range와 일치해야 해요.

  5. 이전 단계에서 찾은 Kubernetes 서비스 CIDR을 추가하고 Tigera Operator installation 리소스에서 Calico for Windows를 활성화해요.

    예를 들어 Kubernetes service clusterIP 범위가 10.96.0.0/12라면:

    kubectl patch installation default --type merge --patch='{"spec": {"serviceCIDRs": ["10.96.0.0/12"], "calicoNetwork": {"windowsDataplane": "HNS"}}}'
    
  6. Windows 노드에 kube-proxy를 설치해요.

    플랫폼에 따라 Windows 노드에 이미 kube-proxy가 실행 중일 수도 있어요. Windows 노드에 kube-proxy가 이미 실행 중이라면 이 단계를 건너뛰세요. kube-proxy가 실행 중이 아니라면 클러스터의 각 Windows 노드에 kube-proxy를 설치하고 실행해야 해요. 참고: kubernetes-sigs sig-windows-tools 저장소에서 제공하는 매니페스트는 kube-system 네임스페이스의 kube-proxy ConfigMap이 제공하는 kubeconfig에 의존해요.

    daemonset이 Kubernetes 클러스터와 호환되는 kube-proxy Windows 이미지를 사용하도록 kube-proxy.yml에서 KUBE_PROXY_VERSION을 클러스터의 Kubernetes 버전으로 반드시 교체하세요. 다음과 같은 명령으로 YAML 파일을 내려받고 버전을 교체한 뒤 적용할 수 있어요:

    curl -L  https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/hostprocess/calico/kube-proxy/kube-proxy.yml | sed "s/KUBE_PROXY_VERSION/<YOUR_KUBERNETES_VERSION>/g" | kubectl apply -f -
    
  7. 설치를 모니터링해요.

    Calico for Windows HPC 설치에는 initContainers가 2개 있어요. uninstall-calico는 이전에 수동 설치한 Calico for Windows 서비스가 있을 때 이를 제거하고, install-cni는 Calico CNI를 사용할 때 필요한 CNI 바이너리와 구성을 설치해요.

    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c uninstall-calico
    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c install-cni
    

    이 initContainers의 실행이 끝나면 설치가 완료돼요. 그다음 Calico for Windows 서비스가 별도 컨테이너에서 시작돼요:

    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c node
    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c felix
    kubectl logs -f -n calico-system -l k8s-app=calico-node-windows -c confd
    

    calico-node-windows 파드는 컨테이너들의 초기화가 끝나면 Ready 상태가 돼요.

축하해요! 이제 Linux 컨트롤 노드와 함께 Calico for Windows가 설치된 Kubernetes 클러스터가 생겼어요.

다음 단계 (Next steps)

이제 Calico Linux 기반 문서 사이트를 문서로 사용할 수 있어요. 계속하기 전에 제한 사항과 알려진 이슈를 검토해서 Windows에는 적용되지 않는 기능(과 문서 섹션)을 파악하세요.

더 알아보기 (Learn more)

이 방식은 HostProcess 컨테이너 덕분에 각 Windows 노드에 수동 설치할 필요 없이 Kubernetes 리소스만으로 Calico for Windows를 관리할 수 있게 해줘요. VXLAN 탭과 BGP 탭은 앞 단계(BGP 활성화 여부)만 다르고 나머지 절차는 같아요. Windows에 특정 기능이 적용되는지는 제한 사항 문서에서 꼭 확인하세요.