Cilium. About. Troubleshooting
Информация про cilium и диагностика неисправностей.
Cilium - это известный CNI, использующий в своей работе eBPF стек.
https://cilium.io - официальный сайт проекта.
Покрывает собой задачи L3 балансировки трафика, NetworkPolicy, observability.
Поддерживает туннельный режим (vxlan).
Cilium состоит из трёх основных компонентов: CNI плагина cilium-cni, даймонсета cilium-agent и контроллера cilium-operator. Базовый принцип работы простой: CNI сообщает агентам об изменениях в контейнерах, агенты на узлах ходят в apiserver, где лежат CRD и другие ресурсы, описывающие связность кластера, а потом настраивает в соответствии с этим eBPF.
eBPF - это возможность запустить кастомный код в kernel space на определенные события
Cilium создаёт под свои нужды CRD следующих типов:
kubectl api-resources | grep "cilium" ciliumclusterwidenetworkpolicies ccnp cilium.io/v2 false CiliumClusterwideNetworkPolicy ciliumegressnatpolicies cilium.io/v2alpha1 false CiliumEgressNATPolicy ciliumendpoints cep,ciliumep cilium.io/v2 true CiliumEndpoint ciliumexternalworkloads cew cilium.io/v2 false CiliumExternalWorkload ciliumidentities ciliumid cilium.io/v2 false CiliumIdentity ciliumlocalredirectpolicies clrp cilium.io/v2 true CiliumLocalRedirectPolicy ciliumnetworkpolicies cnp,ciliumnp cilium.io/v2 true CiliumNetworkPolicy ciliumnodes cn,ciliumn cilium.io/v2 false CiliumNode
- CiliumEndpoint -- сущность, отражающая эндпоинты, на которые нужно направлять трафик. Для каждого пода создаётся такой endpoint, а затем на основании списка endpoint'ов cilium-agent настраивает ebpf на каждой из нод
- CiliumNode -- сущность, отражающая ноды, на которых стоит cilium-agent, и на которые нужно уметь направлять трафик из подов. В нашем случае это ноды кластера и его мастера
- CiliumIdentity — сущность, необходимая для управления политиками безопасности. Все endpoint'ы, наделённые определённым набором существенных для безопасности лейблов, привязываются к единому identity, что позволяет легко управлять их доступами.
Посмотреть текущую версию cilium
# Посмотреть версию cilium kubectl exec -ti -n kube-system <cilium_pod_agent> -- cilium version
Внутри агентов также есть обычный shell.
kubectl exec -ti -n kube-system <cilium_pod_agent> -- /bin/bash
Сбор информации в cilium agent.
# Проверить состояние cilium на ноде kubectl exec -ti -n kube-system <cilium_pod_agent> -- cilium-health ping
# Посмотреть статус cilium агента на одной из нод kubectl exec -ti -n kube-system <cilium_pod_agent> -- cilium status KVStore: Ok Disabled Kubernetes: Ok 1.24 (v1.24.8) [linux/amd64] Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumLocalRedirectPolicy", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"] KubeProxyReplacement: Strict [eth0 10.129.0.31 (Direct Routing)] Cilium: Ok 1.10.6 (v1.10.6-17d3d15) NodeMonitor: Listening for events on 2 CPUs with 64x4096 of shared memory Cilium health daemon: Ok IPAM: IPv4: 8/254 allocated from 10.20.7.0/24, BandwidthManager: EDT with BPF [eth0] Host Routing: Legacy Masquerading: Disabled Controller Status: 44/44 healthy Proxy Status: OK, ip 10.20.7.92, 0 redirects active on ports 10000-20000 Hubble: Ok Current/Max Flows: 4095/4095 (100.00%), Flows/s: 6.07 Metrics: Ok Encryption: Disabled Cluster health: 12/13 reachable (2023-07-05T12:26:33Z) Name IP Node Endpoints cl1i51vam4figq159qsh-osaz 10.129.0.6 reachable unreachable
kubectl exec -ti -n kube-system <cilium_pod_agent> -- cilium-health get Daemon uptime: 689h55m2.955335796s Node load: 0.00 0.03 0.04 KVStore: Ok Disabled Kubernetes: Ok 1.24 (v1.24.8) [linux/amd64] Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumLocalRedirectPolicy", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"] KubeProxyReplacement: Strict [eth0 10.129.0.31 (Direct Routing)] Cilium: Ok 1.10.6 (v1.10.6-17d3d15) NodeMonitor: Listening for events on 2 CPUs with 64x4096 of shared memory Cilium health daemon: Ok IPAM: IPv4: 8/254 allocated from 10.20.7.0/24, BandwidthManager: EDT with BPF [eth0] Host Routing: Legacy Masquerading: Disabled Controller Status: 44/44 healthy Proxy Status: OK, ip 10.20.7.92, 0 redirects active on ports 10000-20000 Hubble: Ok Current/Max Flows: 4095/4095 (100.00%), Flows/s: 6.06 Metrics: Ok Encryption: Disabled
Посмотреть список нод, которые есть в кластере.
cilium node list Name IPv4 Address Endpoint CIDR IPv6 Address Endpoint CIDR cl1i51vam4figq159qsh-osaz 10.129.0.6 10.20.9.0/24 cl1k0hr81fu4s6fuqlue-ahoq 10.130.0.15 10.20.4.0/24 cl1k0hr81fu4s6fuqlue-ejuj 10.128.0.54 10.20.0.0/24 cl1k0hr81fu4s6fuqlue-etyf 10.130.0.18 10.20.8.0/24 cl1k0hr81fu4s6fuqlue-iqep 10.128.0.16 10.20.5.0/24 cl1k0hr81fu4s6fuqlue-ucaj 10.129.0.15 10.20.1.0/24 cl1k0hr81fu4s6fuqlue-ugeb 10.129.0.31 10.20.7.0/24 cl1k0hr81fu4s6fuqlue-uguf 10.129.0.40 10.20.2.0/24 cl1k0hr81fu4s6fuqlue-yguq 10.128.0.46 10.20.3.0/24 cl1k0hr81fu4s6fuqlue-ynip 10.130.0.17 10.20.6.0/24 mk8s-master-catp5rsht6a7plqrpocr-a 10.128.0.14 198.18.0.0/24 mk8s-master-catp5rsht6a7plqrpocr-b 10.129.0.28 198.18.1.0/24 mk8s-master-catp5rsht6a7plqrpocr-c 10.130.0.19 198.18.2.0/24
# Проверяет статус всех нод в кластере. kubectl exec -ti -n kube-system <cilium_pod_agent> — cilium-health status mk8s-master-catp5rsht6a7plqrpocr-a: Host connectivity to 10.128.0.14: ICMP to stack: OK, RTT=7.57672ms HTTP to agent: OK, RTT=9.132278ms mk8s-master-catp5rsht6a7plqrpocr-b: Host connectivity to 10.129.0.28: ICMP to stack: OK, RTT=7.557598ms HTTP to agent: OK, RTT=12.496041ms mk8s-master-catp5rsht6a7plqrpocr-c: Host connectivity to 10.130.0.19: ICMP to stack: OK, RTT=12.071252ms HTTP to agent: OK, RTT=6.995271ms
cilium ip list cilium service list cilium lrp list cilium endpoint list
kubectl get no -o wide kubectl get cn
cilium monitor --type drop -D cilium status --verbose | grep -i graceful