๐Ÿ›  Kubernetes์—์„œ certSANs์— ์‹ ๊ทœ IP ์ถ”๊ฐ€ํ•˜๊ธฐ

2โ€“3๋ถ„

๐Ÿ“Œ ๋ฌธ์ œ ๊ฐœ์š”

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ kubectl get node ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ TLS ์ธ์ฆ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

root@master1:~# k get node
Unable to connect to the server: tls: failed to verify certificate: x509: certificate is valid for
10.96.0.1, 192.168.135.51, 192.168.135.50, 127.0.0.1, 192.168.135.52, 192.168.135.53, not 192.168.135.25


๐Ÿ” ์˜ค๋ฅ˜ ๋ถ„์„:

  • ์ธ์ฆ์„œ์˜ Subject Alternative Name (SAN) ๋ชฉ๋ก์— 192.168.135.25๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•„ ์ธ์ฆ ์‹คํŒจ
  • ํ•ด๊ฒฐํ•˜๋ ค๋ฉด API ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ , ์ƒˆ๋กœ์šด IP๋ฅผ certSANs์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ

๐Ÿ’ก ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค

  • NAT(Network Address Translation)๋œ IP๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
    • ๋‚ด๋ถ€ IP์™€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  IP๊ฐ€ ๋‹ค๋ฅผ ๋•Œ, API ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ์— ์™ธ๋ถ€ IP๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด TLS ์˜ค๋ฅ˜ ๋ฐœ์ƒ

๐Ÿ”Ž 1. ํ˜„์žฌ SAN ๋ชฉ๋ก ํ™•์ธ

๋จผ์ €, ํ˜„์žฌ ์ธ์ฆ์„œ์˜ SAN ๋ชฉ๋ก์„ ํ™•์ธํ•˜์—ฌ ์ƒˆ๋กœ์šด IP๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A 1 "Subject Alternative Name


๐Ÿ“Œ ์ถœ๋ ฅ ์˜ˆ์‹œ:

X509v3 Subject Alternative Name:
    IP Address:10.96.0.1, IP Address:192.168.135.51, IP Address:192.168.135.50,
    IP Address:127.0.0.1, IP Address:192.168.135.52, IP Address:192.168.135.5

๐Ÿšจ 192.168.135.25์ด ๋น ์ ธ ์žˆ๋‹ค๋ฉด, certSANs ์„ค์ •์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง 2. kubeadm-config ์ˆ˜์ • ๋ฐ IP ์ถ”๊ฐ€

๐Ÿ”น ํ˜„์žฌ ์„ค์ • ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ

๋จผ์ €, ํ˜„์žฌ kubeadm-config ์„ค์ •์„ ํ™•์ธํ•˜๊ณ  ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค.

kubectl get configmap kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-config.yaml
cp kubeadm-config.yaml kubeadm-config-backup.yaml  # ๋ฐฑ์—…

๐Ÿ”น certSANs์— ์‹ ๊ทœ IP ์ถ”๊ฐ€

์ด์ œ kubeadm-config.yaml ํŒŒ์ผ์„ ์—ด์–ด certSANs ํ•ญ๋ชฉ์— 192.168.135.25์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

apiServer: # ์—†๋Š” ๊ฒฝ์šฐ ์‹ ๊ทœ ์ถ”๊ฐ€
  certSANs:
  - 127.0.0.1
  - 192.168.135.50
  - 192.168.135.51
  - 192.168.135.52
  - 192.168.135.53
  - 192.168.135.25  # ์‹ ๊ทœ IP ์ถ”๊ฐ€
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
controlPlaneEndpoint: 192.168.135.50:6443
kind: ClusterConfiguration


๐Ÿ“Œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”„ 3. ์ธ์ฆ์„œ ๊ฐฑ์‹  ๋ฐ ์ ์šฉ

์ด์ œ API ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 1) ๊ธฐ์กด ์ธ์ฆ์„œ ๋ฐฑ์—…

์•ˆ์ „ํ•œ ์ž‘์—…์„ ์œ„ํ•ด ๊ธฐ์กด ์ธ์ฆ์„œ๋ฅผ ๋ฐฑ์—…ํ•ด ๋‘ก๋‹ˆ๋‹ค.

mkdir -p /etc/kubernetes/pki/backup
mv /etc/kubernetes/pki/apiserver.* /etc/kubernetes/pki/backup

๐Ÿ”น 2) ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ ์ƒ์„ฑ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด SAN์ด ์ ์šฉ๋œ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

kubeadm init phase certs apiserver --config=kubeadm-config.yam

๐Ÿ“Œ ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ /etc/kubernetes/pki/apiserver.crt ํŒŒ์ผ์ด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”„ 4. API ์„œ๋ฒ„ ๋ฐ Kubelet ์žฌ์‹œ์ž‘

์ด์ œ ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด Kubernetes API ์„œ๋ฒ„์™€ Kubelet์„ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

systemctl restart kubelet
docker restart $(docker ps -q --filter "name=k8s_kube-apiserver

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด containerd์ธ ๊ฒฝ์šฐ:

crictl ps | grep kube-apiserver | awk '{print $1}' | xargs crictl sto


โœ… 5. ์ ์šฉ ํ™•์ธ ๋ฐ ๊ฒ€์ฆ

๐Ÿ”น 1) ์ƒˆ๋กœ์šด SAN ๋ชฉ๋ก ํ™•์ธ

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A 1 "Subject Alternative Name"

๐Ÿ“Œ ์ถœ๋ ฅ ์˜ˆ์‹œ (์ƒˆ๋กœ์šด IP๊ฐ€ ์ถ”๊ฐ€๋จ):

X509v3 Subject Alternative Name:
    IP Address:10.96.0.1, IP Address:192.168.135.51, IP Address:192.168.135.50,
    IP Address:127.0.0.1, IP Address:192.168.135.52, IP Address:192.168.135.53,
    IP Address:192.168.135.25  # โœ… ์ถ”๊ฐ€๋œ IP ํ™•์ธ


๐Ÿ”น 2) Kubernetes ์ •์ƒ ์ž‘๋™ ํ™•์ธ

์ด์ œ kubectl get nodes ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get nodes

๐Ÿ“Œ ์ •์ƒ์ ์ธ ์ถœ๋ ฅ ์˜ˆ์‹œ:

NAME        STATUS   ROLES           AGE   VERSION
master1     Ready    control-plane   50d   v1.27.14
worker1     Ready    worker          30d   v1.27.14
worker2     Ready    worker          30d   v1.27.14

๐Ÿš€ ์ด์ œ ์ƒˆ๋กœ์šด IP๋กœ๋„ Kubernetes API ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰


โš ๏ธ ์ถ”๊ฐ€ ์ฃผ์˜์‚ฌํ•ญ

  • ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ์ธ์ฆ์„œ ๋ฐฑ์—…์„ ํ•ด๋‘์„ธ์š”.
  • ๋งŒ์•ฝ kubeadm ์—†์ด ์ˆ˜๋™ ์„ค์น˜๋œ Kubernetes ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ์ง์ ‘ apiserver ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ์ฆ์„œ ๋ณ€๊ฒฝ ํ›„์—๋„ ๋ฌธ์ œ๊ฐ€ ์ง€์†๋œ๋‹ค๋ฉด, kube-controller-manager์™€ kube-scheduler๋„ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.

์ด์ œ Kubernetes API ์„œ๋ฒ„์˜ certSANs ๋ชฉ๋ก์— ์‹ ๊ทœ IP๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ์š”์•ฝํ•˜์ž๋ฉด:

1๏ธโƒฃ ํ˜„์žฌ SAN ๋ชฉ๋ก ํ™•์ธ

2๏ธโƒฃ kubeadm-config ์ˆ˜์ •

3๏ธโƒฃ ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ ์ƒ์„ฑ

4๏ธโƒฃ API ์„œ๋ฒ„ ๋ฐ Kubelet ์žฌ์‹œ์ž‘

5๏ธโƒฃ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜์˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

์ด์ œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ƒˆ๋กœ์šด IP๋กœ๋„ TLS ์ธ์ฆ ์˜ค๋ฅ˜ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€