/ ์ข ๋ฅ์ ๋ฒ๊ทธ
๋ฉํธ๋ฆญ ์๋ฒ ์์์ด ๋ฌธ์ ์ ๋ํ kubeadm
์ชฝ ์ด๊ธฐ
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:43:08Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
ํ๊ฒฝ :
kubectl version
) :$ kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:46:06Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:36:14Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
uname -a
) :$ uname -a
Linux ip-172-31-1-118 4.15.0-1023-aws #23-Ubuntu SMP Mon Sep 24 16:31:06 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
kubeadm์ /etc/kubernetes/pki/ca.pem
์๋์์๋ ๊ฒ๊ณผ ๋ค๋ฅธ CA๋ก ์๋ช
๋ /var/lib/kubelet/pki/kubelet.*
์๋์ ์ธ์ฆ์๋ฅผ ๋ง๋ญ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก metrics-server์ ๊ฐ์ ์ผ๋ถ ์ฑ์ kubelet์ K8s ๋ง์คํฐ์ ๋ค๋ฅธ CA์์ ์๋ช ํ ์ธ์ฆ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ณด์ kubelet์์ ํต๊ณ๋ฅผ ์์ง ํ ์ ์์ต๋๋ค.
์ค๋ฅ ์ํ :
E1108 23:49:32.090084 1 manager.go:102] unable to fully collect metrics: [unable to fully scrape metrics from source kubelet_summary:ip-x-x-x-x: unable to fetch metrics from Kubelet ip-x-x-x-x (ip-x-x-x-x): Get https://ip-x-x-x-x:10250/stats/summary/: x509: certificate signed by unknown authority, unable to fully scrape metrics from source kubelet_summary:ip-x-x-x-x: unable to fetch metrics from Kubelet ip-x-x-x-x (ip-x-x-x-x): Get https://ip-x-x-x-x:10250/stats/summary/: x509: certificate is valid for x.x.x.x not ip-x-x-x-x]
์คํ์ ๋ฉํธ๋ฆญ ์๋ฒ ๋ฅผ ์ค์นํ์ญ์์ค.
$ kubectl -n kube-system ๋ก๊ทธ
์ฌ๊ธฐ์ ๋ ๋ง์ ๋ฐฐ๊ฒฝ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ๋๋ ๋จ๊ณ๋ ์์ต๋๋ค.
ํธ์ง : neolit123
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ ๊ณต ์ธ์ฆ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒด ์๋ช
๋๋ค๋ ๊ฒ์
๋๋ค.
์ค๋ช
์ ์
๋ฐ์ดํธ๋ https://github.com/kubernetes/website/pull/27071 ์ ์ฐธ์กฐ
@ raravena80 /var/lib/kubelet/pki/
.. ์๋ kubeadm์์ ๋ง๋ ์ธ์ฆ์๋ฅผ ์์ง ๋ชปํฉ๋๋ค. ์น์ ํ๊ฒ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น? ์ : kubeadm ๊ตฌ์ฑ ํ์ผ, ํด๋ฌ์คํฐ ์์ฑ ๋จ๊ณ
@fabriziopandini ์ธ์ฆ์๊ฐ kubeadm์ ์ํด ์์ฑ๋์๋์ง ํ์คํ์ง ์์ง๋ง ์ผ๋ฐ์ ์ธ ์ ์ฐจ๋ ์ฌ๊ธฐ ์ ์ค๋ช ๋์ด
๋๋ ํ ๋ฆฌ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
root@ip-172-31-1-118:/var/lib/kubelet/pki# pwd
/var/lib/kubelet/pki
root@ip-172-31-1-118:/var/lib/kubelet/pki# ls -al
total 24
drwxr-xr-x 2 root root 4096 Jul 23 21:10 .
drwxr-xr-x 7 root root 4096 Nov 12 04:52 ..
-rw------- 1 root root 2810 Jul 23 21:09 kubelet-client-2018-07-23-21-09-53.pem
-rw------- 1 root root 1159 Jul 23 21:10 kubelet-client-2018-07-23-21-10-43.pem
lrwxrwxrwx 1 root root 59 Jul 23 21:10 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2018-07-23-21-10-43.pem
-rw-r--r-- 1 root root 1501 Nov 8 23:53 kubelet.crt
-rw------- 1 root root 1679 Nov 8 23:53 kubelet.key
root@ip-172-31-1-118:/var/lib/kubelet/pki#
kubelet์ด ์ฒ์๋ก๋ ํ ๋ kubelet.crt
๋ฐ kubelet.key
ํ์ผ์ด ์์ฑ๋ฉ๋๊น?
@ raravena80 ์ค๋ช
์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค
์๋ง๋ ์ฌ๊ธฐ์ ์์ ํ ๋งฅ๋ฝ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋๋ต ํ ์ฌ์ง๋ฅผ ๋จ๊ฒจ ๋ก๋๋ค.
๋จ ํ๋์ ์ฐธ๊ณ ์ฌํญ (๋์์ด ๋ ์ ์์)
Kubeadm์ ์ด๋ฏธ apiserver-kubelet-client
๋ผ๋ ์ธ์ฆ์๋ฅผ ์์ฑํ์ฌ API ์๋ฒ๊ฐ kubelet๊ณผ ์์ ํ๊ฒ ํต์ ํ ์ ์๋๋กํฉ๋๋ค. ca์ ์ํด ์๋ช
๋๊ณ ํ์ํ RBAC ๊ท์น์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
/ ํ ๋น @liztio
๋๋ ์ด๊ฒ์ด kubelet์ ์๋ฒ ์ธ์ฆ์๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. TLS ์๋ฒ ๋ถํธ ์คํธ๋ฉ์ Kubelet ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฒ ์ธ์ฆ์๋ฅผ ํ์ ํ๋ ค๊ณ ์๋ํ์ง๋ง, ๋ถํํ๋ Kubelet์ด ๋ถํธ ์คํธ๋ฉ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์๋ฒ ์ธ์ฆ์๋ฅผ ์์ฒญํ ์ ์์์ต๋๋ค. Kubelet์ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ์๋ฒ ์ธ์ฆ์์ ๊ธฐ๋ณธ ๋์์ผ๋ก ๋๋์๊ฐ๋๋ค.
๋ด๊ฐ ์๋ ํ, ํ์ฌ ์ ์ผํ ๋ฐฉ๋ฒ์ Kubelet์ ์๋ฒ ์ธ์ฆ์๋ฅผ ๋์ญ ์ธ์์ ์์ฑํ์ฌ ๊ฒฐ์ ์ ๊ฒฝ๋ก์ ๋ฐฐ์นํ๋ ๊ฒ์ ๋๋ค. kubelet (kubeadm์์ ๊ตฌ์ฑ)์ด์ด๋ฅผ ์ ํํ๊ณ ์ด์ ๋ฐ๋ผ ์ผ๋ถ kubelet ํ๋๊ทธ๋ฅผ ์ค์ ํฉ๋๋ค. ; ์ฐธ์กฐ : https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#client -and-serving-certificates
apiserver-kubelet-client
๋ API ์๋ฒ๊ฐ kubelet์ ์ ๊ณต ํ ํด๋ผ์ด์ธํธ ์ธ์ฆ์์ด์ง๋ง kubelet์ k8s CA์์ ์๋ช
ํ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ขฐํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
# cat /var/lib/kubelet/config.yaml
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 2m0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
k8s CA๊ฐ ์๋ช ํด์ผํ๋ ์๋ฒ๋ก์์ kubelet์ ์ ์์ ์๋ ์ง๋ฌธ์ผ๋ก ๋์์ต๋๋ค.
์ด ๊ธ์ ๋์๋ ๊ด๋ จ ํ ๋ก ๋ ์์ต๋๋ค : https://github.com/kubernetes/kubeadm/issues/118
ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ์์ฒญ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก kubeadm์ด ์ ํจํ ๋ถํธ ์คํธ๋ฉ ํ ํฐ์ผ๋ก ์๋ฒ ์ธ์ฆ์ ์์ฒญ์ ๋ํ CSR ์น์ธ์๋ฅผ ์ถ๊ฐํด์ผ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
kubelet์ด ์์ฒด ์๋ช ๋ CA๋ฅผ configmap ์ด๋๊ฐ์ ์ ๋ก๋ํ๋๋กํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? nodeadmission ํ๋ฌ๊ทธ์ธ์ ์์ ์ configmap์ผ๋ก ๋ง ์ ํ ํ ์ ์์ต๋๋ค. metrics-server๋์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
๊ฐ๋ฅํ๋ค๋ฉด ์ธ์ฆ์ ์์ฒญ / ์ํ์ ์ํด kubelet์ ๋ด์ฅ ๋ TLS ๋ถํธ ์คํธ๋ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@alexbrand ๋์ํฉ๋๋ค
kubelet TLS ๋ถํธ ์คํธ๋ฉ ํ์ ์ด๋ค ์ด์ ๋ก ๋ ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ๋ง ์์ฑํฉ๋๋ค.
--bootstrap-kubeconfig string
Path to a kubeconfig file that will be used to get client certificate for kubelet. If the file specified by --kubeconfig does not exist, the bootstrap kubeconfig is used to request a client certificate from the API server. On success, a kubeconfig file referencing the generated client certificate and key is written to the path specified by --kubeconfig. The client certificate and key file will be stored in the directory pointed by --cert-dir.
๊ทธ๋ฆฌ๊ณ kubeadm์ ์ด๋ฏธ ์ด๊ฒ์ํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ด kubelet ๊ธฐ๋ฅ ์์ฒญ์ผ๊น์?
๋ฌธ์ ๋ฅผ ์์ฝ ํด ๋ณด๊ฒ ์ต๋๋ค.
@anitgandhi ์ ์ํด ์ค๋ช
๋
https://github.com/kubernetes/kubeadm/issues/1223#issuecomment -454572577
์ฌ๊ธฐ์ kubeadm์ ๋ฌธ์ ๋ kubelet์ ๋ช ๊ฐ์ง ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
--tls-cert-file=<some-path>/kubelet.crt
--tls-private-key-file=<some-path>/kubelet.key
์ด๋ฌํ ํ๋๊ทธ๊ฐ ์์ผ๋ฉด kubelet์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒด ์๋ช ์ผ๋ก ์ค์ ๋์ด ์ฒ์ ์คํ๋ ๋ ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ฉฐ ๋ค์์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
sudo openssl verify -verbose -CAfile /var/lib/kubelet/pki/kubelet.crt /var/lib/kubelet/pki/kubelet.crt
ํด๋ฌ์คํฐ CA ( /etc/kubernetes/ca.crt
)์์ ์๋ช
ํ ์ธ์ฆ์ ๋์ ์์ฒด ์๋ช
๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฒด ์๋ช
๋ ์ธ์ฆ์ SAN์๋ DNS:hostname
๋ง ํฌํจ๋๋ฏ๋ก ๋ฉํธ๋ฆญ ์๋ฒ์ ๊ฐ์ ๋ฐฐํฌ๋ kubelet์ ์คํฌ ๋ ์ด ํ ํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ํด๊ฒฐ์ฑ
:
A) ์๋ก์ด kubelet.crt/key
์, ์ด์์ ์ผ๋ก๋ /var/lib/kubelet/pki
๋ฏธ๋ง์ ๋
ธ๋๋ฅผ ๊ตฌํํ๊ณ ์ถ๊ฐ kubelet ํ๋๊ทธ --tls-cert-file
, --tls-private-key-file
ํฉ๋๋ค.
B) ๋ฌธ์๋ @ raravena80 ์ด ์ฌ๊ธฐ์์ ํ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ์จ ๋๋งจ๋๋ก ํ์ฑํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค : https://stackoverflow.com/questions/53212149/x509-certificate-signed-by-unknown-authority-kubeadm/53218524#53218524
Kubernetes CSR / kubeadm ๋ช
๋ น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ธ์
๋๋ค.
C) @alexbrand์ ์ฝ๋ฉํธ
๊ฐ๋ฅํ๋ค๋ฉด ์ธ์ฆ์ ์์ฒญ / ์ํ์ ์ํด kubelet์ ๋ด์ฅ ๋ TLS ๋ถํธ ์คํธ๋ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
D)?
@ kubernetes / sig-cluster-lifecycle
๋์๊ฒ ์ด๊ฒ์ ๋ฒ๊ทธ / ๊ธฐ๋ฅ ์ฌ์ด์ ๊ณต๊ฐ์์ ๋ณด์ธ๋ค.
์ฐธ์กฐ :
https://github.com/kubernetes/community/pull/602/files
๋ง์ ๋ถํธ ์คํธ๋ฉ ํ ํฐ ํด๋ผ์ด์ธํธ cert / CSR ๋ ผ๋ฆฌ kubelet + kubeadm์ด ์ด์ ๋ํ ๊ณตํต ๋ ผ๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ต์ B + C ์ฌ์ด์ ๋ญ๊ฐ๋ฅผํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์์ฝ ํด ๋ณด๊ฒ ์ต๋๋ค.
@anitgandhi ์ ์ํด ์ค๋ช ๋
# 1223 (์ฝ๋ฉํธ)์ฌ๊ธฐ์ kubeadm์ ๋ฌธ์ ๋ kubelet์ ๋ช ๊ฐ์ง ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
--tls-cert-file=<some-path>/kubelet.crt --tls-private-key-file=<some-path>/kubelet.key
์ด๋ฌํ ํ๋๊ทธ๊ฐ ์์ผ๋ฉด kubelet์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒด ์๋ช ์ผ๋ก ์ค์ ๋์ด ์ฒ์ ์คํ๋ ๋ ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ฉฐ ๋ค์์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
sudo openssl verify -verbose -CAfile /var/lib/kubelet/pki/kubelet.crt /var/lib/kubelet/pki/kubelet.crt
ํด๋ฌ์คํฐ CA (
/etc/kubernetes/ca.crt
)์์ ์๋ช ํ ์ธ์ฆ์ ๋์ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฒด ์๋ช ๋ ์ธ์ฆ์ SAN์๋DNS:hostname
๋ง ํฌํจ๋๋ฏ๋ก ๋ฉํธ๋ฆญ ์๋ฒ์ ๊ฐ์ ๋ฐฐํฌ๋ kubelet์ ์คํฌ ๋ ์ด ํ ํ ์ ์์ต๋๋ค.๊ฐ๋ฅํ ํด๊ฒฐ์ฑ :
A) ์๋ก์ดkubelet.crt/key
์, ์ด์์ ์ผ๋ก๋/var/lib/kubelet/pki
๋ฏธ๋ง์ ๋ ธ๋๋ฅผ ๊ตฌํํ๊ณ ์ถ๊ฐ kubelet ํ๋๊ทธ--tls-cert-file
,--tls-private-key-file
ํฉ๋๋ค.B) ๋ฌธ์๋ @ raravena80 ์ด ์ฌ๊ธฐ์์ ํ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ์จ ๋๋งจ๋๋ก ํ์ฑํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค : https://stackoverflow.com/questions/53212149/x509-certificate-signed-by-unknown-authority-kubeadm/53218524#53218524
Kubernetes CSR / kubeadm ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ธ์ ๋๋ค.C) @alexbrand์ ์ฝ๋ฉํธ
๊ฐ๋ฅํ๋ค๋ฉด ์ธ์ฆ์ ์์ฒญ / ์ํ์ ์ํด kubelet์ ๋ด์ฅ ๋ TLS ๋ถํธ ์คํธ๋ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
D)?
@ kubernetes / sig-cluster-lifecycle
๋์๊ฒ ์ด๊ฒ์ ๋ฒ๊ทธ / ๊ธฐ๋ฅ ์ฌ์ด์ ๊ณต๊ฐ์์ ๋ณด์ธ๋ค.์ฐธ์กฐ :
https://github.com/kubernetes/community/pull/602/files
ํ๋ฅญํ ์์ฝ @ neolit123 . ์ด๊ฒ์ด ๋ค์ ์ฌ์ดํด๋ก ๋์ด๊ฐ ๊ฒ์ธ์ง ์๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๊ฒ์ฒ๋ผ ์งํ์ค์ธ ์์ ์ธ์ง ์๊ณ ์์ต๋๊น? ์ฃผ๋ก ๋ชจ๋ ๋ฐฐํฌ๊ฐ ์ํ๋ ๋ฉํธ๋ฆญ ์๋ฒ ๋๋ฌธ์ ๋ฌป์ต๋๋ค.)
@randomvariable ์ ์ด์ ๋ํ ๋ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค.
์ง๊ธ๊น์ง ๋
ผ์ํ ๋ด์ฉ์์ ํด๋ฌ์คํฐ CA๋ก kubelet-serving ์ธ์ฆ์์ ์๋ช
ํ๋ ๊ฒ์ ์ฃผ์ ํ๊ณ ์์ต๋๋ค. ์ด ์ฃผ์ ๋ ์ถ๊ฐ ๋
ผ์๊ฐ ํ์ํฉ๋๋ค.
/ remove-help
๊ตฌํํ ์๋ฃจ์ ์ด ์์ง ์ ํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๊ฒ์ ๋ํ ์์ง์? kubeadm ๋ฐฐํฌ ํด๋ฌ์คํฐ ๋ด์์ ์๋ ํ์ฅ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด ์คํ ์ค์ ๋๋ค.
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ kubelet ์ธ์ฆ์์ CA ๊ฒ์ฌ๋ฅผ ๋๋ ๊ฒ์ ๋๋ค.
helm install --set 'args={--kubelet-insecure-tls}' --namespace kube-system metrics stable/metrics-serve
์ค์ ๋ก๋ ๋์์ธ ์ ์์์ ์ฐจ๋จ๋ฉ๋๋ค.
์ฌ๋ฌ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ค๋จ ๋ ๋ฌธ์ ๋ฅผ ๋ฌธ์ํํ๋ ์์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://github.com/kubernetes/kubeadm/issues/1602
--kubelet-insecure-tls
์ด๊ฒ์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ด์์ ์ด์ง ์์ ์ ์์ต๋๋ค.
90 ์ผ ๋์ ํ๋์ด ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ถ์คํด์ง๋๋ค.
/remove-lifecycle stale
ํ์ฌ ์ต์ ๋ฌธ์ ๋ก ํ์ํฉ๋๋ค.
๋นํ์ฑ ๋ฌธ์ ๋ ์ถ๊ฐ๋ก 30 ์ผ ๋์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฉ๊ณ ๊ฒฐ๊ตญ ์ข
๋ฃ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ง๊ธ ์ข
๋ฃํด๋ ์์ ํ๋ค๋ฉด /close
ํ์ฌ ์ข
๋ฃํ์ธ์.
sig-testing, kubernetes / test-infra ๋ฐ / ๋๋ fejta์ ํผ๋๋ฐฑ์
/ lifecycle stale
/ lifecycle frozen
kubeadm์ ์ฌ์ฉํ์ฌ v1.18.2 ํด๋ฌ์คํฐ๋ฅผ ๋ง๋๋ ์ ํํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
metrics-server๋ฅผ ์ค์ ํ ๋ kubelet-insecure-tls
ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ฑฐ๋ kublet "out of band"์ ๋ํ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ kubernetes CA๋ก ์๋ช
ํ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
kubelet ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์๊ฐํ์ง๋ง ๋น์ฐํ CN = system:node:nodename
๋ฐ๊ธ๋๊ณ SAN์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ด๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ํ
์คํธํ์ต๋๋ค. ์ฃผ์ฒด ๋์ฒด ์ด๋ฆ์ผ๋ก ๋
ธ๋ ์ด๋ฆ์ด์๋ ๊ฒฝ์ฐ ๋์ผํ ์ธ์ฆ์๋ฅผ ์๋ฒ / ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น? ํ์ง๋ง ์๋ฒ / ํด๋ผ์ด์ธํธ์ ๋ํด ๋ณ๋์ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
/ remove-lifecycle frozen
/ lifecycle frozen
๋ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋๋ก ๊ณ ์ ๋์ด ์์ต๋๋ค.
์ฃผ์ฒด ๋์ฒด ์ด๋ฆ์ผ๋ก ๋ ธ๋ ์ด๋ฆ์ด์๋ ๊ฒฝ์ฐ ๋์ผํ ์ธ์ฆ์๋ฅผ ์๋ฒ / ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น?
์ด๋ก ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ kubelet์ด ๊ฒ์ฆํ์ง ์๋ ํ-์๋ฅผ ๋ค์ด "ํด๋ผ์ด์ธํธ ์ธ์ฆ์์๋ SAN์ด ์์ด์ผํฉ๋๋ค".
ํ์ง๋ง ์๋ฒ / ํด๋ผ์ด์ธํธ์ ๋ํด ๋ณ๋์ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
ํผํ ์์๋ ๊ฒฝ์ฐ์๋ ๋ณ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. kubelet / auth {z | n} ๊ด๋ฆฌ์๊ฐ์ด ์ธ๋ถ ์ฌํญ์ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค.
์ผ. ์กฐ๊ธ ๋ ํํค ์ณค์ต๋๋ค. Kubelet ๊ตฌ์ฑ ์ต์
serverTLSBootstrap: true
์ ์ค์ ๋ก ์ ๊ณต ์ธ์ฆ์์ ๋ํ CSR์ ์์ฑ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์น์ธ๋์ง ์์ ์ฑ๋ก ๋จ์ต๋๋ค. ์ด๋ ์ชฝ์ด ๊ด์ฐฎ์๊น์?
rotateCertificates: true
๋ฐ serverTLSBootsrap: true
๋ฅผ ๋ชจ๋ ์ค์ ํ ๋ค์ ์ ๊ณต ์ธ์ฆ์์ ๋ํ CSR์ ์น์ธํ๋ ๊ฒ์ด ์ฌ๊ธฐ๋ก ์ด๋ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์์ฒญ / ๋ฐ๊ธ ๋ ์ ๊ณต ์ธ์ฆ์๋ O = system:nodes, CN = system:node:<nodename>
๋ํ ๊ฒ์ด๋ฉฐ ์ฃผ์ฒด ๋์ฒด ์ด๋ฆ์ DNS: <nodename>, IP Address: <node IP address>
์ ์ด๋ serverTLSBootstrap ๊ตฌ์ฑ ์ต์ ์ ํ์ฑํ ํ ๋ kubeadm์ด ์๋ฒ ์ธ์ฆ์๋ฅผ ์น์ธํ๋ ๊ฒ์ด ์ฌ์ด ์ผ์ ๋๊น? ์๋๋ฉด kubeadm๋ ์น์ธ์ ํ ์ ์์ต๋๊น?
์ผ. ์กฐ๊ธ ๋ ํํค ์ณค์ต๋๋ค. Kubelet ๊ตฌ์ฑ ์ต์
serverTLSBootstrap: true
์ ์ค์ ๋ก ์ ๊ณต ์ธ์ฆ์์ ๋ํ CSR์ ์์ฑ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์น์ธ๋์ง ์์ ์ฑ๋ก ๋จ์ต๋๋ค. ์ด๋ ์ชฝ์ด ๊ด์ฐฎ์๊น์?
rotateCertificates: true
๋ฐserverTLSBootsrap: true
๋ฅผ ๋ชจ๋ ์ค์ ํ ๋ค์ ์ ๊ณต ์ธ์ฆ์์ ๋ํ CSR์ ์น์ธํ๋ ๊ฒ์ด ์ฌ๊ธฐ๋ก ์ด๋ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์์ฒญ / ๋ฐ๊ธ ๋ ์ ๊ณต ์ธ์ฆ์๋O = system:nodes, CN = system:node:<nodename>
๋ํ ๊ฒ์ด๋ฉฐ ์ฃผ์ฒด ๋์ฒด ์ด๋ฆ์DNS: <nodename>, IP Address: <node IP address>
์ ์ด๋ serverTLSBootstrap ๊ตฌ์ฑ ์ต์ ์ ํ์ฑํ ํ ๋ kubeadm์ด ์๋ฒ ์ธ์ฆ์๋ฅผ ์น์ธํ๋ ๊ฒ์ด ์ฌ์ด ์ผ์ ๋๊น? ์๋๋ฉด kubeadm๋ ์น์ธ์ ํ ์ ์์ต๋๊น?
๋ณด์ ๊ตฌํ์ ํ์คํ์ง ์์ง๋ง serverTLSBootstrap
์์ด ์ฐ์ฐ์๋ฅผ ๊ฒฐํฉํ์ฌ CSR https://github.com/kontena/kubelet-rubber-stamp ๋ฅผ ์๋ ์น์ธ ํ ์
์ ์ด๋ serverTLSBootstrap ๊ตฌ์ฑ ์ต์ ์ ํ์ฑํ ํ ๋ kubeadm์ด ์๋ฒ ์ธ์ฆ์๋ฅผ ์น์ธํ๋ ๊ฒ์ด ์ฌ์ด ์ผ์ ๋๊น? ์๋๋ฉด kubeadm๋ ์น์ธ์ ํ ์ ์์ต๋๊น?
kubeadm์ด ๋ฐ๋ชฌ์ด ์๋๊ธฐ ๋๋ฌธ์ kubeadm์ด ์น์ธ์ ์ํ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ฅผ ์ํด์ด๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ / ์ด์์๋ฅผ ๋ฐฐํฌํด์ผํฉ๋๋ค. ์๋ง ๋ฏธ๋์๋.
์ธ์ฆ์ API๊ฐ ๊ณง GA ๋ ๊ฒ์ด๋ฉฐ, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ k8s์์ ๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๊ด๋ฆฌ ํ ์์์ ๊ฒ์
๋๋ค. ์์ฒญํ์ญ์์ค :
https://github.com/kubernetes/enhancements/issues/267
(์์ง ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ผ๋ก ๋๋ ๊ฒ์ธ์ง ๋ถ๋ถ๋ช
ํฉ๋๋ค ...)
๋์ ์์ด๋์ด๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋์ด ๋ชจ๋ ๊ฒ์ด metric-server ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ๊ฒฝ์ฐ kubelet์ ๋ํ MS ์์ฒญ์ ๋ํด SAR์ ์ํ ํ ์์๋ https://github.com/brancz/kube-rbac-proxy ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌํ๊ฒ๋ ์ด๊ฒ์ ์์ง ์ฐ๋ฆฌ ์ธก์ ๋ฌธ์ํ๋์ง ์์์ต๋๋ค.
https://github.com/kubernetes/kubeadm/issues/1602
@ neolit123 ์ ์ด๋ --kubelet-insecure-tls
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด์์ง๋ง ์์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ณด๊ณ ์ถ์๊ณ ๋ฌธ์ ์ ๊ด์ฌ์ ๊ฐ๊ฒ๋์์ต๋๋ค. ๐
์ง๊ธ์ kubelet ๊ตฌ์ฑ์ serverTLSbootstrap
ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ ์ธ์ฆ์๋ฅผ ์๋์ผ๋ก ์น์ธํ๋ ๊ฒ์ด ์ฝ์ต๋๋ค. ํ์ง๋ง ๋จ์ ์ ์ธ์ฆ์๋ฅผ ์น์ธ ํ ๋๊น์ง ๋
ธ๋์ ํฌ๋์ ์์ ํ ์ํธ ์์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. (์๋ฅผ ๋ค์ด, kubectl exec๋ ์น์ธ ์ ์ ๋
ธ๋์์ ์คํ์ค์ธ ํฌ๋์์ ๋ช
๋ น์ ์คํํ์ง ๋ชปํจ)
ํฅ์ ๋ฌธ์ ๋ ๋ฐ๋ผ๊ฐ ๊ฒ์ ๋๋ค. ๊ฐ์ฌ.
์ถฉ๋ถํ ์ฑ์ํด ๋ณด์ด๋ kubeadm์ ์ฌ์ฉํ๋ฉด kubeletet cert์ ๊ธฐ๋ณธ ๊ฒฐ๊ณผ๊ฐ ์์ฒด ์๋ช
๋๊ณ ๋ง์ ์ฌ๋๋ค์ด ์ ๋๋ก ์ผ์ํ๋ ๋์ ๋ฉํธ๋ฆญ ์๋ฒ์ ๋ํด kubelet-insecure-tls
์ ์ ํํ๋ค๋ ๊ฒ์ ์ ๋ง ์ฌํ ์ผ์
๋๋ค.
๋ณต์กํ ๋ฌธ์ ์ ๋๋ค.
์๋ํ์ญ์์ค :
https://github.com/kontena/kubelet-rubber-stamp
๋๋
https://github.com/brancz/kube-rbac-proxy
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก
๋ณต์กํ ๋ฌธ์ ์ ๋๋ค.
์๋ํ์ญ์์ค :
https://github.com/kontena/kubelet-rubber-stamp
๋๋
https://github.com/brancz/kube-rbac-proxy
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก
์ค์ ๋ก https://github.com/kontena/kubelet-rubber-stamp ๋ ๊ฝค ์ ์๋ํ๋ฉฐ imo๋ ํ๋ก์ ๋์ ๋ ์ ํํ ์๋ฃจ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
1 ๋จ๊ณ:
๋ํ๋ค
kubelets ์ฌ๊ตฌ์ฑ์ ์ํด serverTLSBootstrap: true
๋งค /var/lib/kubelet/config.yaml
๋๊น์ง & ๊ตฌ์ฑ ์ ์ฉ (๋๋ ์ฌ๋ถํ
)์ ์์ง ๋ง์ธ์.
2 ๋จ๊ณ:
kubelet-rubber-stamp ๋ฐฐํฌ
service_account.yaml
role.yaml
role_binding.yaml
operator.yaml
3 ๋จ๊ณ :
๋ฉํธ๋ฆญ-์๋ฒ ๋ฐฐํฌ ํธ์ง ๋ฐ --kubelet-insecure-tls
์ ๊ฑฐ
๊ฒฐ๊ณผ:
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-7dvsx 31m kubernetes.io/kubelet-serving system:node:u-02 Approved,Issued
csr-d6rvm 31m kubernetes.io/kubelet-serving system:node:u-03 Approved,Issued
csr-szblz 31m kubernetes.io/kubelet-serving system:node:u-01 Approved,Issued
csr-zjfgj 31m kubernetes.io/kubelet-serving system:node:u-04 Approved,Issued
ํค์ด, @vainkop์ ์ถ๊ฐํ๊ธฐ ์ํด
ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๊ธฐ kubeadm init
๋์ KubeletConfiguration API ๊ฐ์ฒด ํ์ผ์ ์ ๋ฌํ์ฌ serverTLSBootstrap
๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค.
```kubeadm-config.yaml
apiVersion : kubeadm.k8s.io/v1beta2
์ข
๋ฅ : ClusterConfiguration
apiVersion : kubelet.config.k8s.io/v1beta1
์ข
๋ฅ : KubeletConfiguration
serverTLSBootstrap : true
`kubeadm init --config=kubeadm-config.yaml`
Then all kubelet's will automatically be set up using the `serverTLSBootstrap` flag.
To get the CSRs
kubectl get csr
์ด๋ฆ ์ฐ๋ น ์๋ช
์ ์ด๋ฆ ์์ฒญ์ ์กฐ๊ฑด
csr-2qkdw 2m1s kubernetes.io/kube-apiserver-client-kubelet ์์คํ
: ๋ถํธ ์คํธ๋ฉ : fcufbo ์น์ธ ๋จ, ๋ฐ๊ธ ๋จ
csr-9wvgt 114s kubernetes.io/kubelet-serving system : node : worker-1 Pending
csr-lz97v 4m58s kubernetes.io/kubelet-serving ์์คํ
: node : master-1 ๋ณด๋ฅ ์ค
csr-rsdsp 4m59s kubernetes.io/kube-apiserver-client-kubelet ์์คํ
: node : master-1 ์น์ธ ๋จ, ๋ฐ๊ธ ๋จ
csr-wgxqs 4m49s kubernetes.io/kubelet-serving ์์คํ
: node : master-1 ๋ณด๋ฅ ์ค
Then either approve them manually or deploy https://github.com/kontena/kubelet-rubber-stamp which approves them automatically. I just tried it with kubelet-rubber-stamp and it works great.
Also I did not seem to need to restart the kubelet's this way, they picked up their certificates as soon as I approvde the CSR, but a caveat is that the kublet's have NO cert until the CSR is approved, it does not get a self signed certificate first.
kubectl certificate accept csr-ab123 # ๋๋ rubber-stamp ๋ฐฐํฌ!
kubectl get csr
์ด๋ฆ ์ฐ๋ น ์๋ช
์ ์ด๋ฆ ์์ฒญ์ ์กฐ๊ฑด
csr-9wvgt 3m kubernetes.io/kubelet-serving ์์คํ
: node : worker-1 ์น์ธ ๋จ, ๋ฐํ ๋จ
...
```
์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์ด์ํ ์ผ์ด ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ๋ง์คํฐ ๋ ธ๋๊ฐ CSR์ ๋ ๋ฒ ์์ฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค. (์ ์ด๋ ๋ ๋ฒ ์๋ํ์ต๋๋ค)
๊ทธ๋ฌ๋ @nijave ๊ฐ ์์ ์๊ฒฌ์์
@allir , @vainkop ๊น์ง๋ kubelet-rubber-stamp๊ฐ CSR์ ์ผ๋ฐ ์ด๋ฆ์ด ์์ฒญ์ ์ด๋ฆ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ง๋ง kubelet์์ ์์ฒญํ ์ถ๊ฐ ํธ์คํธ ์ด๋ฆ๊ณผ IP ์ฃผ์๊ฐ ์ ํจํ์ง ์ฌ๋ถ๋ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ kubelet ํด๋ผ์ด์ธํธ ์ธ์ฆ์์ ์ก์ธ์ค ํ ์์๋ ๊ณต๊ฒฉ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋๋ฉ์ธ ์ด๋ฆ ๋๋ IP ์ฃผ์์ ๋ํ ์ธ์ฆ์๋ฅผ ์์ฑ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฃจํธ CA๋ฅผ ์ ๋ขฐํ๋๋ก ๊ตฌ์ฑ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ์ด ์ธ์ฆ์๋ฅผ ์๋ฝํฉ๋๋ค.
๋ฌผ๋ก ์ฃผ์ด์ง kubelet์ ๋ํด ์ ํจํ ํธ์คํธ ์ด๋ฆ๊ณผ IP ์ฃผ์๋ฅผ ํ์ธํ๋ ๊ฒ์ ํ์ฌ kubelet์ด ์์ฒญํ ์์๋ ๊ฒ์ ํ์ธํ ์์๋ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ต๋๋ค. ์๋ฅผ ๋ค์ด API ์๋ฒ์์ ๋
ธ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ kubelet์ด ์ ํ์์ด ๊ฐ์ฒด๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
ํค์ด, @vainkop์ ์ถ๊ฐํ๊ธฐ ์ํด
ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๊ธฐkubeadm init
๋์ KubeletConfiguration API ๊ฐ์ฒด ํ์ผ์ ์ ๋ฌํ์ฌserverTLSBootstrap
๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค.
kubeadm init --config=kubeadm-config.yaml
๊ทธ๋ฌ๋ฉด ๋ชจ๋ kubelet์ดserverTLSBootstrap
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๋๋ Ansible์ ์ฌ์ฉํ๋ ๊ธฐ์กด K8 ์ค์ ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
tasks:
- name: Insert a line at the end of /var/lib/kubelet/config.yaml
lineinfile:
path: /var/lib/kubelet/config.yaml
line: 'serverTLSBootstrap: true'
+ kubelets ๋ค์ ์์
์์ฐ,์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค.์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ง๋ค๊ณ ์ถ์ ์ฌ๋์ ํผ์๊ฐ ์๋๋๋ค. :)
์ด์ ์ด ๋ฌธ์ ์ ๋ํ ๋ด ์๊ฐ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค (๋ด๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ ์์ ํด์ฃผ์ธ์) .
๋จผ์ ์๋ ๋ฌธ์ ์ ๋ํ ๋์ ๋น์ :
ํ์ฌ kubeadm์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ kubelet์ ๋ํด ์น ํํฌ ์ธ์ฆ์ ํ์ฑํํ๋ฏ๋ก kubelet์ --kubelet-insecure-tls
์ต์
์ด ์ง์ ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ์์ด ์์ ์ฐ๊ฒฐ์ ๋ํ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
๋ค๋ฅธ ์ชฝ์์ metrics-server๋ ๋
ธ๋์์ ์์ฒด ์๋ช
๋๊ธฐ ๋๋ฌธ์ ํน์ kubelet ์ธ์ฆ์๋ฅผ ํ์ธํ ๊ธฐํ๊ฐ ์์ต๋๋ค.
๋ฉํธ๋ฆญ ์๋ฒ์ --kubelet-insecure-tls
์ฌ์ฉ์ ๊ฐ๋ฅํ ์ํ :
kubelet ๋ฐ์ดํฐ๋ ๋ค์ ์์ ํ๋ฉฐ ์ฑ๊ณต์ ์ธ ์น ํํฌ ์ธ์ฆ ์์ด๋ ๋ฉํธ๋ฆญ ์๋ฒ์ ์ ๊ณต๋์ง ์์ต๋๋ค.
์ด๋ก ์ ์ผ๋ก ๋๊ตฐ๊ฐ ์๋ฒ IP ๋๋ ํธ์คํธ ์ด๋ฆ์ ์์์ํค๊ณ ์๋ชป๋ ํต๊ณ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๊ฒฐ ์ค์ ์ ์ํด metricserver๋ kube-apiserver๋ฅผ ํตํด ๋
ธ๋์ ์ง์ ๋ IP ์ฃผ์์ ํธ์คํธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฏ๋ก ๊ณต๊ฒฉ์๋ ๋จผ์ API-server, DNS ๋๋ ๋
ธ๋ IP ์ฃผ์๋ฅผ ํดํนํด์ผํฉ๋๋ค.
์ฝ๊ฐ์ ๊ด์ฐฐ :
metrics-server๋ kubelet์ ์ง์ ์ก์ธ์คํ๋ ๋จ์ผ ์๋น์ค๊ฐ ์๋๋๋ค. ๋ํ Kube-apiserver๋ ์ปจํ
์ด๋ ๋ก๊ทธ๋ฅผ ์ฝ๊ฑฐ๋ ํด๋น ๋ก๊ทธ์์ ์
ธ์ ์คํํ๊ธฐ ์ํด์ด ์์
์ ์ํํฉ๋๋ค. ์ข์ ์ง๋ฌธ์ kube-apiserver๊ฐ ์ธ์ฆ์๋ฅผ ๋ฐํ ํ CA์ ๋ํ ์ ๋ณด๊ฐ์๋ ๋์ ํน์ kubelet๊ณผ์ ์ฐ๊ฒฐ์ ์ค์ ํ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ด ๊ฒฝ์ฐ --kubelet-insecure-tls
์ต์
์ ์ฌ์ฉํ๋ ๋ฉํธ๋ฆญ ์๋ฒ์ ๋์ผํ๊ฒ ์๋ํ์ง ์์ต๋๊น?
๊ฐ๋ฅํ ํด๊ฒฐ์ฑ
:
์ค๋๋ ์นํ
๊ณผ API ์ง๊ณ๋ Kubernetes์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ค ๋ชจ๋๋ ์์ฒด CA์ crt / key ์์ ์์ฑํจ์ผ๋ก์จ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. CA ํด์๋ ๋ํ ํน์ ๋ฆฌ์์ค์ ์ ์ฅ๋์ด kube-apiserver์ ์ ๋ขฐํ ์์๋ ์ธ์ฆ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด :
APIServices๋ apiservices.apiregistration.k8s.io
๋ฆฌ์์ค์ ๊ด๋ จ CA ํด์๋ฅผ ์ ์ฅํฉ๋๋ค.
spec:
caBundle: <ca-hash>
์น ํํฌ๋ validatingwebhookconfigurations.admissionregistration.k8s.io
๋ฐ mutatingwebhookconfigurations.admissionregistration.k8s.io
๋ฆฌ์์ค์ ๊ด๋ จ CA ํด์๋ฅผ ์ ์ฅํฉ๋๋ค.
webhooks:
- clientConfig:
caBundle: <ca-hash>
๋์๊ฒ ๊ฐ ๋
ธ๋์ ์์์ด ์์ด์ผํ๋ค ๊ฝค ๋ถ๋ช
ํ๋ค ์ ์ฌํ caBundle
์์ ์์ ์ spec
kubelets๊ฐ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ์ญํ ์ ๋ํ ์์ ์ CA๋ฅผ ๋ฑ๋ก ํ ์์๋ ๊ณณ :
spec:
caBundle: <ca-hash>
metris-server์ kube-apiserver๋ ๋ชจ๋์ด ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ kubelet์ ๋ํ ์ฐ๊ฒฐ์ ํ์ธํ๊ณ ์ ๋ขฐํด์ผํฉ๋๋ค.
์ด์ ์ ์ ์ฌํ ์์ด๋์ด๋ฅผ ํํํ @ kfox1111 ๋๋ถ์ https://github.com/kubernetes/kubeadm/issues/1223#issuecomment -460854312
์ข์ ์ง๋ฌธ์ kube-apiserver๊ฐ ์ธ์ฆ์๋ฅผ ๋ฐํ ํ CA์ ๋ํ ์ ๋ณด๊ฐ์๋ ๋์ ํน์ kubelet๊ณผ์ ์ฐ๊ฒฐ์ ์ค์ ํ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ--kubelet-insecure-tls
์ต์ ์ ์ฌ์ฉํ๋ ๋ฉํธ๋ฆญ ์๋ฒ์ ๋์ผํ๊ฒ ์๋ํ์ง ์์ต๋๊น?
์ด ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ์ฌ๊ธฐ์์ @luxas ๋ฅผ ์ธ์ฉ ํ ์ ์์ต๋๋ค.
๋ง์ต๋๋ค. ๊ฐ kubelet์๋ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๊ฐ ์์ผ๋ฏ๋ก api ์๋ฒ์์ ํ์ธ ๋ kubelet ์๋ฒ๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์์ผ๋ก ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ kubelet์ ์๋ ์น์ธ ํ๋ฆ์ ๊ณ ๋ คํ ์ ์์ง๋ง ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณดํธ๋์ง๋ ์์ต๋๋ค.
https://github.com/kubernetes/kubeadm/issues/118#issuecomment -407498529์์
์ธ์ ๊ฐ ํด๊ฒฐ ๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค
[root<strong i="6">@jenkins</strong> metrics-server]# kubectl -n kube-system logs -f metrics-server-6955d88db9-lftlz
I1120 08:23:09.094132 1 requestheader_controller.go:169] Starting RequestHeaderAuthRequestController
I1120 08:23:09.094234 1 shared_informer.go:240] Waiting for caches to sync for RequestHeaderAuthRequestController
I1120 08:23:09.094270 1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1120 08:23:09.094279 1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1120 08:23:09.094307 1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1120 08:23:09.094315 1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1120 08:23:09.095064 1 dynamic_serving_content.go:130] Starting serving-cert::/tmp/apiserver.crt::/tmp/apiserver.key
I1120 08:23:09.095207 1 secure_serving.go:197] Serving securely on [::]:4443
I1120 08:23:09.095259 1 tlsconfig.go:240] Starting DynamicServingCertificateController
I1120 08:23:09.194453 1 shared_informer.go:247] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1120 08:23:09.194660 1 shared_informer.go:247] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1120 08:23:09.194455 1 shared_informer.go:247] Caches are synced for RequestHeaderAuthRequestController
E1120 08:23:10.420643 1 server.go:132] unable to fully scrape metrics: [unable to fully scrape metrics from node k8s-master3: unable to fetch metrics from node k8s-master3: Get "https://10.39.140.250:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 10.39.140.250 because it doesn't contain any IP SANs, unable to fully scrape metrics from node k8s-master1: unable to fetch metrics from node k8s-master1: Get "https://10.39.140.248:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 10.39.140.248 because it doesn't contain any IP SANs, unable to fully scrape metrics from node k8s-master2: unable to fetch metrics from node k8s-master2: Get "https://10.39.140.249:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 10.39.140.249 because it doesn't contain any IP SANs, unable to fully scrape metrics from node k8s-node1: unable to fetch metrics from node k8s-node1: Get "https://10.39.140.251:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 10.39.140.251 because it doesn't contain any IP SANs]
I1120 08:23:33.874949 1 requestheader_controller.go:183] Shutting down RequestHeaderAuthRequestController
I1120 08:23:33.874978 1 configmap_cafile_content.go:223] Shutting down client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1120 08:23:33.874993 1 configmap_cafile_content.go:223] Shutting down client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1120 08:23:33.875019 1 tlsconfig.go:255] Shutting down DynamicServingCertificateController
I1120 08:23:33.875026 1 dynamic_serving_content.go:145] Shutting down serving-cert::/tmp/apiserver.crt::/tmp/apiserver.key
I1120 08:23:33.875041 1 secure_serving.go:241] Stopped listening on [::]:4443
์ด ํธ์ ๋ํ ์์์ด ์์ต๋๊น? ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ๋ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์ฌ๊ธฐ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฌธ์ํํ๊ณ ์์ต๋๋ค.
https://github.com/kubernetes/website/pull/27071
https://github.com/kubernetes/kubeadm/issues/1602
์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ด์ด ๋ ์๋ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก kubeadm์ ์ฌ์ฉํ์ฌ ์๋ช ์๋ฅผ ๋ฐฐํฌํด์ผํ๋ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์กฐ๋ง๊ฐ์ด ๋ณ๊ฒฝ์ ์ํ ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฌธ์ ๋ฅผ ์์ฝ ํด ๋ณด๊ฒ ์ต๋๋ค.
@anitgandhi ์ ์ํด ์ค๋ช ๋
https://github.com/kubernetes/kubeadm/issues/1223#issuecomment -454572577
์ฌ๊ธฐ์ kubeadm์ ๋ฌธ์ ๋ kubelet์ ๋ช ๊ฐ์ง ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ํ๋๊ทธ๊ฐ ์์ผ๋ฉด kubelet์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒด ์๋ช ์ผ๋ก ์ค์ ๋์ด ์ฒ์ ์คํ๋ ๋ ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ฉฐ ๋ค์์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ CA (
/etc/kubernetes/ca.crt
)์์ ์๋ช ํ ์ธ์ฆ์ ๋์ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฒด ์๋ช ๋ ์ธ์ฆ์ SAN์๋DNS:hostname
๋ง ํฌํจ๋๋ฏ๋ก ๋ฉํธ๋ฆญ ์๋ฒ์ ๊ฐ์ ๋ฐฐํฌ๋ kubelet์ ์คํฌ ๋ ์ด ํ ํ ์ ์์ต๋๋ค.๊ฐ๋ฅํ ํด๊ฒฐ์ฑ :
A) ์๋ก์ด
kubelet.crt/key
์, ์ด์์ ์ผ๋ก๋/var/lib/kubelet/pki
๋ฏธ๋ง์ ๋ ธ๋๋ฅผ ๊ตฌํํ๊ณ ์ถ๊ฐ kubelet ํ๋๊ทธ--tls-cert-file
,--tls-private-key-file
ํฉ๋๋ค.B) ๋ฌธ์๋ @ raravena80 ์ด ์ฌ๊ธฐ์์ ํ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ์จ ๋๋งจ๋๋ก ํ์ฑํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค : https://stackoverflow.com/questions/53212149/x509-certificate-signed-by-unknown-authority-kubeadm/53218524#53218524
Kubernetes CSR / kubeadm ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ธ์ ๋๋ค.
C) @alexbrand์ ์ฝ๋ฉํธ
D)?
@ kubernetes / sig-cluster-lifecycle
๋์๊ฒ ์ด๊ฒ์ ๋ฒ๊ทธ / ๊ธฐ๋ฅ ์ฌ์ด์ ๊ณต๊ฐ์์ ๋ณด์ธ๋ค.
์ฐธ์กฐ :
https://github.com/kubernetes/community/pull/602/files