[k8s] kube-vip

[์›๋ณธ ๋งํฌ]

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ณ ๊ฐ€์šฉ์„ฑ์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด๊ฒƒ์ด๋‹ค.
"๊ทธ๋Ÿฌ๋ฉด kube API ์—”๋“œํฌ์ธํŠธ๋Š” ์–ด๋–ป๊ฒŒ HA๋ฅผ ๋ณด์žฅํ•˜๋Š”๊ฐ€?"

๊ฒฐ๊ตญ ์ฟ ๋ฒ„ ๋‚ด ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค๋“ค๋„ kube API์— ์ด์„œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š”๋ฐ, ์ฟ ๋ฒ„์˜ ์ผ๋ถ€ ํ•˜์œ„ ์‹œ์Šคํ…œ๋“ค์€ ์ด๊ฑธ HA ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

control plane ๋…ธ๋“œ๊ฐ€ 3๊ฐœ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋А ๋…ธ๋“œ์— ์ฐ”๋Ÿฌ์•ผ ํ• ๊นŒ? ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ์ฃฝ์œผ๋ฉด ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์˜ฎ๊ฒจ์•ผํ• ๊นŒ?
์ผ๋ฐ˜์ ์ธ Pod๋“ค์€ ์ž์ฒด์ ์ธ kubernetes.default.svc ์„œ๋น„์Šค ๊ณ„์ธต์„ ํ†ตํ•ด์„œ ์ด๊ฑธ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š”๋ฐ, ์„œ๋น„์Šค๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” kube-proxy(ํ˜น์€ CNI), kubelet, kube agent๋“ค์€ ๊ทธ ํ˜œํƒ์„ ๋ˆ„๋ฆฌ์ง€ ๋ชปํ•ด์„œ ์—”๋“œํฌ์ธํŠธ ๋…ธ๋“œ๊ฐ€ ๋ป—์œผ๋ฉด ํ†ต์‹ ์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๊ฐ€ kube-vip๋‹ค.
๋ณ„๋„์˜ LB๋ฅผ ์‹ ๋ขฐ์„ฑ ๋†’์€ ๊ณ„์ธต์— ๊ตฌ์ถ•ํ•ด๋„ ๋˜์ง€๋งŒ, ์ด๊ฑด ํ•ฉ์˜ ๊ธฐ๋ฐ˜์œผ๋กœ control plane ๋…ธ๋“œ๋“ค์ด ์ž์ฒด์ ์œผ๋กœ ๋ฆฌ๋”๋ฅผ ๋ฝ‘๊ณ  ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฆฌ๋” ๋…ธ๋“œ๊ฐ€ API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋œ๋‹ค.
์ด๋Ÿฌ๋ฉด ๊ฐ€์ƒ ๋‚ด๋ถ€ IP๋ฅผ ํ†ตํ•ด ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์ฃฝ๋”๋ผ๋„, ๊ฐ€์ƒ IP๋ฅผ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์™„์žฅ์„ ์žก๊ณ  ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.




๊ธฐ์กด k3s์— ์„ค์น˜ํ•˜๊ธฐ

๋จผ์ € VIP๋กœ ์‚ฌ์šฉํ•  IP๋ฅผ ์ •ํ•ด์•ผํ•œ๋‹ค.
LAN ๋‚ด์—์„œ ARP ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„์งœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ฏ€๋กœ, ๋ง ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.
๋‚œ 192.168.88.250๋กœ ์ ๋‹นํžˆ ์žก์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://kube-vip.io/manifests/rbac.yaml
kubectl apply -f kube-vip-ds.yaml # ์•„๋ž˜ ํŒŒ์ผ
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-vip-ds
  namespace: kube-system
  labels:
    app.kubernetes.io/name: kube-vip-ds
spec:
  selector:
    matchLabels:
      name: kube-vip-ds
  template:
    metadata:
      labels:
        name: kube-vip-ds
    spec:
      hostNetwork: true
      serviceAccountName: kube-vip
      nodeSelector:
        node-role.kubernetes.io/control-plane: "true"
      tolerations:
        - operator: Exists
          effect: NoSchedule
      containers:
        - name: kube-vip
          image: ghcr.io/kube-vip/kube-vip:v1.2.4
          args: [manager]
          env:
            - { name: vip_arp,            value: "true" }
            - { name: port,               value: "6443" }
            - { name: vip_cidr,           value: "32" }
            - { name: cp_enable,          value: "true" }
            - { name: cp_namespace,       value: kube-system }
            - { name: vip_leaderelection, value: "true" }
            - { name: vip_leaseduration,  value: "15" }
            - { name: vip_renewdeadline,  value: "10" }
            - { name: vip_retryperiod,    value: "2" }
            - { name: address,            value: "๊ฐ€์ƒIP" }
          securityContext:
            capabilities:
              add: [NET_ADMIN, NET_RAW]

๋ฐฉ๊ธˆ VIP๋กœ ์“ฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ๊ฑธ ์ €๊ธฐ ์ฃผ์†Œ์— ๋ฐ•์œผ๋ฉด ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  control plane ๋…ธ๋“œ์—๋งŒ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ–ˆ๋‹ค.

์ €๊ฑธ ๋‹ค ๋„์šฐ๊ณ , control plane ๋…ธ๋“œ์˜ ์—์ด์ „ํŠธ ํŒŒ์ผ์„ ์ „๋ถ€ ์—ด์–ด์„œ, tls-san ๋ชฉ๋ก์— ๋ฐฉ๊ธˆ VIP๋ฅผ ์ „๋ถ€ ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  tls ๋ชฉ๋ก์— VIP๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•ด์ค€๋‹ค.
๋‚˜์ค‘์— control plane์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ํ•ญ์ƒ VIP๋ฅผ ์ถ”๊ฐ€๋กœ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํ†ต์‹ ์ด ๋˜๋ฉด ๋„คํŠธ์›Œํฌ๋Š” ์ž˜ ์—ฎ์ธ ๊ฒƒ์ด๋‹ค.
์ด ๋‹ค์Œ์—, cilium์„ ์“ด๋‹ค๋ฉด cilium ์„ธํŒ…๋„ VIP๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๊ทธ๊ฑด ํ•˜๋‹จ์— ์ •๋ฆฌํ•ด๋†จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  control plane์ด ์•„๋‹Œ ์›Œ์ปค ๋…ธ๋“œ๋“ค๋„ VIP๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ฐ”๊ฟ”์ค€๋‹ค.
๊ทธ๋ž˜์•ผ ๋…ธ๋“œ ํ•˜๋‚˜ ๋ป—์—ˆ์„๋•Œ๋„ ํ†ต์‹ ์ด ์œ ์ง€๋œ๋‹ค.

sudo sed -i 's|https://192.168.88.202:6443|https://192.168.88.250:6443|' /etc/systemd/system/k3s-agent.service.env

sudo systemctl daemon-reload
sudo systemctl restart k3s-agent




Cilium์— VIP ์ ์šฉ (with helm)

Cilium์„ CNI๋กœ ์“ธ ๊ฒฝ์šฐ์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  helm์œผ๋กœ ์„ค์น˜ํ•ด๋†จ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

serviceHost๋ฅผ VIP๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ 


helm upgrade cilium cilium/cilium -n kube-system \
  --version 1.20.2 \
  -f cilium/values.yaml

kubectl -n kube-system rollout restart ds/cilium
kubectl -n kube-system rollout status ds/cilium

์žฌ์„ค์น˜ํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ด ๊ฐ’์ด VIP๋กœ ๋‚˜์˜ค๋ฉด ์ž˜ ๋œ ๊ฒƒ์ด๋‹ค.

kubectl -n kube-system exec ds/cilium -- sh -c 'echo "KUBERNETES_SERVICE_HOST=$KUBERNETES_SERVICE_HOST"'



์ฐธ์กฐ
https://kube-vip.io/docs/usage/k3s/
https://kube-vip.io/
https://medium.com/@siddharthsid533/how-i-got-kube-vip-working-with-my-k3s-cluster-without-breaking-things-668100703d5c

Search