클러스터를 위한 인증서를 생성하는 방법
openssl, easyrsa, cfssl 같은 다양한 도구 이용 가능하나 강의에서는 openssl을 사용한다.
키 생성
# ca.key 생성
openssl genrsa -out ca.key 2048
# ca.csr 생성
openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr
CN = Common Name
sign certificates 서명하기
# ca.crt 생성
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
맨 처음 생성한 ca.key를 사용하여 ca가 서명 자체 서명함
다른 모든 인증서에는 ca 키 페어를 사용하여 서명할 것
admin user 의 인증서 생성 예시
나머지 클라이언트 인증서(kube-scheduler, kube-controller-manager, kube-proxy) 생성 과정도 동일함
키 생성
# admin.key 생성
openssl genrsa -out admin.key 2048
# admin.csr 생성
openssl req -new -key admin.key -subj "/CN=kube-admin/O=system:masters" -out admin.csr
/O=system:masters : 그룹 디테일 추가하는 옵션(시스템 그룹에 속한다는 의미로 적음)
서명하기
# admin.crt 생성
openssl x509 -req in admin.csr -CA ca.crt -CAkey ca.key -out admin.crt
주의) 먼저 생성한 ca 키 페어를 사용하여 클라이언트 인증서에 서명해야 함 → 그래야 클러스터 내에서 유효한 인증서가 됨
아래는 모두 같은 것(kube-apiserver)을 의미한다.
kube-apiserver = kubernetes = kubernetes.default = kubernetes.default.svc = kubernetes.default.svc.cluster.local
# apiserver.key 생성
openssl genrsa -out apiserver.key 2048
# apiserver.csr 생성
openssl req -new -key apiserver.key -subj "/CN=kube-apiserver" -out apiserver.csr -config openssl.cnf
openssl.cnf 파일 생성 필요
[req]
req_extensions = v3_req
disinguished_name = 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
서명
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -out apiserver.crt
https api 서버로 각 노드에서 실행되며 노드 관리를 함. api server가 노드를 모니터하기 위해 kubelet에 요청을 보냄.
그래서 클러스터 각 노드에 대해 키 페어가 필요함
etcd는 자신만의 CA를 가질 수 있음
그래서 kube-apiserver의 CA와는 다를 수 있음
etcd의 CA를 확인하기 위해서는 /etc/kubernetes/manifests/ 하위의 etcd.yaml 파일 또는 /etc/systemd/system/etcd.service 에 적힌 ca 인증서 경로를 확인해야 함
일반적으로 kube-apiserver의 서버/클라이언트 인증서는 /etc/kubernetes/pki/ 하위에 위치하지만, etcd의 인증서는 /etc/kubernetes/pki/etcd/ 하위에 존재함
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
controlplane /etc/kubernetes/manifests ➜ openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 6151454940737905825 (0x555e5bad428124a1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = kubernetes
Validity
Not Before: Jan 8 10:50:38 2024 GMT
Not After : Jan 7 10:50:38 2025 GMT
Subject: CN = kube-apiserver
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:ae:27:fa:94:91:24:40:be:80:55:4b:aa:c3:2a:
8b:d1:7b:90:1e:85:5b:54:73:5e:c7:b6:4c:1d:93:
cb:d5:d8:6c:ae:8c:8f:41:fd:ce:a2:96:55:9d:d8:
02:93:74:e2:7b:dd:f5:ba:13:a7:5f:ec:7b:f1:52:
...
c7:90:24:69:05:e4:97:d3:0f:ae:2e:63:1e:12:91:
82:92:da:a5:eb:84:47:dc:81:c6:52:8e:b7:b5:1f:
23:28:02:e8:b2:3d:e4:45:cd:68:2c:18:c7:ce:02:
8d:8e:70:9b:7c:6a:9c:66:21:6a:38:ad:cc:42:8a:
b8:2d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:40:3D:BE:BF:C5:80:D7:BD:DF:14:BA:06:F8:84:BA:80:DA:33:67:4B
X509v3 Subject Alternative Name:
DNS:controlplane, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.23.247.9
Signature Algorithm: sha256WithRSAEncryption
9c:19:80:8b:bc:df:4d:ff:12:72:9a:b5:a7:7f:30:73:ae:41:
c4:dd:ff:9c:d8:94:8a:a2:83:1c:06:60:36:c3:9f:ea:c5:b9:
...
a1:90:c8:9b:ff:3a:60:3c:3d:3a:3b:ec:a4:24:6a:72:e8:d8:
9c:5e:04:87:2a:9a:0d:a4:a2:22:96:0a:84:98:cf:f2:7e:a2:
42:55:f4:45
초록색 항목 확인
특히 Issuer(발행자), Expiration(만료일) 확인할 것