노드별 구성
노드별 구성 (Per-node configuration)
Cilium 에이전트의 구성을 노드 단위로 지정하는 방법을 설명할게요. CiliumNodeConfig 객체를 쓰면 특정 노드나 노드 집합에만 다른 설정을 적용할 수 있어요.
본문
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)
- 구성 개요 —
cilium-configConfigMap과 변경 방법을 살펴볼게요. - kube-proxy replacement
- ConfigMap drift detection