Kubeadm: ์„œ๋ช… ๋œ kubelet ์ œ๊ณต ์ธ์ฆ์„œ ์‚ฌ์šฉ

์— ๋งŒ๋“  2018๋…„ 11์›” 09์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kubernetes/kubeadm

๋ฒ„๊ทธ ๋ณด๊ณ ์„œ ๋˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ์ž…๋‹ˆ๊นŒ?

/ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ

๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„ ์—์„œ์ด ๋ฌธ์ œ ์— ๋Œ€ํ•œ 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"}

ํ™˜๊ฒฝ :

  • Kubernetes ๋ฒ„์ „ ( 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"}
  • ํด๋ผ์šฐ๋“œ ์ œ๊ณต ์—…์ฒด ๋˜๋Š” ํ•˜๋“œ์›จ์–ด ๊ตฌ์„ฑ :
    ์–ด๋–ค
  • OS (์˜ˆ : / etc / os-release) :
    ์–ด๋–ค
  • ์ปค๋„ (์˜ˆ : 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 ์„ ์ฐธ์กฐ

aresecurity help wanted kinbug kinfeature lifecyclfrozen prioritimportant-longterm

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฌธ์ œ๋ฅผ ์š”์•ฝ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@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

๋ชจ๋“  38 ๋Œ“๊ธ€

@ 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์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…์ž๋ฅผ ๋ฐฐํฌํ•ด์•ผํ•˜๋Š” ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์กฐ๋งŒ๊ฐ„์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰