๋ชฉ์ฐจ
ย Generate Certificates
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ธ์ฆ์๋ค์ ๊ฐ์ง๋ค๊ณ ํ ๋, ์ธ์ฆ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ Easy-RSA, OpenSSL, CFSSL ๋ฑ์ด ์๋ค. OpenSSL์ ์ฌ์ฉํ์ฌ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
ย CA Certificates Generation
์ธ์ฆ์๋ฅผ ์์ฑํ ๋๋ ์ฐ์ ๊ฐ์ธ ํค๋ฅผ ์์ฑํ๊ณ , ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํด CSR์ ์์ฑํด์ผ ํ๋ค.
1) Private Key ์์ฑ
openssl genrsa -out ca.key 2048
Bash
๋ณต์ฌ
2) CSR ์์ฑ
์์ฑ๋ ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์๋ช
์์ฒญ์ ์์ฑํ๋ค. CSR์ ๋ชจ๋ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ ์ธ์ฆ์์ ์ ์ฌํ์ง๋ง ์๋ช
์ด ์๋ ํ์ผ์ด๋ค. CSR์์๋ ์ธ์ฆ์์ ์ฉ๋๋ฅผ ์ ์ํ๊ธฐ ์ํด Common Name (CN) ํ๋์ ๊ตฌ์ฑ ์์์ ์ด๋ฆ์ ์ง์ ํ๋ค.
openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr
Bash
๋ณต์ฌ
3) Sign Certificates
OpenSSL X509 ๋ช
๋ น์ ์ฌ์ฉํด CSR์ ์ง์ ํ์ฌ ์ธ์ฆ์๋ฅผ ์๋ช
ํ๋ค. CA ์์ฒด์ ์ธ์ฆ์์ด๋ฏ๋ก, 1๋จ๊ณ์์ ์์ฑํ ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํด CA์ ์ํด ์์ฒด ์๋ช
๋๋ค.
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
Bash
๋ณต์ฌ
๋ค๋ฅธ ๋ชจ๋ ์ธ์ฆ์์ ์๋ช
์ ํ ๋, ca ํค ํ์ด๋ฅผ ์ฌ์ฉํด ์๋ช
ํ๋ค.
ย Client Certificates Generation
์ธ์ฆ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ๋ค.
1) Private Key ์์ฑ
openssl genrsa -out <client>.key 2048
Bash
๋ณต์ฌ
2) CSR ์์ฑ
openssl req -new -key ca.key -subj "/CN=<Common Name>" -out <client>.csr
Bash
๋ณต์ฌ
ย Admin User
CSR์ ์์ฑํ ๋ CN์ Admin user์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ณณ์ด๋ค. ์ด ์ด๋ฆ์ kubectl ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆํ๋ ์ด๋ฆ์ด๋ฏ๋ก, kubectl ๋ช
๋ น์ด๋ฅผ ์คํํ ๋ ๋ก๊ทธ๋ ๋ค๋ฅธ ๊ณณ์์ ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์ ์ ์ ํ ์ด๋ฆ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํ๋ค.
User Account๋ Admin User์ ์ผ๋ฐ User๋ฅผ ๊ตฌ๋ถํด์ผํ ํ์๊ฐ ์๋ค. ์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์๋ ์ธ์ฆ์์ ์ฌ์ฉ์์ ๋ํ ๊ทธ๋ฃน ์ธ๋ถ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค์๋ ๊ด๋ฆฌ ๊ดํ์ ๊ฐ์ง System Masters๋ผ๋ ๊ทธ๋ฃน์ด ์กด์ฌํ๋๋ฐ, ์ด๋ฅผ CSR์ ์์ฑํ ๋ ์ถ๊ฐํด์ผ ํ๋ค. ๊ทธ๋ฃน ์ธ๋ถ์ ๋ณด๋ OU ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์๋ช
์ด ์๋ฃ๋๋ฉด ๊ด๋ฆฌ ๊ถํ์ ๊ฐ์ง admin์ ๋ํ ์ธ์ฆ์๋ฅผ ์ป์ ์ ์๋ค.
openssl req -new -key ca.key -subj "/CN=kube-admin/O=system:masters" -out admin.csr
Bash
๋ณต์ฌ
ย Scheduler, Controller-Manager
kube-scheduler, kube-controller-manager๋ Controlplane์ ์์คํ
๊ตฌ์ฑ ์์์ด๋ค. ๋ฐ๋ผ์ ์ด๋ค์ ์์ฑํ ๋๋ system์ด๋ผ๋ ํค์๋๋ฅผ prefix๋ก ๊ฐ์ ธ์ผ ํ๋ค(์ด๋ฆ ์์ ๋ถ์ด์ผ ํ๋ค).
openssl req -new -key ca.key -subj "/CN=system:kube-scheduler" -out scheduler.csr
openssl req -new -key ca.key -subj "/CN=system:kube-controller-manager" -out controller-manager.csr
Bash
๋ณต์ฌ
3) Sign Certificates
OpenSSL X509 ๋ช
๋ น์ ์ฌ์ฉํด ์๋ช
๋ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ค. ์ด๋ CA ์ธ์ฆ์์ CA ๊ฐ์ธํค๋ฅผ ์ง์ ํ๋ค. ์์ฑํ๋ CA ํค ํ์ด๋ฅผ ์ง์ ํจ์ผ๋ก์จ ์ธ์ฆ์์ ์๋ช
์ ํ ์ ์๋ค.
openssl x509 -req -in <client>.csr -CA ca.key -CAkey ca.key -out <client>.crt
Bash
๋ณต์ฌ
ย Server Certificates Generation
ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ๋ณด๋ธ ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ๋ค. ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ๋ค. ์ด๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋ CA์ ๊ณต๊ฐ ์ธ์ฆ์๊ฐ ํ์ํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์
์ผ ๊ฒฝ์ฐ, CA ์ธ์ฆ์๋ ๋ธ๋ผ์ฐ์ ์ ์ด๋ฏธ ์ค์น๋์ด ์์๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ค์ํ ๊ตฌ์ฑ ์์๊ฐ ์๋ก๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด์๋ ๋ชจ๋ CA์ ๋ฃจํธ ์ธ์ฆ์ ์ฌ๋ณธ์ด ํ์ํ๋ค. ๋ฐ๋ผ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆ์๋ก ๊ตฌ์ฑํ ๋, CA ๋ฃจํธ ์ธ์ฆ์๋ ์ง์ ํด์ผ ํ๋ค.
ย ETCD Servers
์ธ์ฆ์๋ฅผ ์์ฑํ๋ ์ ์ฐจ๋ ์์ ๋ฐฉ์๊ณผ ๋์ผํ๋ค. ETCD ์๋ฒ๋ ๊ณ ๊ฐ์ฉ์ฑ ํ๊ฒฝ์์ ๋ค์ค ์๋ฒ์ ๊ฑธ์ณ ํด๋ฌ์คํฐ๋ก ๋ฐฐํฌ๋ ์ ์๋ค. ์ด๋๋ ํด๋ฌ์คํฐ ๋ด ๋ค๋ฅธ ๋ฉค๋ฒ ๊ฐ์ ํต์ ์ ๋ณด์ํ๋ ค๋ฉด ์ถ๊ฐ์ ์ผ๋ก peer ์ธ์ฆ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
์ธ์ฆ์๊ฐ ์์ฑ๋๋ฉด ETCD ์๋ฒ๊ฐ ์์๋ ๋ ์ง์ ๋๋ค. etcd ์๋ฒ์ ๋ํ ์ ์ํ์ผ์๋ etcd ์๋ฒ ํค์ ์ธ์ฆ์์ ๋ํ ์ต์
๊ณผ peer ์ธ์ฆ์๋ฅผ ์ง์ ํ๊ธฐ ์ํ ์ต์
์ด ์ ๊ณต๋๋ค. ๋ํ ํด๋ผ์ด์ธํธ๊ฐ ์ ํจํ์ง๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ CA Root Certificate๊ฐ ํ์ํ๋ค.
ย Kube-API Server
kube-apiserver๋ ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ธ์ฆ์๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ CSR์ ์์ฑํ๋ ๋ถ๋ถ์ ๊ตฌ์ฑ์ด ๊ธฐ์กด๊ณผ ๋ค๋ฅด๋ค.
์ฟ ๋ฒ๋คํฐ์ค์ ๋ชจ๋ ์์
์ kube-apiserver๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ์ ๋ณด๊ฐ ํ์ํ๋ฉด kube-apiserver๋ฅผ ํ์ธํด์ผ ํ๋ค. ์ด๋ก ์ธํด ํด๋ฌ์คํฐ ๋ด์์ API Server๋ ๋ง์ ์ด๋ฆ๊ณผ ๋ณ์นญ์ ๊ฐ์ง๋ค. ๋ณ์นญ ์ด์ธ์๋ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
โข
kubenetes
โข
kubernetes.default
โข
kubernetes.default.svc
โข
kubernetes.default.svc.cluster.local
์ด ๋ชจ๋ ์ด๋ฆ์ kube-apiserver์ ๋ํ ์ธ์ฆ์์ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ค. ์ธ์ฆ์์ ์ด ์ด๋ฆ๋ค์ด ์์ ์, ์ด๋ฐ ์ด๋ฆ๋ค๋ก kube-apiserver๋ฅผ ์ฐธ์กฐํ์ฌ ์ฐ๊ฒฐํ ์ ์๋ค.
CSR ์์ฑ
openssl req -new -key ca.key -subj "/CN=kube-apiserver" -out apiserver.csr \
-config openssl.cnf
Bash
๋ณต์ฌ
[req]
req_extesions = v3_req
distinguished_name = req_distinguished_name
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = 10.96.0.1
IP.2 = 172.17.0.87
YAML
๋ณต์ฌ
Service Configuration
kube-apiserver๋ ๊ตฌ์ฑ ์์๋ก ๋จผ์ ca-file์ด ์ ๋ฌ๋์ด์ผ ํ๋ค. CA ์ธ์ฆ์๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ํ์ธํ๊ธฐ ์ํด ํ์ํ ํ์ ์์์ด๋ค. ๊ทธ ๋ค์ API Server ์ธ์ฆ์๋ฅผ TLS ์ธ์ฆ ์ต์
์ ์ ๊ณต๋์ด์ผ ํ๋ค.
kube-apiserver๋ etcd์ kubelet์ ๋ํ ํด๋ผ์ด์ธํธ์ด๋ฏ๋ก, etcd์ kubelet๊ณผ ํต์ ํ๊ธฐ ์ํ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๊ฐ ํ์ํ๋ค.
ย Kubelet
Server CERT
kubelet ์๋ฒ๋ HTTPS API ์๋ฒ๋ก ๊ฐ ๋
ธ๋์์ ์คํ๋๋ฉฐ ๋
ธ๋ ๊ด๋ฆฌ์ ๋ํ ์ฑ
์์ด ์๋ค. kubelet์ ๋ํ ์ธ์ฆ์, ํค ํ์ด๋ ๊ฐ ๋
ธ๋์ ๋ํด ํ์ํ๋ค. ์ด ์ธ์ฆ์๋ค์ kubelet์ด๋ผ ๋ช
๋ช
ํ์ง ์๊ณ , ๋
ธ๋์ ์ด๋ฆ์ ๋ฐ์ ์ด๋ฆ ์ง๋๋ค.
์ธ์ฆ์๊ฐ ์์ฑ๋๋ฉด ์ด๋ฅผ kubelet ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ๋ค. CA์ธ์ฆ์๋ฅผ ์ง์ ํ๊ณ , ๊ฐ ๋
ธ๋์์ ๋
ธ๋ ์์ ์ ๋ํ ์ธ์ฆ์์ ํค๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
# kubelet-config.yaml (node01)
kind: KubeletConfiguration
apiVersion: kubelet.ocnfig.k8s.io/v1beta1
authntication:
x509:
clientCAFile: "/var/lib/kubernetes/ca.pem"
authorization:
mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
- "10.32.0.10"
podCIDR: "${POD_CIDR}"
resolvConf: "/run/systemd/resolve/resolv.conf"
runtimeRequestTimeout: "15m"
tlsCertFile: "/var/lib/kubelet/kubelet-node01.crt" # node ๋ง๋ค ๋ณ๊ฒฝ
tlsPrivateKeyFile: "/var/lib/kubelet/kubelet-node01.key" # node ๋ง๋ค ๋ณ๊ฒฝ
YAML
๋ณต์ฌ
Client CERT
kubelet์ ์๋ฒ๋ฟ๋ง ์๋๋ผ kube-apiserver์ ํต์ ํ๋ ํด๋ผ์ด์ธํธ๋ก์จ๋ ์ธ์ฆ์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค. ๋
ธ๋๋ kube-scheduler๋ controller-manager์ ๊ฐ์ ์์คํ
๊ตฌ์ฑ ์์์ด๋ฏ๋ก, system ํค์๋๋ฅผ prefix๋ก ๊ฐ์ง๋ฉฐ node ํค์๋๋ฅผ ํจ๊ป ๊ฐ๋๋ค. system:node:<node-name>
์ถ๊ฐ๋ก API Server๋ก๋ถํฐ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ๊ถํ์ ์ป๊ธฐ ์ํด Admin User์ ๊ฐ์ด ๊ทธ๋ฃน์ ๊ฐ์ ธ์ผ ํ๋ค.
openssl req -new -key ca.key \
-subj "/CN=system:node:node01/O=system:nodes" \
-out node01.csr
Bash
๋ณต์ฌ
์ธ์ฆ์๊ฐ ์์ฑ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก kube-config ํ์ผ์์ ์ค์ ๋ค์ด ์ฌ์ฉ๋๋ค.