แก้ไขปัญหากรณีที่ไม่สามารถใช้คำสั่ง kubectl ได้ (the server has asked for the client to provide credentials) ใน RKE2


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 ได้

ตำแหน่งของค่า certificate-authority-data, client-certificate-data และ client-key-data ในไฟล์ rke2.yaml

แสดงความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *