kubernetes – hướng dẫn sửa lỗi “existing bootstrap client certificate is expired”

Lâu rồi mình mới lại rảnh rỗi để viết bài, thiệt là ái ngại quá đi 😩. Trước khi bắt đầu thì mình muốn nói trước là bài viết này có những thông tin liên quan tới DevOps cũng như vài thuật ngữ liên quan tới Kubernetes 😬. Nếu bạn cảm thấy không chắc mình quan tâm tới 2 chủ đề trên thì bạn có thể …. đọc tiếp phần dưới để ủng hộ mình cũng được🤣, không sao cả, đọc nhiều thì cũng tốt mà =]] Nhưng mà đừng quá lo lắng vì ở dưới mình cũng sẽ có nói qua về Kubernetes để bạn nào chưa biết gì về nó thì cũng có thể biết Kubernetes là gì cũng như hiểu được sơ sơ những điều mình đề cập trong bài viết này.

Hướng dẫn cách sửa lỗi khi Kubernetes Certificate & Key (PKI) bị hết hạn

Ở phần này mình sẽ hướng dẫn các bạn cách sửa lỗi liên quan tới "Client Certificates Issue" khi làm việc với Kubernetes.

Để nhận biết bạn có gặp phải lỗi trên không thì bạn chỉ cần thấy Kubernetes cluster của bạn không hoạt động, và khi thực hiện kiểm tra Kubernetes cluster thông qua các lệnh như mô tả dưới đây và nếu bạn nhận về kết quả giống như những mô tả dưới đây, thì lúc này thì xin chúc mừng bạn, bạn đã quay trúng vào ô may mắn =))


kubectl cluster-info

The connection to the server <apiserver_advertise_ip>:6443 was refused - did you specify the right host or port?

Lấy thông tin về Kubernetes Cluster


systemctl status kubelet # Lệnh để lấy thông tin về status của kubelet service

● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: activating (auto-restart) (Result: exit-code) since Mon 2020-06-01 08:51:47 +0530; 3s ago
     Docs: https://kubernetes.io/docs/
  Process: 14027 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
 Main PID: 14027 (code=exited, status=255)

Kiểm tra trạng thái hiện tại của Kubelet service


journalctl | grep kubelet

<date> <node_name> kubelet[3653]: E0601 08:42:54.232397    3653 bootstrap.go:264] Part of the existing bootstrap client certificate is expired: 2020-04-11 02:01:22 +0000 UTC
<date> <node_name> kubelet[3653]: F0601 08:42:54.234118    3653 server.go:265] failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory
<date> <node_name> systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
<date> <node_name> systemd[1]: Unit kubelet.service entered failed state.
<date> <node_name> systemd[1]: kubelet.service failed.
<date> <node_name> systemd[1]: kubelet.service holdoff time over, scheduling restart.
<date> <node_name> systemd[1]: Stopped kubelet: The Kubernetes Node Agent.

Lấy thông tin log hiện tại của Kubelet service


Các bước để tiến hành sửa lỗi

Lưu ý:

  1. Nếu các bạn đang sử dụng Kubernetes Cluster với chế độ HA (High-Availability) thì các bạn cần thực hiện các lệnh dưới đây trên toàn bộ các máy đang đóng vai trò là Control Plane
  2. Nếu bạn nào đang sử dụng Kubernetes 1.17 trở lên nhưng thông qua việc upgrade Kubernetes từ phiên bản 1.16 thì các bạn cần thực hiện việc upgrade toàn bộ Kubernetes configuration files để thực hiện việc gia hạn certificates cho cluster. Do bản dưới 1.17 có 1 con bug nhẹ dẫn tới việc phải thực hiện việc update /etc/kubernetes/kubelet.conf để nó trỏ tới file certificates mới nhất (thường thì file đó sẽ nằm trên /var/lib/kubelet/pki/kubelet-client-[latest date].pem, ví dụ /var/lib/kubelet/pki/kubelet-client-2020-10-11-04-30-38.pem)
  3. Nếu trước đây khi tiến hành cài đặt Kubernetes mà bạn có sử dụng những external configuration options thì khi tiến hành generate lại những files configuration thì bạn cũng phải input tương tự như lúc bạn cài đặt Kubernetes. Nếu bạn nào không nhớ thì tốt nhất nên backup lại toàn bộ những file .yaml ở những thư mục sau /etc/kubernetes và /etc/kubernetes/manifests/, khi đó bạn có thể compare file cũ và file mới để cấu hình lại cho đúng

Đối với Kubernetes version 1.17 trở xuống


Đầu tiên thực hiện việc generate lại những Certificates cần thiết để Kubernetes Cluster có thể hoạt động:

root@ubuntu:/var/lib/kubelet/pki# kubeadm init phase certs all

W1011 04:05:49.656588   17889 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Using existing ca certificate authority
[certs] Using existing apiserver certificate and key on disk
[certs] Using existing apiserver-kubelet-client certificate and key on disk
[certs] Using existing front-proxy-ca certificate authority
[certs] Using existing front-proxy-client certificate and key on disk
[certs] Using existing etcd/ca certificate authority
[certs] Using existing etcd/server certificate and key on disk
[certs] Using existing etcd/peer certificate and key on disk
[certs] Using existing etcd/healthcheck-client certificate and key on disk
[certs] Using existing apiserver-etcd-client certificate and key on disk
[certs] Using the existing "sa" key

Khởi tạo lại toàn bộ Certificates cần thiết cho Kubernetes Cluster


Kế tiếp thực hiện việc khởi tạo lại những files configuration để cấu hình cho Kubernetes Cluster

root@ubuntu:/var/lib/kubelet/pki# kubeadm init phase kubeconfig all

W1011 04:09:11.643497   18731 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/scheduler.conf"

Khởi tạo lại toàn bộ files configuration cho Kubernetes Cluster


Kế tiếp thực hiện việc cấu hình lại PKI của Kubelet service

root@ubuntu:/var/lib/kubelet/pki# kubeadm init phase kubelet-finalize all

W1011 04:19:14.156610   21834 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key

Cấu hình lại PKI của kubelet service


Và cuối cùng thực hiện việc restart Kubelet service

root@ubuntu:/var/lib/kubelet/pki# kubeadm init phase kubelet-start 

W1011 04:21:20.881312   22744 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet

Restart lại kubelet service


Đối với Kubernetes version 1.17 trở lên

Đối với những bạn sử dụng Kubernetes version 1.17 trở lên thì mọi thứ sẽ đơn giản hơn, các bạn chỉ cần thực hiện lệnh sau đây là đủ

root@ubuntu:/etc/kubernetes/pki# kubeadm alpha 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 -oyaml'
[renew] Error reading configuration from the Cluster. Falling back to default configuration

W1011 05:29:18.365723   19228 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
certificate embedded in the kubeconfig file for the admin to 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

Thực hiện việc gia hạn những certificates sử dụng trong Kubernetes Cluster


Tiến hành kiểm tra việc gia hạn certificates, lúc này bạn chú ý giá trị ở cột “EXPIRES”, nó sẽ cho bạn biết thời gian mà những certificates này sẽ hết hạn

root@ubuntu:/etc/kubernetes/manifests# kubeadm alpha 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 -oyaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Oct 11, 2021 05:29 UTC   364d                                    no      
apiserver                  Oct 11, 2021 05:29 UTC   364d            ca                      no      
apiserver-etcd-client      Oct 11, 2021 05:29 UTC   364d            etcd-ca                 no      
apiserver-kubelet-client   Oct 11, 2021 05:29 UTC   364d            ca                      no      
controller-manager.conf    Oct 11, 2021 05:29 UTC   364d                                    no      
etcd-healthcheck-client    Oct 11, 2021 05:29 UTC   364d            etcd-ca                 no      
etcd-peer                  Oct 11, 2021 05:29 UTC   364d            etcd-ca                 no      
etcd-server                Oct 11, 2021 05:29 UTC   364d            etcd-ca                 no      
front-proxy-client         Oct 11, 2021 05:29 UTC   364d            front-proxy-ca          no      
scheduler.conf             Oct 11, 2021 05:29 UTC   364d                                    no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Oct 09, 2030 03:00 UTC   9y              no      
etcd-ca                 Oct 09, 2030 03:00 UTC   9y              no      
front-proxy-ca          Oct 09, 2030 03:00 UTC   9y              no  

Thực hiện kiểm tra thời hạn của những certificates vừa được gia hạn


Đối với việc sử dụng kubeadm không thành công

Nếu 2 cách trên mà cluster của bạn vẫn chưa chạy được thì điều đầu tiên bạn cần làm là:

  • Thực hiện reboot lại machine thông qua lệnh sau
sudo reboot
  • Tiến hành kiểm tra lại log của Kubelet service thông qua 2 lệnh sau
journalctl | grep kubelet 

service kubelet status
  • Nếu lúc này bạn vẫn nhận được thông báo có chứa thông tin lỗi như mình đã đề cập ở ban đầu thì bạn nên “hủy diệt” cả Kubernetes Cluster và tiến hành cài lại

Mình đùa thôi vẫn chưa hẳn là hết cách cứu, mà chỉ là lúc này làm sẽ hơi thủ công và cực hơn 1 tí. Khi này bạn sẽ cần phải tiến hành những bước sau (khúc này thì mình được cu em chuyên về DevOps @locmai hướng dẫn =]] mình chỉ coi thử và làm theo):

  • Cấu hình certificates tương ứng cho 4 phần (Admin, Controller-manager, Kubelet và Scheduler), có nhiều cách khác nhau để generate certificates nhưng ở đây mình sẽ dùng cfssl (hướng dẫn cài đặt cfssl). Duới đây là 1 file mẫu để generate certificate cho Kubelet service (để biết máy bạn có hostname là gì thì bạn có thể dùng lệnh sau đối với hệ điều hành ubuntu hostname -s)
{
  "CN": "system:node:thay_thế_bằng_host_name_của_bạn",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "VN",
      "L": "HCM",
      "O": "system:nodes",
      "OU": "IAMGOD",
      "ST": "BT"
    }
  ]
}
  • Dùng ca.crt và ca.key từ folder /etc/kubernetes/pki để tạo ra certificates cho Kubernetes cluster, dưới đây là lệnh để generate certificate cho Kubelet service (chỗ -hostname bạn cần truyền vô thông tin địa chỉ IP của máy hiện tại bạn đang generate certificate, như lệnh dưới đây thì máy mình đang dùng làm demo có địa chỉ IP là 192.168.10.10)
cfssl gencert -ca=pki/ca.crt -ca-key=pki/ca.key -hostname=ubuntu,127.0.0.1,192.168.10.10 -profile=kubernetes ubuntu-csr.json | cfssljson -bare ubuntu
  • Cập nhật thông tin của những certificates bạn vừa tạo ở trên vô những file configuration ở thư mục /etc/kubernetes. Lưu ý là với những file configuration dưới đây thì thông tin của certificates cũng như private key đều phải được mã hóa base64 trước khi input vô file (để có thể encode sang base64 thì các bạn có thể dùng lệnh sau ở ubuntu base64 /etc/kubernetes/ubuntu-key.pem ở đây /etc/kubernetes/ubuntu-key.pem là đường dẫn tới file bạn cần mã hóa sang base64)
    • admin.conf
    • controller-manager.conf
    • kubelet.conf
    • scheduler.conf
  • Restart lại machine và coi thử Kubernetes cluster đã chạy chưa. Đến lúc này mà nó vẫn chưa chạy thì … chắc lỗi định mệnh rồi, tiến hành sử dụng tuyệt chiêu cuối thôi (nhưng mình hy vọng các bạn không tới mức phải chơi tuyệt chiêu cuối này)
kubeadm reset
kuebadm init

Như vậy mình đã xong phần hướng dẫn cách khắc phục lỗi khi mà Kubernetes Cluster bị tình trạng "Client Certificates Issue" 😂😂😂



Nếu bạn nào nãy giờ đọc mớ ở trên và có cảm giác không hiểu gì cả thì phần bài viết dưới đây hy vọng sẽ giúp các bạn dễ hình dung hơn về những gì mình viết ở trên.

Giải đáp về Kubernetes Cluster

Những thuật ngữ cơ bản trong Kubernetes

Để giúp các bạn có thể dễ dàng hiểu được các thuật ngữ về Kubernetes mà mình dùng trong bài viết, thì ở đây mình liệt kê ra những thuật ngữ cơ bản nhất của Kubernetes kèm theo phần giải thích kế bên cho các bạn.

Thuật ngữChú thích
API serverThành phần quan trọng giúp người dùng có thể dễ dàng sử dụng Kubernetes. API server sẽ đóng vai trò trong việc giao tiếp giữa người dùng với những thành phần khác bên trong Kubernetes. Ví dụ khi bạn muốn triển khai 1 ứng dụng lên Kubernetes thì lúc này bạn chỉ cần thực hiện 1 API request đơn giản xuống API server và việc còn lại thì cứ để API server tự kết nối tới những thành phần còn lại trong Kubernetes và thực hiện việc triển khai ứng dụng cho bạn. Hình minh họa dưới đây sẽ mô tả cách mà API Server hoạt động:
ContainerLà 1 đơn vị của ứng dụng, nơi mà ứng dụng được đóng gói lại kèm theo những thành phần liên quan tới ứng dụng đó, giúp nó có thể chạy 1 cách dễ dàng ở bất cứ môi trường nào. Còn ví dụ kiểu cục súc 😂 và dễ hình dung nhất thì container giống như là việc bạn có 1 tập những videoxxx nằm trong thư mục xxx, và chỉ coi được với ứng dụng playxxx, lúc này bạn muốn chia sẻ cho những anh em đồng … khác cùng coi, thay vì bạn bắt anh em của bạn phải cài ứng dụng playxxx rồi kèm theo thiết lập đủ thứ thì bạn chỉ cần nén thư mục xxx kèm theo ứng dụng playxxx đã được bạn cài đặt sẵn bên trong thư mục đó, và sau đó bạn chỉ cần đưa file nén đó cho anh em và lúc này anh em của bạn có thể thư giãn tẹt ga với cái thư mục nén đó. Ở đây container chính là folder xxx và những thành phần bên trong folder đó bao gồm videoxxx và ứng dụng playxxx =))
ImageLà kết quả của việc đóng gói toàn bộ ứng dụng cũng như những thành phần cần cho việc chạy ứng dụng đó, Image sau khi được đóng gói thì thường sẽ có format dạng .tar.gz. Nếu hiểu theo kiểu ví dụ ở trên thì Image có thể được coi là file nén sinh ra sau khi thực hiện việc nén toàn bộ folder xxx :))
DockerDocker là nền tảng phần mềm cho phép bạn dựng, kiểm thử và triển khai ứng dụng một cách nhanh chóng. Docker đóng gói phần mềm vào các đơn vị tiêu chuẩn hóa được gọi là container. Bằng cách sử dụng Docker, bạn có thể nhanh chóng triển khai và thay đổi quy mô ứng dụng vào bất kỳ môi trường nào và biết chắc rằng mã của bạn sẽ chạy được.
Container Runtime Container runtime là 1 ứng dụng phần mềm cho phép bạn chạy các ứng dụng được đóng gói lại thành những container, nếu như hiểu theo ví dụ ở trên thì container runtime giống như ứng dụng thực hiện việc giải nén và tự động mở ứng dụng playxxx và cho phép bạn coi những videoxxx.
Container Runtime thường rất đa dạng, phổ biết nhất hiện tại là Docker, nhưng bên cạnh đó vẫn có những đối thủ khác như podman, CRI-O hay Containerd
Container runtime interface
(CRI)
Container runtime interface là một giao ước về việc các ứng dụng khi được xây dựng nhằm thực hiện việc chạy các container (hay hiểu đơn giản là việc xây dựng 1 ứng dụng container runtime) phải cam kết phải đảm bảo có đầy đủ những tiêu chí giao ước. Ví dụ như khi nói về xe máy, chúng ta có rất nhiều hãng xe máy khác nhau như Honda, Yamaha, Suzuki, nhưng các hãng đều có giao ước rằng, khi làm xe máy thì các hãng đều phải có 1 cái khung sườn, 2 cái bánh xe chẳng hạn
Control PlaneTầng điều khiển container, được dùng để đưa ra API và các interface để định nghĩa, triển khai, và quản lý vòng đời của các container
PodĐối tượng nhỏ nhất và đơn giản nhất của Kubernetes. Một Pod đại diện cho một tập các containers đang chạy trên cluster
kube-controller-managerLà 1 thành phần của Control Plane và có mục đích điều khiển toàn bộ những processes bên trong Kubernetes
kube-proxykube-proxy là một network proxy chạy trên mỗi node trong cluster, thực hiện một phần Kubernetes Service
kube-proxy duy trình network rules trên các node. Những network rules này cho phép kết nối mạng đến các pods từ trong hoặc ngoài cluster
kube-proxy sử dụng lớp packet filtering của hệ điều hành nếu có sẵn. Nếu không thì kube-proxy sẽ tự điều hướng network traffic
kubectlCông cụ chạy trực tiếp từ command line (giống kiểu các bạn muốn biết thông tin IP của máy mình thì gõ lệnh ifconfig hay ipconfig vậy) để thực thi những lệnh của người dùng xuống Kubernetes API server. Bạn có thể tạo, cập nhật, xóa hay trích xuất thông tin những đối tượng bên trong Kubernetes với kubectl
KubeletMột agent chạy trên mỗi node nằm trong cluster. Nó giúp đảm bảo rằng các containers đã chạy trong một pod. Đây là thành phần giao tiếp với Kubernetes API Server, và cũng quản lý các container
Kubernetes APITập hợp những RESTful API để cho người dùng có thể dễ dàng thực hiện việc quản lý Kubernetes thông qua những API này
MinikubeMinikube là một bộ cài đặt Kubernetes bằng cách tạo ra một máy ảo trên máy tính của bạn và triển khai một cluster đơn giản bên trong máy ảo đó chỉ bao gồm một Node
Master nodeMột master node là một máy trong Kubernetes mà nó triển khai control plane trên chính nó
Worker nodeMột worker node là một máy worker trong Kubernetes
Một worker node có thể là một máy tính ảo hay máy tính vậy lý, tùy thuộc vào cluster. Nó bao gồm một số daemons hoặc services cần thiết để chạy các Pods và được quản lý bởi control plane. Daemons trên một node bao gồm kubeletkube-proxy, và một container runtime triển khai theo CRI như Docker.
ClusterMột tập hợp các worker machine, được gọi là node, dùng để chạy các containerized application. Mỗi cụm (cluster) có ít nhất một worker node. Các worker node chứa các pod (là những thành phần của ứng dụng). Mỗi cluster sẽ có ít nhất 1 Control Plane quản lý các worker node và pod trong cluster. Trong môi trường sản phẩm (production environment), Control Plane thường chạy trên nhiều máy tính và một cluster thường chạy trên nhiều node, cung cấp khả năng chịu lỗi (fault-tolerance) và tính sẵn sàng cao (high availability). Máy nào đang chạy control plane thì có thể coi máy đó là master node
BẢNG THUẬT NGỮ KUBERNETES CƠ BẢN

Một Kubernetes Cluster sẽ bao gồm những gì?

Đầu tiên thì nếu bạn nào chưa biết Kubernetes là gì thì mình nghĩ các bạn có thể coi thêm tham khảo bài giới thiệu What is Kubernetes? ở đây. Còn mà nói theo ngôn ngữ dễ hiểu nhất thì Kubernetes là cái thứ giúp cho việc quản lý và điều khiển sự hoạt động của những containers, containers ở đây được hiểu là nơi chứa những ứng dụng mà bạn dùng để sử dụng ví dụ như WordPress, JMeter hay Jenkins chẳng hạn, nói chung thì nếu đến giờ bạn vẫn không biết container là gì thì các bạn nên cập nhật kiến thức lẹ nhé :]] chứ không là lạc hậu quá đó (các bạn có thể coi lại bài viết này Giới thiệu về Docker).

Và vì nó có khả năng quản lý và điều khiển sự hoạt động của những containers, cho nên Kubernetes Cluster sẽ bao gồm hai thứ chính là control plane components và worker/node components. Sự khác nhau của hai thành phần trên là:

  • Control Plane/Master machine : thực hiện việc quản lý những worker/node có trong cluster, ví dụ tăng hay giảm số lượng worker/node machines trong cluster, thực hiện việc yêu cầu worker/node machines khởi tạo hay “hủy diệt” containers nào đó, và nhiều thứ khác liên quan tới việc quản lý worker/node machines. Ở đây thì control plane machine có thể là 1 máy hoặc nhiều máy khác nhau, khi thực hiện việc thiết lập control plane trên nhiều máy thì lúc này bạn đã thiết lập được một Kubernetes Cluster có tính HA (High-Availability – hiểu nôm na là 1 Kubernetes Cluster có khả năng duy trì hoạt động ở mức cao nhất, giống kiểu nó có nhiều hệ thống dự phòng cho nó, chết 1 thằng thì vẫn có thằng khác hoạt động được). Ở 1 vài chỗ thì họ cũng gọi Control Plane machine là Master Node machine.
  • Worker/Node machine: thực hiện việc quản lý và điều khiển sự hoạt động của containers đang chạy trên worker/node. Ở đây thì worker/node có thể hiểu nôm na là 1 cái machine riêng biệt, nó có thể là physical machine hoặc là 1 virtual machine chẳng hạn.
  • Các thành phần chính tạo nên một Control Plane:
    • kube-apiserver: Kubernetes sẽ cung cấp cho các bạn các API để có thể tương tác với Kubernetes service bên dưới. Ví dụ khi bạn thực hiện việc deploy
    • etcd
    • kube-scheduler
    • kube-controller-manager
  • Các thành phần chính tạo nên một Worker/Node:
    • kubelet
    • kube-proxy:
    • Container runtime(Docker, containerd, CRI-O)

Vậy nếu bạn xây dựng 1 Kubernetes Cluster chỉ với 1 máy thì nó đồng nghĩa là máy đó cũng đồng thời vừa là Control Plane và cũng đồng thời là Worker/Node (đây là cách Minikube đang hoạt động), nhưng mà thường thì khi sử dụng production thì bạn nên thiết lập Kubernetes Cluster với mô hình HA sẽ tốt hơn, đặc biệt là đối với mô hình Kubernetes Cluster Bare Metal (thường chắc cái này mấy anh công ty product ở Việt Nam hay xài nhiều)

Vậy lỗi trên là do đâu gây ra?

Đừng lo lắng nếu bạn đọc không hiểu những cái trên là gì vì khi bạn cài đặt Kubernetes thì những thứ trên sẽ được gói gọn lại thông qua 1 lệnh duy nhất để khởi tạo Kubernetes.

Khi thực hiện việc cài đặt Kubernetes Cluster thì sẽ có nhiều thứ xảy ra trong đó là việc tiến hành chạy những service như API server, kubelet, etcd và vài cái services khác nữa. Những services này thường sẽ liên lạc với nhau thông qua các giao thức như HTTP hoặc gRPC. Và vì đặc thù muốn có tính bảo mật cao nhất mà những services này đều yêu cầu việc giao tiếp với nhau cần những certificate (chứng thực cho việc giao tiếp giữa các service với nhau có an toàn hay không, bạn nào muốn tìm hiểu về Certificate trong HTTPS/gRPC là gì thì có thể coi bài ở link này). Theo như mặc định thì khi các bạn cài đặt Kubernetes Cluster thì toàn bộ những certificates được tạo ra đều sẽ có thời hạn là 1 năm.

Và sau 1 năm sử dụng thì nếu các bạn không tiến hành gia hạn những certificates đó thì sẽ dẫn tới lỗi như mình gặp ở bài này.

2 thoughts on “kubernetes – hướng dẫn sửa lỗi “existing bootstrap client certificate is expired”

  1. Bài viết rất hữu ích. Mình đã gặp lỗi này, tuy nhiên khi mình chạy tới lệnh: “kubeadm init phase kubelet-finalize all” thì báo lỗi không có tham số: kubelet-finalize ? Mình đang dùng phiên bản k8s 1.15.4, và chỉ có một số tham số bên dưới. Trong trường hợp này thì xử lý thế nào bạn nhỉ

    Usage:
    kubeadm init phase [command]

    Available Commands:
    addon Install required addons for passing Conformance tests
    bootstrap-token Generates bootstrap tokens used to join a node to a cluster
    certs Certificate generation
    control-plane Generate all static Pod manifest files necessary to establish the control plane
    etcd Generate static Pod manifest file for local etcd
    kubeconfig Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
    kubelet-start Write kubelet settings and (re)start the kubelet
    mark-control-plane Mark a node as a control-plane
    preflight Run pre-flight checks
    upload-certs Upload certificates to kubeadm-certs
    upload-config Upload the kubeadm and kubelet configuration to a ConfigMap

    Like

    1. Option kubelet-finalize được thêm vào từ sau bản 1.17 của kubeadm, bạn có thể thử upgrade kubeadm (sẽ không ảnh hưởng tới version của cluster hiện tại), chạy lại câu lệnh trên để tận dụng phần cert rotation của kubeadm.

      Like

Leave a comment