๐ ๋ฌธ์ ๊ฐ์
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 ์ธ์ฆ ์ค๋ฅ ์์ด ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค! ๐