EKS ์ ๊ฐ์ ํด๋ผ์ฐ๋๊ฐ ์ ๊ณตํด์ฃผ๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์๋, ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๋ค๊ณ ํ๋ฉด ๋ณดํต kubeadm ์ด๋ผ๋ ํด์ ์ด์ฉํด์ ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค.
Control Plane ์ kubeadm init ๋ฅผ ํตํด ๊ตฌ์ฑ๋๊ณ , Data Plane ์ kubeadm join ์ ํตํด ์ฟ ๋ฒ๋คํฐ์ค์ ์กฐ์ธํ๊ฒ ๋ฉ๋๋ค.
kubeadm ํด ํ๋๋ฉด API Server, Scheduler, Control Manager, ETCD ๋ฑ Control Plane ์ ํ์ํ ๋ชจ๋ ๊ฒ๋ค์ด ๋ง๋ฒ์ฒ๋ผ ์๋์ผ๋ก ๊ตฌ์ฑ๋์ฃ .
๋ฌผ๋ก kubelet ๊ทธ๋ฆฌ๊ณ containerd ์ ๊ฐ์ cri-๊ตฌํ์ฒด๋ ์ด๋ฏธ ์คํ๋๊ณ ์์ด์ผ ํฉ๋๋ค!
์๋์ด๋ ๊ฒ์ด ํ์คํ ํธ์์ฑ์ ์ ๊ณตํด์ฃผ๊ธด ํ์ง๋ง, ์๋์ผ๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง๋ ํ์ ํ๊ธฐ ํ๋ญ๋๋ค.
"Control Plane ์ Data Plane ๊ฐ ๋๊ตฐ์ง ์๊ณ , ๊ปด์ฃผ๋๊ฑฐ์ผ?", "Control Plane ์ ๋ญ ๋ณด๊ณ , Data Plane ์ํ๊ฐ ๊ด์ฐฎ๋ค๊ณ ํ๋จํ๋๊ฑฐ์ผ?" ๋ผ๊ณ ๋ฌผ์ด๋ดค์ ๋ "kubeadm ์ด ๋ค ์์์ ํด์ค" ๋ผ๊ณ ๋ตํ ์ ์์์์.
๊ทธ๋์ Control Plane, Data Plane ์ ์์ฑ๊ณผ ์กฐ์ธ๊น์ง ์ด๋ค ์ํฌํ๋ก์ฐ๋ก ์งํ์ด ๋๋ ์ง, ์์๋ณด๊ณ ์ ํฉ๋๋ค.
๊ธ์ ์ฌ๋ฌ ํธ์ผ๋ก ๋๋์ด ์งํ๋ ์์ ์ด๋ฉฐ, ์ฌ๊ธฐ์๋ Controler Plane ์ ์์ฑ์ ๋ด๋นํ๋ kubeadm init ์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋~
kubeadm init options
kubeadm init ์ ์๋์ ๋ช ์๋์ด ์๋ ๊ฒ๋ค์ ์ ๋ถ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
Control Plane ์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ์ ๋ํ ์ค์น ๋ฐ ํ์ํ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ค๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
preflight Run pre-flight checks
certs Certificate generation
/ca Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components
/apiserver Generate the certificate for serving the Kubernetes API
/apiserver-kubelet-client Generate the certificate for the API server to connect to kubelet
/front-proxy-ca Generate the self-signed CA to provision identities for front proxy
/front-proxy-client Generate the certificate for the front proxy client
/etcd-ca Generate the self-signed CA to provision identities for etcd
/etcd-server Generate the certificate for serving etcd
/etcd-peer Generate the certificate for etcd nodes to communicate with each other
/etcd-healthcheck-client Generate the certificate for liveness probes to healthcheck etcd
/apiserver-etcd-client Generate the certificate the apiserver uses to access etcd
/sa Generate a private key for signing service account tokens along with its public key
kubeconfig Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
/admin Generate a kubeconfig file for the admin to use and for kubeadm itself
/super-admin Generate a kubeconfig file for the super-admin
/kubelet Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes
/controller-manager Generate a kubeconfig file for the controller manager to use
/scheduler Generate a kubeconfig file for the scheduler to use
etcd Generate static Pod manifest file for local etcd
/local Generate the static Pod manifest file for a local, single-node local etcd instance
control-plane Generate all static Pod manifest files necessary to establish the control plane
/apiserver Generates the kube-apiserver static Pod manifest
/controller-manager Generates the kube-controller-manager static Pod manifest
/scheduler Generates the kube-scheduler static Pod manifest
kubelet-start Write kubelet settings and (re)start the kubelet
upload-config Upload the kubeadm and kubelet configuration to a ConfigMap
/kubeadm Upload the kubeadm ClusterConfiguration to a ConfigMap
/kubelet Upload the kubelet component config to a ConfigMap
upload-certs Upload certificates to kubeadm-certs
mark-control-plane Mark a node as a control-plane
bootstrap-token Generates bootstrap tokens used to join a node to a cluster
kubelet-finalize Updates settings relevant to the kubelet after TLS bootstrap
/experimental-cert-rotation Enable kubelet client certificate rotation
addon Install required addons for passing conformance tests
/coredns Install the CoreDNS addon to a Kubernetes cluster
/kube-proxy Install the kube-proxy addon to a Kubernetes cluster
show-join-command Show the join command for control-plane and worker node
์ค์ ๋ก ์์ฑ๋๋ ํ์ผ๋ค์ ๋๋ค.
๋ํ kubeadm init ์ ์ต์ ์ ํตํด ํด๋ฌ์คํฐ์ ์ ๋ฐ์ ์ธ ์ค์ ์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด, --apiserver-bind-port=6443(default) ๋ฅผ ์ฃผ์ด API Server ์ ํฌํธ๋ฅผ ์ง์ ํ ์ ์๊ณ , --service-dns-domain=cluster.local(default) ๋ฅผ ํตํด ํด๋ฌ์คํฐ ๋ด ๋๋ฉ์ธ์ ์ค์ ํ ์ ์์ต๋๋ค.
--service-cidr=10.96.0.0/12(default) ๋ฅผ ํตํด ์๋น์ค๋ค์ด ํ ๋น ๋ฐ๋ ๊ฐ์ IP ๋ฒ์๋ ์กฐ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
10.96.0.0/12 CIDR ๋ฅผ ๊ฐ์ง๋ค๋ฉด, 10.96.0.0 ~ 10.111.255.255 ๊น์ง IP ํ ๋น์ด ๊ฐ๋ฅํ๋ฉฐ ์ด 1,048,576 ๊ฐ์ IP ๋ฅผ ์ธ ์ ์์ฃ .
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์๋น์ค์ IP ๋ฅผ ๋ณด๋ฉด ๋ฒ์ ๋ด์์๋ง ํ ๋น๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด์ธ์๋ ๋ค์ํ ์ต์ ๋ค์ด ์์ผ๋ฉฐ ๊ณต์๋ฌธ์์์ ์ง์ ํ์ธํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค.
๊ทธ๋ผ ๋ณธ๊ฒฉ์ ์ผ๋ก kubeadm init ์ ์ํฌํ๋ก์ฐ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
kubeadm init workflow
1. ๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ธ์ค ์คํ ์ ์ pre-flight ์ฒดํฌ๋ฅผ ํตํด ์์คํ ์ ์ํ๋ฅผ ์ฒดํฌํ๊ฒ ๋ฉ๋๋ค. ํ์ฌ kubeadm ์ด ์คํ๋๋ ํธ์คํธ์ ์ํ๋ฅผ ์ฒดํฌํด Control Plane ์ผ๋ก ์ธ ์ ์์์ง ํ์ธํฉ๋๋ค.
Warning ์ด ์๋ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค๋ฉด kubeadm ์ ํ๋ก์ธ์ค๋ฅผ ๊ณง ๋ฐ๋ก ์ค๋จํ๊ฒ ๋ฉ๋๋ค.
์๋ฌ์ ์๋ก๋ IsPrivilegedUser,Swap ๋ฑ ์ด ์๊ณ --ignore-preflight-errors ์ต์ ์ ํตํด ๋ช ์๋ ์๋ฌ๋ ๋ฌด์ํ ์ ์์ต๋๋ค.
2. ์ฟ ๋ฒ๋คํฐ์ค ์ปดํฌ๋ํธ๋ผ๋ฆฌ ์์ ํ TLS ํต์ ์ ์ํด ๊ฐ ์ปดํฌ๋ํธ๋ง๋ค ํ์ํ crt, key ๋ฅผ --cert-dir=/etc/kubernetes/pki(default) ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
3. API Server ์ ํต์ ํ๊ธฐ ์ํ kubelet, controller manager, scheduler ์ kubeconfig ๋ฅผ ์์ฑํฉ๋๋ค.
๋ํ ์ฌ์ฉ์๊ฐ API Server ์ ํต์ ํ ์ ์๋๋ก admin.conf ๋ ์์ฑํฉ๋๋ค.
cp -i ./etc/kubernetes/admin.conf ~/.kube/config ๋ฅผ ํตํด kubectl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ admin ์ ์ ๋ก API Server ์ ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์์ฑ๋ kubeconfig ๋ RBAC ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์๋๋ scheduler ์ ๋ํ kubeconfig ๋ด์ฉ์ ๋๋ค.
clusters[].cluster.certificate-authority-data ์ ์์ฑ๋์ด ์๋ ๊ฑด ์ฟ ๋ฒ๋คํฐ์ค ์์ฒด ca.crt ์ ๋๋ค.
๋์ฝ๋ฉ ํด์ ๋ด์ฉ์ ๋ณด๋ฉด Issuer, Subject ๋ชจ๋ kubernetes ์ด๋ฏ๋ก ์์ฒด ์ฌ์ธํ CRT ๋ผ๋ ๊ฑธ ์ ์ ์์ฃ .
๊ทธ๋ฆฌ๊ณ kubelet, controller manager, scheduler ๋ชจ๋ Issuer ๊ฐ kubernetes ์ธ ๊ฒ์ ๋ณด์ ca.crt ์ ํ์ crt ๋ผ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
kube-scheduler ๊ฐ ๋ณธ์ธ์ Private Key ๋ฅผ ํตํด CN ์ด system:kube-scheduler ์ธ CertificateSigningRequest(CSR) ์ ๋ง๋ค๊ณ , ์ด CSR ์ CA ์ CRT ์ ์น์ธ๋์ด CRT ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ scheduler.conf ์ ์์ฑ๋์ด ์๋ ๋ด์ฉ์ด ์ด CRT ์ ๋๋ค.
์ด CRT ์ system:kube-scheduler cluster role ์ ํตํด API Server ์ ํต์ ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ ํ์ ์ธ RBAC ํ๋ก์ฐ๋ฅผ ๋ฐ๋ฅด๊ณ , ๋๋จธ์ง ์ปดํฌ๋ํธ๋ค๋ ๊ฐ์ ๋ฐฉ์์ ๋ฐ๋ฆ ๋๋ค.
4. API Server, Controller Manager, Scheduler, ETCD ์ ๋ํ Static Pod Manifest ๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ก์จ Control Plane ์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
Static Pod ๋ ํน์ ๊ฒฝ๋ก ์์ manifest ๋ฅผ ์์ฑํด๋์ผ๋ฉด API Server ๊ฐ ์๋ kubelet ์ด ์ง์ ๊ด๋ฆฌํ๋ ํ๋์ ๋๋ค.
์๋๋ kube-apiserver.yaml ์ ๋ด์ฉ์ธ๋ฐ, ์ฐ๋ฆฌ๊ฐ ์๋ ํํ ํ๋์ ๋ชจ์ต์ด์ฃ .
kubeadm ์ 4๋ถ ๋์ API Server ์ Liveness Probe ๊ฐ localhost:6443/healthz ์์ 200 ok ์๋ต ์ฝ๋๊ฐ ์ค๋ ์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ต์ฐฉ ์ํ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด kubelet ์ Liveness Probe, Readiness Probe ๋ฅผ ๊ฐ๊ฐ localhost:10255/healthz,
localhost:10255/healthz/syncloop ์ ํตํด ์ฒดํฌํ๊ณ 40~60 ์ด ๋ด์ ์๋ต์ด ์ค์ง ์์ผ๋ฉด ๋น ๋ฅด๊ฒ ์คํจ์ฒ๋ฆฌํ๊ฒ ๋์ฃ .
Static Pod ์ธ API Server ๊ฐ Kubelet ์ ์ํด ์คํ, ๊ด๋ฆฌ๋๊ณ ํด๋น Kubelet ์ ๊ฐ์ง๋ ๋ ธ๋๊ฐ Control Plane ์ผ๋ก ๋ฑ๋ก๋๊ฒ ๋ฉ๋๋ค.
[์ฐธ๊ณ ์๋ฃ]
5. ๋ ์ด๋ธ๊ณผ Taints ๋ฅผ ์ปจํธ๋กค ํ๋ ์ธ์ ์ถ๊ฐํจ์ผ๋ก์จ ๋ ์ด์์ ์ํฌ๋ก๋(ex. ๋ํ๋ก์ด๋จผํธ, ๋ฐ๋ชฌ์ ) ๋ฑ ์ด ์คํ๋์ง ์๋๋ก ํฉ๋๋ค.
6. ์ถ๊ฐ์ ์ธ Data Plane ์ด Control Plane ์ ์ค์ค๋ก ๋ฑ๋ก๋ ์ ์๋๋ก ํ ํฐ์ ์์ฑํฉ๋๋ค.
์๋์ผ๋ก ์ ์ ๊ฐ kubeadm token create --print-join-command --ttl 60 ๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ง์ ์์ฑํ ์ ์์ต๋๋ค.
7. Bootstrap Tokens ์ TLS Bootstrap ๋ฉ์ปค๋์ฆ์ ์ด์ฉํด์ Data Plane ์กฐ์ธ์ ํ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ์ ์ํํฉ๋๋ค.
์ด ๋ถ๋ถ์ ๋ค์ ์์ ๊ธ์ธ kubeadm join ์น์ ์์ ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
8. ์ถ๊ฐ์ ์ธ ์ปดํฌ๋ํธ์ธ CoreDNS, Kube Proxy ๋ฅผ ์ค์นํฉ๋๋ค. ํ๋ ๊ฐ ํต์ ์ ํ์ํ CNI ๋ ๋ฐ๋ก ์ค์นํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์ํฌํ๋ก์ฐ๋ฅผ ํตํด Control Plane ์ด ์์ฑ๋๊ณ , Data Plane ์ ์กฐ์ธํ ์ ์๊ฒ๋ ์ค๋น๋ฅผ ํฉ๋๋ค.
(Data Plane ์กฐ์ธ์ ๋ํด์ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค)
์ถ๊ฐ์ ์ผ๋ก kubeadm init ๋ฅผ ํตํด ์์ฑ๋ ํ์ผ๋ค ์ค ํ๋๋ฅผ ์ค์๋ก ์ง์ ๋คํ๋๋ผ๋ kubeadm init phase ๋ฅผ ํตํด ํ๋ํ๋ ๋ํ ์ผํ๊ฒ ์์ฑ ๋ฐ ์ปค์คํ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ค์ ๊ธ๋ก ์ด์ด์ง๋๋ค!
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!