일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- EC2
- Operating System
- Packet
- Spring
- Python
- Network
- JavaScript
- grafana
- java
- kubernetes
- PostgreSQL
- airflow
- Kafka
- Trino
- CSV
- kubectl
- OS
- docker
- zookeeper
- kubeadm
- AWS
- log
- Vision
- CVAT
- MAC address
- helm
- aws s3
- tcp
- ip
- jvm
- Today
- Total
JUST WRITE
k8s 날 거부하지 마 - 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를 구성하였으면 쉽게 인증서 갱신을 할 수 있습니다.
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
...
[참고사이트]
'MLOps > Kubernetes' 카테고리의 다른 글
업그레이드해도 될까요? - Control Plane Upgrade (0) | 2024.04.25 |
---|---|
여기만 사용해! - 특정 Namespace 전용 User 생성 (0) | 2024.02.15 |
명령어 한 번에 Kubernetes 설치하기(2) - AWS ENI를 이용한 설치 (0) | 2023.10.04 |
Pod 주기적으로 삭제하기 - Kubernetes에 CronJob 세팅 (0) | 2023.08.06 |
Helm도 git처럼 diff가 가능하다고?! - Helm Plugin 설치 (0) | 2023.07.19 |