Kubernetes [ข้อผิดพลาด: ไม่มี“ CertificateSigningRequest”]

Oct 10 2020

ในขณะที่ฉันพยายามอนุมัติใบรับรองสำหรับ RBAC ใน Kubernetes ฉันได้รับข้อผิดพลาด

ฉันสร้างคำขอใบรับรองสำหรับ Kubernetes สำหรับ student-csr

apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: student-csr
spec:
  groups:
  - system:authenticated
  request: <encoded key>
  usages:
  - digital signature
  - key encipherment
  - client auth

จากนั้นฉันก็วิ่งkubectl create -f signing-request.yamlและออกไป

certificateigningrequest.certificates.k8s.io/student-csr สร้างแล้ว

แล้วก็kubectl get csrแสดง

ชื่ออายุผู้ลงนามเงื่อนไขการร้องขอ
student-csr 100s kubernetes.io/legacy-unknown ผู้ใช้ minikube รอดำเนินการ 

จนถึงตอนนี้ดีมาก แต่ปัญหาเกิดขึ้นเมื่อฉันพยายามอนุมัติโดยkubectl certificate approve student-csr

ไม่พบทรัพยากร
ข้อผิดพลาด: ไม่มีการลงทะเบียน "CertificateSigningRequest" สำหรับเวอร์ชัน "certificate.k8s.io/v1" ในรูปแบบ "k8s.io/kubectl/pkg/scheme/scheme.go:28"

ฉันไม่รู้เลยว่าทำไม ฉันพยายามค้นหา แต่ไม่มีอะไรคล้ายกับข้อผิดพลาดประเภทนี้

เครื่องมือที่ฉันใช้:

  • Minikube: v1.13.1
  • Kubernetes v1.19.2
  • นักเทียบท่า 19.03.12.2019
  • ระบบปฏิบัติการ Mac: Catalina (10.15.6)

*** ใช้ minikube กับ minikube start --container-runtime=docker --vm-driver=virtualbox

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก

ขอบคุณล่วงหน้า.

คำตอบ

6 DavidWer Oct 27 2020 at 16:41

ฉันประสบปัญหานี้ในขณะที่ฉันใช้งาน kubectl เวอร์ชัน v1.17 และคลัสเตอร์ k8s ของฉันคือเวอร์ชัน v1.19:

$ kubectl version --short
Client Version: v1.17.0
Server Version: v1.19.2

ฉันแก้ไขโดยอัปเดต kubectlเป็น v1.19

$ kubectl version --short
 Client Version: v1.19.0
 Server Version: v1.19.2
1 WytrzymałyWiktor Oct 12 2020 at 15:21

ในบันทึกประจำรุ่น Kubernetes v1.19คุณจะพบการเปลี่ยนแปลงต่อไปนี้:

CertificateSigningRequestAPI มีการส่งเสริมให้certificates.k8s.io/v1มีการเปลี่ยนแปลงต่อไปนี้:

  • spec.signerNameตอนนี้จำเป็นและkubernetes.io/legacy-unknownไม่อนุญาตให้สร้างคำขอผ่านcertificates.k8s.io/v1API

  • spec.usages is ตอนนี้จำเป็นต้องไม่มีค่าที่ซ้ำกันและต้องมีเฉพาะการใช้งานที่รู้จัก

  • status.conditions ต้องไม่มีประเภทที่ซ้ำกัน

  • status.conditions[*].status ตอนนี้จำเป็น

  • status.certificate ต้องเข้ารหัส PEM และมีเฉพาะบล็อก CERTIFICATE (# 91685, @liggitt) [SIG API Machinery, Architecture, Auth, CLI and Testing]

ดังนั้นข้อผิดพลาดที่คุณเห็น:

no kind "CertificateSigningRequest" is registered for version "certificates.k8s.io/v1"

หมายความว่าคุณควรใช้apiVersion: certificates.k8s.io/v1แทนapiVersion: certificates.k8s.io/v1beta1.

ในการเปลี่ยนเวอร์ชัน API ของคุณคุณสามารถใช้kubectl convertคำสั่ง:

แปลงไฟล์กำหนดค่าระหว่าง API เวอร์ชันต่างๆ ยอมรับทั้งรูปแบบ YAML และ JSON

คำสั่งใช้ชื่อไฟล์ไดเร็กทอรีหรือ URL เป็นอินพุตและแปลงเป็นรูปแบบของเวอร์ชันที่ระบุโดย--output-versionแฟล็ก หากไม่ได้ระบุเวอร์ชันเป้าหมายหรือไม่รองรับให้แปลงเป็นเวอร์ชันล่าสุด

EmreOdabaş Oct 10 2020 at 13:42

ดูเหมือนว่าคุณมี csr สองเวอร์ชัน เปลี่ยนรุ่น student-csr ของคุณเป็น certificate.k8s.io/v1 ฉันเดาว่าจะได้ผล

AlexandreBrach Oct 16 2020 at 14:27

ตัวควบคุมใบรับรองไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน Minikube มีปัญหาที่เปิดอยู่: https://github.com/kubernetes/minikube/issues/1647

นี่คือเหตุผลที่คุณสามารถสร้างออบเจ็กต์ API ของคุณ แต่ไม่สามารถอนุมัติใบรับรองได้

อย่างไรก็ตามอาจเป็นไปได้ที่จะทำให้ใช้งานได้โดยใช้พารามิเตอร์เสริม: https://github.com/kubernetes/minikube/issues/1647#issuecomment-311138886