Kubernetes API서버 인증서에 SANs 추가
Kubernetes API 서버에서 사용하는 TLS인증서에 SANs(주체 대체 이름)을 추가하는 방법을 작성합니다.
이를 하는 이유는 몇가지 시나리오가 있겠지만,
-. Control Plane 앞에 Load Balancer를 추가하거나,
-. API 서버에 액세스 하는데 사용되는 새로운 Host/URL을 사용하는 상황
-. 등...
이 있습니다.
아래 상황은 클러스터가 kubeadm을 이용해 클러스터를 bootstrapping 할때 만든 기본 인증기관(CA)를 사용한다고 가정하며,
단일 Control Plane 구성을 사용하는 중이라고 가정합니다.
[API서버의 인증서 업데이트]
초기에 kubeadm을 통해 cluster를 bootstrapping 했기때문에, API서버의 인증서를 업데이트(SANs추가작업)할때도 kubeadm을 사용할 수 있습니다.
이를 하기위해, kubeadm의 configuration file이 필요합니다.
현재 구성되어 있는 cluster에서 아래의 명령어로 configuration file을 가져올 수 있습니다.
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml |
Configuration file을 아래와 같이 생겼습니다.
ClusterConfiguration apiServer: extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: <My Cluster> controllerManager: {} dns: imageRepository: <DNS Image Repository> etcd: local: dataDir: /var/lib/etcd imageRepository: <Private or Public Image Repository> kind: ClusterConfiguration kubernetesVersion: v1.28.7 networking: dnsDomain: cluster.local podSubnet: 192.168.0.0/16 serviceSubnet: 10.96.0.0/12 scheduler: {} |
위의 configuration file 예제에 보면, SANs에 대한 목록은 보이지 않습니다.
적어도 1개 이상의 SAN을 추가하려면, apiServer Section에 "certSANs"를 추가해야 합니다.
아래와 같이 추가하면 됩니다.
ClusterConfiguration apiServer: certSANs: - 172.11.11.11 - 172.22.22.22 - k8surl.domain.com extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 |
(만약, kubeadm으로 cluster를 bootstrapping 했을때, --apiserver-cert-extra-sans 옵션을 추가했다면,
Configuration file에 이미 추가되어 있을것입니다. )
위와같이 configuration file에 apiServer Section에 certSANs을 추가했다면, kubeadm을 통해서 인증서를 업데이트 할 준비가 된것입니다.
---
이제 기존의 API 서버 인증서와 키를 이동합니다.
(Kubeadm은 지정된 위치에 인증서가 존재하는 경우, 새 인증서와 키를 생성하지 않습니다. )
mv /etc/kubernetes/pki/apiserver.{crt,key} ~ |
그런후, kubeadm을 이용해 새인증서를 생성합니다.
kubeadm init phase certs apiserver --config kubeadm.yaml |
위의 명령은 지정된 configuration file(kubeadm.yaml)을 사용하여 kubeadm이 API Server의 새 인증서와 키를 만듭니다. (이 작업의 경우에는 추가한 SANs을 포함한 새인증서)
그리고, 새로운 인증서를 pick up 하기위해 API Server를 restart 하는 것입니다.
(서버 재기동 없이 API Server를 restart 하려면, API Server Container를 Stop 및 Pod를 제거하여 재생성 되도록 하면 됩니다. )
API Server가 restart되면 재인증서를 가져와서, 새로 추가된 IP주소 or domain 을 이용하여 연결할 수 있습니다.
---
인증서 변경사항 확인 방법.
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text |
---
클러스터 구성 업데이트
마지막 단계는 kubeadm을 이용하여 클러스터에 configmap을 업데이트 하는 것입니다.
이는 나중에 kubeadm을 통해 클러스터 업그레이드를 조율 할때, 업데이트된 정보다 클러스터에 존재해야 하기때문에 중요합니다.
kubeadm init phase upload-config kubeadm --config kubeadm.yaml |
---
작업전 백업해두면 좋을 파일
기존 인증서 및 config 파일
인증서 Path : /etc/kubernetes/pki
Config 파일 Path : /etc/kubernetes
출처: <https://blog.scottlowe.org/2019/07/30/adding-a-name-to-kubernetes-api-server-certificate/>