노드별 구성

노드별 구성 (Per-node configuration)

Cilium 에이전트의 구성을 노드 단위로 지정하는 방법을 설명할게요. CiliumNodeConfig 객체를 쓰면 특정 노드나 노드 집합에만 다른 설정을 적용할 수 있어요.

출처: Per-node configuration

본문

Cilium 에이전트 프로세스(일명 DaemonSet)는 노드별로 구성을 설정하는 것을 지원해요. 이를 통해 특정 노드 또는 노드 집합에 대해 cilium-config ConfigMap을 덮어쓸 수 있어요. 이 기능은 CiliumNodeConfig 객체로 관리돼요.

이 기능은 다음과 같은 경우에 유용해요.

  • 변경 사항을 점진적으로 롤아웃할 때.

  • 특정 하드웨어가 필요한 기능을 선택적으로 활성화할 때:

  • LoadBalancer & NodePort XDP 가속

  • IPv6 BIG TCP

CiliumNodeConfig 객체

CiliumNodeConfig 객체는 ConfigMap / 에이전트 인자를 덮어쓸 수 있게 해줘요. 이 객체는 필드 집합과 라벨 셀렉터로 구성돼요. 라벨 셀렉터는 구성이 적용될 노드를 정의해요. Kubernetes의 표준처럼, 빈 LabelSelector(예: {})는 모든 노드를 선택해요.

참고: CiliumNodeConfig를 만들거나 수정해도, 파드를 삭제하고 다시 생성하기 전까지(또는 노드를 재시작하기 전까지) 변경이 적용되지 않아요.

예시: 선택적 XDP 활성화

필요한 하드웨어가 있는 노드에서만 LoadBalancer & NodePort XDP 가속을 활성화하려면, 해당 노드에 라벨을 붙이고 그들의 구성을 덮어쓰면 돼요.

apiVersion: cilium.io/v2
kind: CiliumNodeConfig
metadata:
  namespace: kube-system
  name: enable-xdp
spec:
  nodeSelector:
    matchLabels:
      io.cilium.xdp-offload: "true"
  defaults:
    bpf-lb-acceleration: native

예시: KubeProxyReplacement 롤아웃

kube-proxy replacement를 점진적으로 롤아웃하려면 CiliumNodeConfig 기능을 사용해도 좋아요. 이렇게 하면 모든 마이그레이션된 노드에 io.cilium.migration/kube-proxy-replacement: true 라벨이 붙어요.

경고: Cilium을 Helm 값 k8sServiceHost와 k8sServicePort로 설치했어야 해요. 그렇지 않으면 kube-proxy가 제거된 후 Cilium이 Kubernetes APIServer에 도달할 수 없게 돼요. 이 두 값은 helm upgrade로 실행 중인 클러스터에 적용할 수 있어요.

  • kube-proxy를 마이그레이션되지 않은 노드에서만 실행되도록 패치해요.
kubectl -n kube-system patch daemonset kube-proxy --patch '{"spec": {"template": {"spec": {"affinity": {"nodeAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions": [{"key": "io.cilium.migration/kube-proxy-replacement", "operator": "NotIn", "values": ["true"]}]}]}}}}}}}'
  • 마이그레이션된 노드에서 Cilium이 kube-proxy replacement를 사용하도록 구성해요.
cat <<EOF | kubectl apply --server-side -f -
apiVersion: cilium.io/v2
kind: CiliumNodeConfig
metadata:
  namespace: kube-system
  name: kube-proxy-replacement
spec:
  nodeSelector:
    matchLabels:
      io.cilium.migration/kube-proxy-replacement: "true"
  defaults:
    kube-proxy-replacement: "true"
    kube-proxy-replacement-healthz-bind-address: "'0.0.0.0:10256'"

EOF
  • 마이그레이션할 노드를 선택하세요. 선택적으로 그 노드를 cordon/drain할 수 있어요.
export NODE=kind-worker
kubectl label node $NODE --overwrite 'io.cilium.migration/kube-proxy-replacement=true'
kubectl cordon $NODE
  • 구성을 다시 로드하기 위해 Cilium DaemonSet을 삭제해요.
kubectl -n kube-system delete pod -l k8s-app=cilium --field-selector spec.nodeName=$NODE
  • Cilium이 올바른 구성을 가졌는지 확인해요.
kubectl -n kube-system exec $(kubectl -n kube-system get pod -l k8s-app=cilium --field-selector spec.nodeName=$NODE -o name) -c cilium-agent -- \
    cilium config get kube-proxy-replacement
true
  • 노드 uncordon
kubectl uncordon $NODE
  • 정리: 기본값을 kube-proxy-replacement로 설정해요.
cilium config set --restart=false kube-proxy-replacement true
cilium config set --restart=false kube-proxy-replacement-healthz-bind-address '0.0.0.0:10256'
kubectl -n kube-system delete ciliumnodeconfig kube-proxy-replacement
  • 정리: kube-proxy daemonset 삭제, 노드 라벨 제거
kubectl -n kube-system delete daemonset kube-proxy
kubectl label node --all --overwrite 'io.cilium.migration/kube-proxy-replacement-'

더 알아보기 (Learn more)