문제 해결 명령어
명령줄 도구로 클러스터 상태를 확인하고 문제를 해결하는 방법을 모은 참고 문서예요. 호스트, 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 아키텍처 개요 문서를 먼저 훑어보세요. 문제가 재현될 때마다 진단 로그를 수집해 두면 원인 분석이 훨씬 쉬워져요.