JUST WRITE

k8s 날 거부하지 마 - Certificate 만료 갱신 본문

MLOps/Kubernetes

k8s 날 거부하지 마 - Certificate 만료 갱신

천재보단범재 2023. 10. 18. 16:19

Kubernetes Certificate 만료 갱신

k8s 날 거부하지 마

Kubernetes Cluster를 운영하고 있습니다.

Kubernetes Cluster에서 몇 가지 확인할 사항이 있어 kubectl command를 날렸습니다.

그런데 아래와 같은 Error가 나오면서 kubectl command가 되지 않았습니다.

$ kubectl get ns
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2023-10-17T15:40:55+09:00 is after 2023-10-17T04:15:30Z

처음 겪어보는 일이라 너무 당황하였습니다.

Log를 다시 살펴보니 인증서가 만료됐다는 것을 확인할 수 있었습니다.

이번 포스팅에서는 Kubernetes 인증서 갱신 작업을 정리하도록 하겠습니다.

Kubernetes 인증서

Kubeadm으로 Kubernetes Cluster를 구성하였으면 쉽게 인증서 갱신을 할 수 있습니다.

 

AWS EC2 Kubernetes Cluster 설치(1) Kubeadm - containerd 설치

AWS EC2 Kubernetes Cluster 설치 이번 포스팅에서는 AWS EC2 인스턴스 4개에 Kubernetes Cluster를 구성해보았다. 각 인스턴스는 Ubuntu Sever 22.04에 t3.large로 구성하였다. 1개의 Master와 3개의 Worker로 구성하였다. K

developnote-blog.tistory.com

kubeadm으로 설치하면 /etc/kubernetes/pki 경로에 인증서들을 확인할 수 있습니다.

다양한 인증서들을 확인할 수 있습니다.

$ ls -all /etc/kubernetes/pki/

./
../
apiserver.crt
apiserver-etcd-client.crt
apiserver-etcd-client.key
apiserver.key
apiserver-kubelet-client.crt
apiserver-kubelet-clent.key
ca.crt
ca.key
etcd/
front-proxy-ca.crt
front-proxy-ca.key
front-proxy-client.crt
front-proxy-client.key
sa.key
sa.pub

Kubernetes Cluster에 접속할 때 해당 인증서들이 필요합니다.

Kubeadm command로 인증서 기간을 확인할 수 있습니다.

$ kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Oct 17, 2023 04:15 UTC   <invalid>       ca                      no
apiserver                  Oct 17, 2023 04:15 UTC   <invalid>       ca                      no
apiserver-etcd-client      Oct 17, 2023 04:15 UTC   <invalid>       etcd-ca                 no
apiserver-kubelet-client   Oct 17, 2023 04:15 UTC   <invalid>       ca                      no
controller-manager.conf    Oct 17, 2023 04:15 UTC   <invalid>       ca                      no
etcd-healthcheck-client    Oct 17, 2023 04:15 UTC   <invalid>       etcd-ca                 no
etcd-peer                  Oct 17, 2023 04:15 UTC   <invalid>       etcd-ca                 no
etcd-server                Oct 17, 2023 04:15 UTC   <invalid>       etcd-ca                 no
front-proxy-client         Oct 17, 2023 04:15 UTC   <invalid>       front-proxy-ca          no
scheduler.conf             Oct 17, 2023 04:15 UTC   <invalid>       ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jul 01, 2033 08:28 UTC   9y              no
etcd-ca                 Jul 01, 2033 08:28 UTC   9y              no
front-proxy-ca          Jul 01, 2033 08:28 UTC   9y              no

kubeadm command로 확인해 보니 인증서 기간이 만료됐다는 것을 알 수 있습니다.

RESIDUAL TIME이 invalid인 것을 확인할 수 있습니다.

Kubernetes 인증서 갱신

kubeadm으로 인증서 갱신이 가능합니다.

다만 sudo 권한이 필요합니다.

kubeadm command로 인증서를 갱신하면 /etc/kubernetes/pki/ 내 인증서가 변경된 것을 알 수 있습니다.

# kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[renew] Error reading configuration from the Cluster. Falling back to default configuration

certificate embedded in the kubeconfig file for the admin in use and for kubeadm itself renewed
certificate for serving the kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

인증서 갱신하고 추가로 작업할 게 있습니다.

Static pod 재시작

인증서 갱신을 했지만 추가작업이 필요합니다.

kubeadm command를 실행하면 마지막에 아래와 같은 문구를 확인할 수 있습니다.

You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

아래 4가지 pod을 재시작하라고 나옵니다.

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • etcd

해당 Pod들을 Static Pod이라고 합니다.

API Server 없이 Kubelet으로 관리되는 Pod들입니다.

kubelet config 파일을 확인해 보면 Static Pod이 어디에 정의되는지 알 수 있습니다.

$ systemctl status kubelet
kubelet.service - kubelet: The Kubernetes Node Agent
    Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
   Drop-In: /etc/systemd/system/kubelet.service.d
    Active: active (running) since Wed 2023-02-01 17:29:09 KST; 8 months 24 days ago
      Docs: https://kubernetes.io/docs/home/
  Main PID: 2790661 (kubelet)
     Tasks: 69 (limit: 617426)
    Memory: 94.7M
       CPU: 3w 3d 10h 32min 16.120s
    CGroup: /system.slice/kubelet.service
           - 2790661 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gr.io/pause:3.5 -resolv-conf=/run/systemd/resolve/resolv.conf

kubelet config파일은 default로 설정하면 /var/lib/kubelet/config.yaml입니다.

$ cat /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
...
...
...
staticPodPath: /etc/kubernetes/manifests
...

/etc/kubernetes/manifests 에 Static Pod 정의서들을 확인할 수 있습니다.

$ ls -all /etc/kubernetes/manifests/
./
../
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml

해당 Pod들은 Master Node에 생성됩니다.

$ kubectl get po -n kube-system
NAME                                    READY    STATUS   RESTARTS   AGE
...
pod/etcd-k8smaster                       1/1     Running     0       283d
pod/kube-apiserver-k8smaster             1/1     Running     0       283d
pod/kube-controller-manager-k8smaster    1/1     Running     0       283d
pod/kube-proxy-k8smaster                 1/1     Running     0       283d
...

위 문구처럼 해당 Pod들도 인증서를 통해서 Cluster에 접근해야 하기 때문에 재시작이 필요합니다.

재시작하는 방법은 /etc/kubernetes/manifests내 yaml 파일을 다른 경로로 옮겼다가 다시 복구하면 됩니다.

$ mv /etc/kubernetes/manifests /etc/kubernetes/manifests-backup
# 10초 뒤
$ mv /etc/kubernetes/manifests-backup /etc/kubernetes/manifests

해당 작업을 진행하면 Static Pod내 Container가 재시작이 됩니다.

Static Pod을 delete해서 Pod을 재생성하는 방식을 소개하는 곳도 있습니다.

저의 경우 해당 방식으로는 갱신이 되지 않았습니다.

admin.conf 복사

마지막으로 admin 인증서도 kubectl로 접근하는 계정에 업데이트해 줍니다.

$ sudo cp /etc/kubernetes/admin.conf /home/{USER}/.kube/config

이제 kubectl command로 확인해 봅니다.

$ kubectl get ns
NAME               STATUS    AGE
airflow            Active    283d
default            Active    283d
kube-node-lease    Active    283d
kube-public        Active    283d
kube-system        Active    283d
...

[참고사이트]

 

728x90
반응형
Comments