CNI+Cilium+Calico+Weave+Kubenet
March 9, 2023

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

Troubleshooting.

  • Первое, на что нужно обратить внимание, а живы ли поды-агенты. Поды, которые создаются с помощью DaemonSet.