kubectl
เป็นคำสั่งสำหรับใช้จัดการ Kubernetes Cluster โดยจะใช้ใบรับรองอิเล็กทรอนิกส์ในการติดต่อกับ control plane ซึ่งอาจจะพบปัญหาที่ทำให้ไม่สามารถใช้งานคำสั่งดังกล่าวได้เมื่อผ่านไประยะเวลาหนึ่ง
ปัญหา
เมื่อใช้คำสั่ง เช่น kubectl version
หรือ kubectl get node
เป็นต้น ผู้ใช้จะพบข้อผิดพลาด “error: You must be logged in to the server (the server has asked for the client to provide credentials)” นอกจากนี้ยังอาจพบข้อผิดพลาดอื่นร่วมด้วย เช่น “E0808 14:08:21.359314 3292 memcache.go:265] couldn’t get current server API group list”
สาเหตุ
ปัญหาดังกล่าวอาจเกิดจากใบรองของ system admin ในไฟล์ kubeconfig หมดอายุ ซึ่งมักจะมีอายุเพียง 1 ปี (ส่วน CA ที่รับรองใบรับรองดังกล่าวมักจะมีอายุ 10 ปี) โดยสามารถตรวจสอบได้จากการนำข้อมูลในค่า client-certificate-data
ไปถอดรหัสด้วย BASE64 จากนั้นแสดงโดยใช้โปรแกรม เช่น openssl
หรือ keytool
เพื่อแสดงรายละเอียดของใบรับรอง ตัวอย่างด้านล่างเป็นผลลัพธ์จากการใช้คำสั่ง kubectl config view --raw | awk '/client-certificate-data/{print $2}' | base64 -d | openssl x509 -text -noout
ในโปรแกรม Git Bash
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
00:00:00:00:00:00:00:00
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN = rke2-client-ca@0000000000
Validity
Not Before: Jul 27 06:30:58 2022 GMT
Not After : Jul 27 06:30:58 2023 GMT
Subject: O = system:masters, CN = system:admin
...
จากผลลัพธ์ จะเห็นได้ว่าใบรับรองได้หมดอายุลงหลังจากวันที่ 27 กรกฎาคม 2566 เวลา 6.30:58
วิธีแก้ไขปัญหา
เนื่องจาก RKE2 มีกลไกในการต่ออายุใบรับรองโดยอัตโนมัติอยู่แล้ว จึงสามารถแก้ไขปัญหาได้โดยเข้าไปคัดลอกค่า certificate-authority-data
(เฉพาะกรณีที่หมดอายุแล้ว), client-certificate-data
และ client-key-data
จากไฟล์ /etc/rancher/rke2/rke2.yaml ในโนดที่ทำหน้าที่เป็น control plane (โนดที่รัน rke2-server) ไปไว้แทนที่ค่าเดิมของไฟล์ ~/.kube/config
ของคอมพิวเตอร์เครื่องที่ไม่สามารถใช้คำสั่ง kubectl
ได้