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

Tigera Operator 문제 해결 체크리스트

원문 보기 위키 갱신

클러스터가 잘 올라가지 않아 답답할 때, 이 체크리스트를 위에서부터 차례로 확인해 보세요. 설치 시작 시점의 오류부터 Tigera Operator 상태, 커스텀 리소스, 파드 용량, 웹 콘솔 대시보드까지 Calico Cloud 설치 장애의 주요 원인을 순서대로 점검할 수 있어요.

출처: 문서

본문

설치 시작 오류 확인

설치를 시작하는 시점에 아래 문제 중 하나를 보고 있나요?

[ERROR] Detected plugin ls: No such file or directory, it is currently not supported

Calico Cloud를 설치하려는 클러스터에 CNI 플러그인이 설치되어 있지 않거나, CNI가 호환되지 않아요. 클러스터의 파드 네트워킹이 정상적으로 동작하는데도 이 메시지가 보인다면, kubelet이 kubenet 네트워킹을 사용하도록 구성되어 있을 가능성이 커요. kubenet은 Calico Cloud와 호환되지 않아요. 다른 클러스터를 사용하거나, 호환되는 네트워킹으로 클러스터를 다시 만드세요.

FIPS 모드가 활성화된 클러스터에는 Calico Cloud를 연결할 수 없어요

현재 시점에서 Calico Cloud는 FIPS 모드를 지원하지 않아요. 클러스터에서 FIPS 모드를 비활성화한 다음 다시 설치하세요.

설치 스크립트가 오래 걸려요

기존 매니페스트 기반 Calico 설치에서 큰 클러스터를 마이그레이션하는 경우라면, 스크립트가 시간을 좀 쓰는 것이 정상이에요.

다만 클러스터에 호환성 문제가 있다는 뜻일 수도 있어요. 다음 단계인 Calico Cloud 설치 확인으로 넘어가세요.

Calico Cloud 설치 확인

Kubernetes 클러스터에 Calico Cloud를 설치하는 작업은 Tigera Operator가 관리해요. Tigera Operator는 tigera-operator 네임스페이스에 ReplicaSet으로 배포되고, tigerastatus라는 커스텀 리소스에 상태를 기록해요. operator는 여러 커스텀 리소스(CR)에서 구성을 가져오는데, 그중 중심이 Installation CR이에요.

다음 명령으로 tigerastatus를 확인하세요.

kubectl get tigerastatus

예시 출력

NAME                            AVAILABLE   PROGRESSING   DEGRADED   SINCE
apiserver                       True        False         False      10m
calico                          True        False         False      11m
cloud-core                      True        False         False      11m
compliance                      True        False         False      9m39s
intrusion-detection             True        False         False      9m49s
log-collector                   True        False         False      9m29s
management-cluster-connection   True        False         False      9m54s
monitor                         True        False         False      10m

모든 컴포넌트가 "Available" = TRUE로 표시되면 Calico Cloud가 제대로 설치된 거예요.

문제: Calico Cloud가 설치되지 않음

Calico Cloud가 설치되어 있지 않으면 다음 오류가 표시돼요. Support에서 받은 curl 명령을 사용해 노드에 Calico Cloud를 설치하세요.

kubectl get tigerastatus
error: the server doesn't have a resource type "tigerastatus"

문제: Calico Cloud 컴포넌트가 없거나 degraded 상태임

일부 Calico Cloud 컴포넌트가 Available = FALSE 또는 DEGRADED = TRUE로 표시되면, 다음 명령을 실행하고 그 출력을 가지고 Support에 문의하세요.

kubectl get tigerastatus -o yaml

SECONDARY: AWS 또는 Azure CNI 플러그인을 사용 중이라면, degraded 상태는 노드에 파드 용량이 부족하기 때문일 가능성이 높아요. 해결 방법은 파드 용량 확인을 참고하세요.

예시 출력

다음 예시에서 typha 컴포넌트는 AVAILABLE: FALSE와 DEGRADED: TRUE를 표시하고 있어서 문제가 있는 상태예요. Calico Cloud 컴포넌트의 세부 내용은 커스텀 리소스 깊이 살펴보기를 참고하세요.

apiVersion: v1
items:
  - apiVersion: operator.tigera.io/v1
    kind: TigeraStatus
    metadata:
      creationTimestamp: '2020-12-30T17:13:30Z'
      generation: 1
      managedFields:
        - apiVersion: operator.tigera.io/v1
          fieldsType: FieldsV1
          fieldsV1:
            f:spec: {}
            f:status:
              .: {}
              f:conditions: {}
          manager: operator
          operation: Update
          time: '2020-12-30T17:16:20Z'
      name: calico
      resourceVersion: '8166'
      selfLink: /apis/operator.tigera.io/v1/tigerastatuses/calico
      uid: 39a8a2d0-2074-418c-b52d-0baa0a48f4a1
    spec: {}
    status:
      conditions:
        - lastTransitionTime: '2020-12-30T17:13:30Z'
          status: 'False'
          type: Available
        - lastTransitionTime: '2020-12-30T17:13:30Z'
          message: DaemonSet "calico-system/calico-node" is not yet scheduled on any nodes
          reason: Not all pods are ready
          status: 'True'
          type: Progressing
        - lastTransitionTime: '2020-12-30T17:13:30Z'
          message: 'failed to wait for operator typha deployment to be ready: waiting
            for typha to have 4 replicas, currently at 3'
          reason: error migrating resources to calico-system
          status: 'True'
          type: Degraded
kind: List
metadata:
  resourceVersion: ''
  selfLink: ''

치명적인 오류 로그 확인

Tigera Operator가 실행 중인지, 그리고 로그에 치명적인(fatal) 오류가 없는지 확인하세요.

kubectl get pods -n tigera-operator
NAME                               READY   STATUS    RESTARTS   AGE
tigera-operator-8687585b66-68gmr   1/1     Running   0          139m
kubectl logs -n tigera-operator tigera-operator-8687585b66-68gmr
2020/12/30 17:38:54 [INFO] Version: 90975f4
2020/12/30 17:38:54 [INFO] Go Version: go1.14.4
2020/12/30 17:38:54 [INFO] Go OS/Arch: linux/amd64
{"level":"info","ts":1609349935.2848425,"logger":"setup","msg":"Checking type of cluster","provider":""}
{"level":"info","ts":1609349935.2868738,"logger":"setup","msg":"Checking if TSEE controllers are required","required":true}
<...>

커스텀 리소스 확인

**설치 커스텀 리소스(installation custom resource)**가 있는지, 그리고 값들이 여러분 환경에 적절한지 확인하세요.

kubectl get installation.operator.tigera.io default -o yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"operator.tigera.io/v1","kind":"Installation","metadata":{"annotations":{},"name":"default"},"spec":{"imagePullSecrets":[{"name":"tigera-pull-secret"}],"variant":"TigeraSecureEnterprise"}}
  creationTimestamp: '2021-01-20T19:50:23Z'
  generation: 2
  managedFields:
    - apiVersion: operator.tigera.io/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            .: {}
            f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:spec:
          .: {}
          f:imagePullSecrets: {}
          f:variant: {}
      manager: kubectl
      operation: Update
      time: '2021-01-20T19:50:23Z'
    - apiVersion: operator.tigera.io/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:spec:
          f:calicoNetwork:
            .: {}
            f:bgp: {}
            f:hostPorts: {}
            f:ipPools: {}
            f:mtu: {}
            f:multiInterfaceMode: {}
            f:nodeAddressAutodetectionV4:
              .: {}
              f:firstFound: {}
          f:cni:
            .: {}
            f:ipam:
              .: {}
              f:type: {}
            f:type: {}
          f:componentResources: {}
          f:flexVolumePath: {}
          f:nodeUpdateStrategy:
            .: {}
            f:rollingUpdate:
              .: {}
              f:maxUnavailable: {}
            f:type: {}
        f:status:
          .: {}
          f:variant: {}
      manager: operator
      operation: Update
      time: '2021-01-20T19:55:10Z'
  name: default
  resourceVersion: '5195'
  selfLink: /apis/operator.tigera.io/v1/installations/default
  uid: 016c3f0b-39f0-48a0-9da8-a59a81ed9128
spec:
  calicoNetwork:
    bgp: Enabled
    hostPorts: Enabled
    ipPools:
      - blockSize: 26
        cidr: 10.42.0.0/16
        encapsulation: IPIP
        natOutgoing: Enabled
        nodeSelector: all()
    mtu: 0
    multiInterfaceMode: None
    nodeAddressAutodetectionV4:
      firstFound: true
  cni:
    ipam:
      type: Calico
    type: Calico
  componentResources:
    - componentName: Node
      resourceRequirements:
        requests:
          cpu: 250m
  flexVolumePath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds
  imagePullSecrets:
    - name: tigera-pull-secret
  nodeUpdateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
  variant: TigeraSecureEnterprise
status:
  variant: TigeraSecureEnterprise

다음 커스텀 리소스들이 있는지 확인하세요. 기본 설치에는 별도의 구성 정보가 없어요.

API server 확인

kubectl get apiserver.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   85m

cloud core 확인

kubectl get cloudcore.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   88m

compliance 확인

kubectl get compliance.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   90m

intrusion detection 확인

kubectl get intrusiondetection.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   93m

log collector 확인

kubectl get logcollector.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   96m

management cluster 확인

kubectl get ManagementClusterConnection.operator.tigera.io tigera-secure -o yaml
apiVersion: operator.tigera.io/v1
kind: ManagementClusterConnection
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"operator.tigera.io/v1","kind":"ManagementClusterConnection","metadata":{"annotations":{},"name":"tigera-secure"},"spec":{"managementClusterAddr":"<Your cluster prefix>.tigera.io:9000"}}
  creationTimestamp: '2021-01-20T19:55:40Z'
  generation: 1
  managedFields:
    - apiVersion: operator.tigera.io/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            .: {}
            f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:spec:
          .: {}
          f:managementClusterAddr: {}
      manager: kubectl
      operation: Update
      time: '2021-01-20T19:55:40Z'
  name: tigera-secure
  resourceVersion: '5425'
  selfLink: /apis/operator.tigera.io/v1/managementclusterconnections/tigera-secure
  uid: b7a2093e-a4b6-4e76-b291-15f45bfa11cf
spec:
  managementClusterAddr: <Your cluster prefix>.tigera.io:9000

monitor 확인

kubectl get monitor.operator.tigera.io tigera-secure
NAME            AGE
tigera-secure   98m

operator 커스텀 리소스에 대한 자세한 내용은 Tigera Operator API 레퍼런스를 참고하세요.

커스텀 리소스 깊이 살펴보기

필요한 커스텀 리소스를 갖고 있는지 확인하려면 다음 명령을 실행하세요.

kubectl get tigerastatus
NAME AVAILABLE PROGRESSING DEGRADED SINCE
1 apiserver TRUE FALSE FALSE 10m
2 calico TRUE FALSE FALSE 11m
3 cloud-core TRUE FALSE FALSE 11m
4 compliance TRUE FALSE FALSE 9m39s
5 intrusion-detection TRUE FALSE FALSE 9m49s
6 log-collector TRUE FALSE FALSE 9m29s
7 management-cluster-connection TRUE FALSE FALSE 9m54s
8 monitor TRUE FALSE FALSE 11m

1 - api server

apiserver는 aggregated api-server 역할을 하는 필수 컴포넌트예요. tigera 라이선스 적용 같은 작업에 필요해요. tigerastatus가 이 컴포넌트를 unavailable 또는 degraded로 보고하면, calico-system 네임스페이스의 파드와 로그를 확인하세요. 예를 들면 다음과 같아요.

kubectl get pods -n calico-system
NAME                                READY   STATUS    RESTARTS   AGE
calico-apiserver-5c75bc8d4b-sbn6g   2/2     Running   0          45m

2 - calico

calico는 네트워킹의 핵심 컴포넌트예요. 사용 불가 또는 degraded 상태라면 calico-system 네임스페이스의 파드와 로그를 확인하세요. 각 노드마다 calico-node 파드가 하나씩 실행 중이어야 해요. calico-typha 파드도 최소 하나는 있어야 하고, 개수는 클러스터의 노드 수에 맞춰 늘어나요. calico-kube-controllers 파드도 실행 중이어야 하고요. 예를 들면 다음과 같아요.

kubectl get pods -n calico-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5c77d4d559-hfl5d   1/1     Running   0          44m
calico-node-6s2c9                          1/1     Running   0          40m
calico-node-8nf28                          1/1     Running   0          41m
calico-node-djlrg                          1/1     Running   0          40m
calico-node-ms8nv                          1/1     Running   0          40m
calico-node-t7pck                          1/1     Running   0          40m
calico-typha-bdb494458-76gcx               1/1     Running   0          41m
calico-typha-bdb494458-847tr               1/1     Running   0          41m
calico-typha-bdb494458-k8lhj               1/1     Running   0          40m
calico-typha-bdb494458-vjbjz               1/1     Running   0          40m

3 - cloud-core

cloud-core는 사용자용 미리 정의된 역할과 커스텀 역할을 담당해요. 라벨 셀렉터 k8s-app=cc-core-operator를 사용해 calico-cloud 네임스페이스의 파드와 로그를 확인하세요.

$ kubectl get pods -n calico-cloud -l k8s-app=cc-core-operator
NAME                                          READY   STATUS    RESTARTS   AGE
cc-core-operator-126dcd494a-9kj7g             1/1     Running   0          80m

4 - compliance

compliance는 컴플라이언스 기능을 담당해요. tigera-compliance 네임스페이스의 파드와 로그를 확인하세요.

$ kubectl get pods -n tigera-compliance
NAME                                     READY   STATUS    RESTARTS   AGE
compliance-benchmarker-bqvps             1/1     Running   0          65m
compliance-benchmarker-h58hr             1/1     Running   0          65m
compliance-benchmarker-kdtwp             1/1     Running   0          65m
compliance-benchmarker-mzm2z             1/1     Running   0          65m
compliance-benchmarker-s5mmf             1/1     Running   0          65m
compliance-controller-77785646df-ws2cj   1/1     Running   0          65m
compliance-snapshotter-6bcbdc65b-66k9v   1/1     Running   0          65m

5 - intrusion-detection

intrusion-detection은 침입 탐지 기능을 담당해요. tigera-intrusion-detection 네임스페이스의 파드와 로그를 확인하세요.

$ kubectl get pods -n tigera-intrusion-detection
NAME                                              READY   STATUS    RESTARTS   AGE
intrusion-detection-controller-669bf45c75-grvz9   1/1     Running   0          66m
intrusion-detection-es-job-installer-xm22v        1/1     Running   0          66m

6 - log-collector

log-collector는 플로우 로그 등 각종 로그를 수집해 Calico Cloud로 전달해요. tigera-fluentd 네임스페이스의 파드와 로그를 확인하세요. 노드마다 파드가 하나씩 실행 중이어야 해요.

kubectl get pods -n tigera-fluentd
NAME                 READY   STATUS    RESTARTS   AGE
fluentd-node-5mzh6   1/1     Running   0          70m
fluentd-node-7vmxw   1/1     Running   0          70m
fluentd-node-bbc4p   1/1     Running   0          70m
fluentd-node-chfz4   1/1     Running   0          70m
fluentd-node-d6f56   1/1     Running   0          70m

7 - management-cluster-connection

management-cluster-connection은 매니지드 클러스터가 Calico Cloud 백엔드에 연결하는 데 필요해요. 사용 불가 또는 degraded 상태라면 tigera-guardian 네임스페이스의 파드와 로그를 확인하세요.

kubectl get pods -n tigera-guardian
NAME                               READY   STATUS    RESTARTS   AGE
tigera-guardian-7d5d94d5cc-49rg8   1/1     Running   0          48m

guardian 컴포넌트가 관리 클러스터(management cluster)로의 네트워크 연결을 갖고 있는지 확인하려면 다음을 따르세요.

관리 클러스터의 URL을 찾으세요.

kubectl get managementclusterconnection tigera-secure -o=jsonpath='{.spec.managementClusterAddr}'
<your prefix>.tigera.io:9000

그다음 워커 노드에서 관리 클러스터로의 네트워크 연결을 확인하세요.

openssl s_client -connect <your prefix>.tigera.io:9000
CONNECTED(00000003)
depth=0 CN = tigera-voltron
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = tigera-voltron
verify return:1
---
Certificate chain
 0 s:CN = tigera-voltron
   i:CN = tigera-voltron
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIC5DCCAcygAwIBAgIBATANBgkqhkiG9w0BAQsFADAZMRcwFQYDVQQDEw50aWdl
cmEtdm9sdHJvbjAeFw0yMDEyMjExOTA1MzhaFw0yNTEyMjAxOTA1MzhaMBkxFzAV
<...>

8 - monitor

monitor는 prometheus와 관련 커스텀 리소스를 구성하는 일을 담당해요. tigera-prometheus 네임스페이스의 파드와 로그를 확인하세요.

$ kubectl get pods -n tigera-prometheus
NAME                                          READY   STATUS    RESTARTS   AGE
alertmanager-calico-node-alertmanager-0       2/2     Running   0          125m
alertmanager-calico-node-alertmanager-1       2/2     Running   0          125m
alertmanager-calico-node-alertmanager-2       2/2     Running   0          125m
calico-prometheus-operator-77bf897c9b-7f88x   1/1     Running   0          125m
prometheus-calico-node-prometheus-0           3/3     Running   1          125m

추가 커스텀 리소스 확인

Tigera Operator가 만든 다른 커스텀 리소스도 있는지 확인하세요. FelixConfiguration, IPPool, Tigera 라이선스, 그리고 컴포넌트 메트릭을 위한 Prometheus가 그 대상이에요.

FelixConfiguration에는 calico-node 컨테이너에 환경 변수로 구성되지 않는 설정들이 담겨 있어요.

kubectl get Felixconfiguration default
NAME      CREATED AT
default   2021-01-20T19:49:35Z

operator는 pod 네트워킹용 기본 IPPool이 아직 없으면 새로 만들어 줘요. 이때 CIDR은 Installation CR에서 가져와요.

kubectl get IPPool
NAME                  CREATED AT
default-ipv4-ippool   2021-01-20T19:49:35Z

Tigera 라이선스는 설치 스크립트가 적용해요.

kubectl get licensekeys.projectcalico.org
NAME      AGE
default   120m

설치 스크립트는 Prometheus operator와 관련 커스텀 리소스를 배포해요. 클러스터에 이미 Prometheus operator가 실행 중이라면 Tigera 지원 팀에 문의하세요.

kubectl get pods -n tigera-prometheus
NAME                                          READY   STATUS    RESTARTS   AGE
alertmanager-calico-node-alertmanager-0       2/2     Running   0          125m
alertmanager-calico-node-alertmanager-1       2/2     Running   0          125m
alertmanager-calico-node-alertmanager-2       2/2     Running   0          125m
calico-prometheus-operator-77bf897c9b-7f88x   1/1     Running   0          125m
prometheus-calico-node-prometheus-0           3/3     Running   1          125m

파드 용량 확인

클러스터에 충분한 용량이 없으면 파드를 배포할 수 없어요. 이 조건과 연관된 특정한 오류 메시지는 없어요.

Calico Cloud가 실행하기 위해 필요한 상위 컴포넌트는 다음과 같아요.

  • 노드별로: fluentd 1개, compliance benchmarker 1개
  • 노드별 용량 위에 추가로: alertmanager 3개(statefulset에서 제공), prometheus 1개, prometheus operator 1개, kube-controllers 1개, compliance snapshotter와 controller 2개, guardian 1개, ids controller 1개, apiserver 1개

일부 클러스터는 파드 네트워킹을 사용하는 파드 용량이 제한돼 있어요.

다음과 같은 파드 네트워킹 파드 용량이 있는지 확인하세요.

  • 클러스터의 각 노드에 최소 2개 분량의 파드 용량이 있는지 확인하세요.
  • 노드별 용량 외에 클러스터 전체로 최소 11개 분량의 파드 용량이 더 있는지 확인하세요.

AWS나 AKS에서 개별 노드의 용량을 확인하려면 노드 상태를 조회해서 Capacity.Pods(해당 노드의 총 용량)를 보세요. 노드의 파드 네트워킹 파드 수를 구하려면, 그 노드에서 파드 네트워킹을 사용하는(호스트 네트워크를 쓰지 않는) 파드의 개수를 세면 돼요.

파드 시큐리티 정책 위반 확인

클러스터가 Kubernetes 1.24 이전 버전을 사용 중이라면, 파드 시큐리티 정책(PSP) 위반이 클러스터의 파드를 막고 있을 수 있어요.

실패한 클러스터 배포의 상태 메시지에서 PodSecurityPolicy라는 용어를 검색해 보세요. PSP가 있다면, Calico Cloud에 연결하기 전에 클러스터에 오픈소스 Calico를 먼저 설치하세요.

웹 콘솔 대시보드에서 트래픽 확인

웹 콘솔 메인 대시보드에 트래픽 그래프가 없어요

웹 콘솔에 로그인하면 왼쪽 내비게이션의 첫 번째 항목이 메인 Dashboard예요. 이 대시보드는 매니지드 클러스터의 정책·네트워킹 활동을 한눈에 보여 주는 조감도예요. 그래프에 트래픽을 표시하려면 Prometheus operator가 반드시 있어야 해요. 없다면 설치 중에 다음 메시지가 표시돼요.

Prometheus Operator detected in the cluster. Skipping Tigera Prometheus Operator

적절한 Prometheus operator를 설치하려면 아래 Support에 문의하세요.

더 알아보기 (Learn more)