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

문제 해결 명령어

원문 보기 위키 갱신

명령줄 도구로 클러스터 상태를 확인하고 문제를 해결하는 방법을 모은 참고 문서예요. 호스트, Kubernetes, Calico 컴포넌트, 라우팅, 네트워크 정책 다섯 영역별로 자주 쓰는 kubectl과 calicoctl 명령어를 정리했어요. 장애가 의심될 때 위에서부터 차례로 따라 하면서 원인 범위를 좁혀 보세요.

출처: 문서

본문

전체 그림

명령줄 도구를 사용해 상태를 확인하고 문제를 해결해요.

참고: calico-system은 오퍼레이터 기반 명령어와 예시에서 사용해요. 매니페스트 기반 설치라면 kube-system을 사용하세요.

컴포넌트 관련 도움이 필요하면 Calico 아키텍처와 컴포넌트를 참고하세요.

호스트

클러스터의 노드 수 확인하기

kubectl get nodes

NAME           STATUS   ROLES    AGE   VERSION
ip-10-0-0-10   Ready    master   27h   v1.18.0
ip-10-0-0-11   Ready    <none>   27h   v1.18.0
ip-10-0-0-12   Ready    <none>   27h   v1.18.0

모든 노드에서 calico-node 파드가 실행 중이고 정상 상태인지 확인하기

kubectl get pods -n calico-system -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE
calico-node-77zgj           1/1     Running   0          27h   10.0.0.10      ip-10-0-0-10
calico-node-nz8k2           1/1     Running   0          27h   10.0.0.11      ip-10-0-0-11
calico-node-7trv7           1/1     Running   0          27h   10.0.0.12      ip-10-0-0-12

추가 문제 해결을 위해 파드에 exec로 접속하기

kubectl run multitool --image=praqma/network-multitool

kubectl exec -it multitool -- bash
bash-5.0 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=97 time=6.61 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=97 time=6.64 ms

Calico 진단 로그 수집하기

sudo calicoctl node diags
Collecting diagnostics
Using temp dir: /tmp/calico194224816
Dumping netstat
Dumping routes (IPv4)
Dumping routes (IPv6)
Dumping interface info (IPv4)
Dumping interface info (IPv6)
Dumping iptables (IPv4)
Dumping iptables (IPv6)

Diags saved to /tmp/calico194224816/diags-20201127_010117.tar.gz

Kubernetes

모든 파드가 실행 중인지 확인하기

kubectl get pods -A
kube-system       coredns-66bff467f8-dxbtl                   1/1     Running   0          27h
kube-system       coredns-66bff467f8-n95vq                   1/1     Running   0          27h
kube-system       etcd-ip-10-0-0-10                          1/1     Running   0          27h
kube-system       kube-apiserver-ip-10-0-0-10                1/1     Running   0          27h

Kubernetes API 서버가 실행 중인지 확인하기

kubectl cluster-info
Kubernetes master is running at https://10.0.0.10:6443
KubeDNS is running at https://10.0.0.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
ubuntu@master:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.49.0.1    <none>        443/TCP   2d2h

Kubernetes kube-dns가 동작하는지 확인하기

kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.49.0.1    <none>        443/TCP   2d2h
kubectl exec -it multitool  bash
bash-5.0 curl -I -k https://kubernetes
HTTP/2 403
cache-control: no-cache, private
content-type: application/json
x-content-type-options: nosniff
content-length: 234
bash-5.0 nslookup google.com
Server:         10.49.0.10
Address:        10.49.0.10#53
Non-authoritative answer:
Name:   google.com
Address: 172.217.14.238
Name:   google.com
Address: 2607:f8b0:400a:804::200e

kubelet이 올바른 플래그로 노드에서 실행 중인지 확인하기

systemctl status kubelet

문제가 있다면 저널을 확인해요.

journalctl -u kubelet | head

다른 시스템 파드 상태 확인하기

특히 coredns를 주의 깊게 살펴보세요. IP를 받지 못하고 있다면 CNI에 문제가 있는 거예요.

kubectl get pod -n kube-system -o wide

다른 파드가 실패한다면 별개의 문제일 가능성이 커요. 평소처럼 Kubernetes 문제 해결을 진행하면 돼요. 예를 들면:

kubectl describe pod kube-scheduler-ip-10-0-1-20.eu-west-1.compute.internal -n kube-system | tail -15

Calico 컴포넌트

노드에서 Calico CNI 설정 보기

cat /etc/cni/net.d/10-calico.conflist

calicoctl이 클러스터와 일치하는지 확인하기

클러스터의 버전과 타입은 calicoctl 버전과 일치해야 해요.

calicoctl version

문법은 다음과 같아요:

calicoctl version -help

Tigera Operator 상태 확인하기

kubectl get tigerastatus
NAME     AVAILABLE   PROGRESSING   DEGRADED   SINCE
calico   True        False         False      27h

오퍼레이터 파드가 실행 중인지 확인하기

kubectl get pod -n tigera-operator

calico 노드 보기

kubectl get pod -n calico-system -o wide

Calico 설치 파라미터 보기

kubectl get installation -o yaml
apiVersion: v1
items:
- apiVersion: operator.tigera.io/v1
  kind: Installation
  metadata:
    - apiVersion: operator.tigera.io/v1
  spec:
    calicoNetwork:
      bgp: Enabled
      hostPorts: Enabled
      ipPools:
      - blockSize: 26
        cidr: 10.48.0.0/16
        encapsulation: VXLANCrossSubnet
        natOutgoing: Enabled
        nodeSelector: all()
      multiInterfaceMode: None
      nodeAddressAutodetectionV4:
        firstFound: true
    cni:
      ipam:
        type: Calico
      type: Calico

여러 노드에서 명령 실행하기

export THE_COMMAND_TO_RUN=date && for calinode in `kubectl get pod -o wide -n calico-system | grep calico-node | awk '{print $1}'`; do echo $calinode; echo "-----"; kubectl exec -n calico-system $calinode -- $THE_COMMAND_TO_RUN; printf "\n"; done
calico-node-87lpx
-----
Defaulted container "calico-node" out of: calico-node, flexvol-driver (init), install-cni (init)
Thu Apr 28 13:48:06 UTC 2022

calico-node-x5fmm
-----
Defaulted container "calico-node" out of: calico-node, flexvol-driver (init), install-cni (init)
Thu Apr 28 13:48:07 UTC 2022

파드 정보 보기

kubectl describe pods `<pod_name>`  -n `<namespace> `
kubectl describe pods busybox -n default
Events:
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Scheduled  21s   default-scheduler      Successfully assigned default/busybox to ip-10-0-0-11
  Normal  Pulling    20s   kubelet, ip-10-0-0-11  Pulling image "busybox"
  Normal  Pulled     19s   kubelet, ip-10-0-0-11  Successfully pulled image "busybox"
  Normal  Created    19s   kubelet, ip-10-0-0-11  Created container busybox
  Normal  Started    18s   kubelet, ip-10-0-0-11  Started container busybox

파드 로그 보기

kubectl logs `<pod_name>`  -n `<namespace>`
kubectl logs busybox -n default

kubelet 로그 보기

journalctl -u kubelet

라우팅

노드의 라우팅 테이블 확인하기

ip route
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.10 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.10
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.10 metric 100
10.48.66.128/26 via 10.0.0.12 dev eth0 proto 80 onlink
10.48.231.0/26 via 10.0.0.11 dev eth0 proto 80 onlink
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown

BGP 피어 상태 확인하기

sudo calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+------------+-------------+
| PEER ADDRESS |     PEER TYPE     | STATE |   SINCE    |    INFO     |
+--------------+-------------------+-------+------------+-------------+
| 10.0.0.12    | node-to-node mesh | up    | 2020-11-25 | Established |
| 10.0.0.11    | node-to-node mesh | up    | 2020-11-25 | Established |
+--------------+-------------------+-------+------------+-------------+

오버레이 설정 확인하기

kubectl get ippools default-ipv4-ippool -o yaml

---
spec:
  ipipMode: Always
  vxlanMode: Never

BGP로 학습한 경로 확인하기

ip r | grep bird
192.168.66.128/26 via 10.0.0.12 dev tunl0 proto bird onlink
192.168.180.192/26 via 10.0.0.10 dev tunl0 proto bird onlink
blackhole 192.168.231.0/26 proto bird

BIRD 라우팅 테이블 확인하기

참고: BIRD 라우팅 테이블은 노드 라우팅 테이블로 push돼요.

kubectl exec -it -n calico-system calico-node-8cfc8 -- /bin/bash
[root@ip-10-0-0-11 /] birdcl
BIRD v0.3.3+birdv1.6.8 ready.
bird> show route
0.0.0.0/0          via 10.0.0.1 on eth0 [kernel1 18:13:33] * (10)
10.0.0.0/24        dev eth0 [direct1 18:13:32] * (240)
10.0.0.1/32        dev eth0 [kernel1 18:13:33] * (10)
10.48.231.2/32     dev calieb874a8ef0b [kernel1 18:13:41] * (10)
10.48.231.1/32     dev caliaeaa173109d [kernel1 18:13:35] * (10)
10.48.231.0/26     blackhole [static1 18:13:32] * (200)
10.48.231.0/32     dev vxlan.calico [direct1 18:13:32] * (240)
10.48.180.192/26   via 10.0.0.10 on eth0 [Mesh_10_0_0_10 18:13:34] * (100/0) [i]
                   via 10.0.0.10 on eth0 [Mesh_10_0_0_12 18:13:41 from 10.0.0.12] (100/0) [i]
                   via 10.0.0.10 on eth0 [kernel1 18:13:33] (10)
10.48.66.128/26    via 10.0.0.12 on eth0 [Mesh_10_0_0_10 18:13:36 from 10.0.0.10] * (100/0) [i]
                   via 10.0.0.12 on eth0 [Mesh_10_0_0_12 18:13:41] (100/0) [i]
                   via 10.0.0.12 on eth0 [kernel1 18:13:36] (10)

트래픽 캡처하기

예를 들면:

sudo tcpdump -i calicofac0017c3 icmp

네트워크 정책

기존 Kubernetes 네트워크 정책 확인하기

kubectl get networkpolicy --all-namespaces
NAMESPACE   NAME             POD-SELECTOR   AGE
client      allow-ui         <none>         20m
client      default-deny     <none>         4h51m
stars       allow-ui         <none>         20m
stars       backend-policy   role=backend   20m
stars       default-deny     <none>         4h51m

기존 Calico 네트워크 정책 확인하기

calicoctl get networkpolicy --all-namespaces -o wide
NAMESPACE     NAME                         ORDER   SELECTOR
calico-demo   allow-busybox                50      app == 'porter'
client        knp.default.allow-ui         1000    projectcalico.org/orchestrator == 'k8s'
client        knp.default.default-deny     1000    projectcalico.org/orchestrator == 'k8s'
stars         knp.default.allow-ui         1000    projectcalico.org/orchestrator == 'k8s'
stars         knp.default.backend-policy   1000    projectcalico.org/orchestrator == 'k8s'
stars         knp.default.default-deny     1000    projectcalico.org/orchestrator == 'k8s'

기존 Calico 글로벌 네트워크 정책 확인하기

calicoctl get globalnetworkpolicy -o wide
NAME                  ORDER   SELECTOR
default-app-policy    100
egress-lockdown       600
default-node-policy   100     has(kubernetes.io/hostname)
nodeport-policy       100     has(kubernetes.io/hostname)

정책 셀렉터와 순서 확인하기

예를 들면:

calicoctl get np -n yaobank -o wide

셀렉터가 매칭되어야 하는데 그렇지 않다면, 엔드포인트 IP와 실행 중인 노드를 확인하세요. 예를 들면:

kubectl get pod -l app=customer -n yaobank

더 알아보기 (Learn more)

컴포넌트 구조가 헷갈리면 Calico 아키텍처 개요 문서를 먼저 훑어보세요. 문제가 재현될 때마다 진단 로그를 수집해 두면 원인 분석이 훨씬 쉬워져요.