IT Knowledge/Kubernetes

Kubernetes API서버 인증서에 SANs 추가

Seok. 2024. 7. 8. 14:36
반응형

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/>

반응형