[CKS] 1-9 Certificates API
쿠버네티스 Certificates API는 번거로운 클러스터 인증서 발급 및 관리 작업을 자동화합니다. CSR 객체를 API로 제출하여 안전하고 효율적인 인증서 관리가 가능합니다.
개요
지금까지 클러스터의 관리자로 올바른 인증서를 구성하는 것을 확인하였습니다.
새로운 관리자가 접근하면 클러스터에 접근하기 위한 인증서를 생성해야합니다.
인증서 서명 요청을 CA 서버로 가져가 CA 서버의 개인 키와 루트 인증서를 사용해 서명합니다.
그렇게 인증서를 생성하고 인증서를 다시 전송합니다. 유효한 인증서와 키 쌍을 갖습니다.
하지만 이러한 서버에 접근하게 된다면 누구나 클러스터에 접근하여 사용자를 만들 수 있기 때문에 파일들은 보호되고 안전한 환경에 저장되어야합니다. 현재 구성에서는 마스터 노드에 모두 두고 있으며 kubeadm은 같은 일을 수행합니다.
다만 이를 수동으로 진행하기엔 매번 마스터 노드에 접근하여 반복적인 일을 수행하기 때문에 매우 귀찮고 관리에 복잡해집니다. 이를 자동화하는 방안이 필요합니다.
Certificates API
인증서 서명 요청을 k8s API로 직접 전송하여 관리자가 대신 마스터 노드에 로그인하여 인증서를 서명하는 대신 CertificateSiginingRequest Object를 생성합니다.
생성되면 클러스터의 모든 관리자가 모든 인증서 서명 요청을 볼 수 있습니다.
이를 kubectl 명령을 통해 검토, 승인, 공유까지 수행할 수 있습니다.
- OpenSSL을 통한 키 생성 후 관리자 전달
openssl genrsa -out jane.key 2048
openssl req -new -key jane.key -subj "/CN=jane" -out jane.csr
- 관리자는 키 서명 요청을 받아 k8s csr(certificate signing request) 생성
- manifest 파일로 작성합니다.
- 그룹과 용도를 지정합니다.
- request에는 base64 인코딩하여 CSR 파일을 요청 필드에 등록합니다.
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: jane
spec:
groups:
- system:authenticated
usages:
- digital signature
- key encipherment
- server auth
request: <base64-encoded-CSR>
- 관리자는 kubectl로 확인 후 승인 → 공유
kubectl get csr
-------------------------------------------
NAME AGE REQUESTOR CONDITION
jane 10m admin@example.com Pending
kubectl certificate approve jane
- Certificate 부분을 Base64 decode하여 최종 사용자와 공유합니다.
kubectl get csr jane -o yaml
-------------------------------------------
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
creationTimestamp: 2019-02-13T16:36:43Z
name: new-user
spec:
groups:
- system:masters
- system:authenticated
usages:
- digital signature
- key encipherment
- server auth
username: kubernetes-admin
status:
certificate: |
L$0tS1CRUdJTiBDRVJUSUZJQ09FURS0tL0tCk1SURDakNDQWL
Z0F3SUJBZ0lVRmwyQ2wxyXYoawl5M3JNVisreFRQUW0uJ3dnd0R
Wplb1JaHZjTkFRRUkQlfBd0ZURVRNQkVHQTlRVU4FUtHMlZpw
lKdVpMjkE9UQX1NVE14TmpNeU1QmFGd1dnY0ZFEl2ajNuSyX
...
conditions:
- lastUpdateTime: 2019-02-13T16:37:21Z
message: This CSR was approved by kubectl certificate approve.
reason: KubectlApprove
type: Approved
Certificates API 처리
kubernetes 구성 요소 중 인증서 서명과 승인을 담당하는 곳은 Controller Manager 입니다.
Controller Manager는 CA의 루트 인증서와 개인 키를 필요로 하며, 이는 구성 파일에 지정되어 있습니다. 구성 파일에서 발췌한 내용은 다음과 같습니다.
spec:
containers:
- command:
- kube-controller-manager
- --address=127.0.0.1
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --use-service-account-credentials=true
컨트롤러 관리자가 인증서에 안전하게 서명하고 인증서 수명 주기를 관리할 수 있습니다.
Hands-on
들여쓰기에 주의합니다.
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: akshay
spec:
signerName: kubernetes.io/kube-apiserver-client
groups:
- system:authenticated
usages:
- client auth
request: |
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBN
QTBHQTFVRUF3d0dZV3R6YUdGNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJD
Z0tDQVFFQW9xZjNOcjl2dUh2RFFWVnhyNW5IOVYwaURidGtVY2NJcjFRODNGRk0rL0M1ClFsZ215
...
인증서 승인하는 방법
kubectl certificate approve jane
kubectl get certificatesigningrequests.certificates.k8s.io agent-smith -o yaml > test.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
creationTimestamp: "2025-06-05T11:27:16Z"
name: agent-smith
resourceVersion: "1423"
uid: 01d525aa-f119-4599-977a-23898a269479
spec:
extra:
authentication.kubernetes.io/credential-id:
- X509SHA256=330d021704fc91ae794d0bfa448afd1eacbaaf0ef9a1dbbea68fee5dc513256e
groups:
- system:masters
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1dEQ0NBVUFDQVFBd0V6RVJNQThHQTFVRUF3d0libVYzTFhWelpYSXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRE8wV0pXK0RYc0FKU0lyanBObzV2UklCcGxuemcrNnhjOStVVndrS2kwCkxmQzI3dCsxZUVuT041TXVxOTlOZXZtTUVPbnJEVU8vdGh5VnFQMncyWE5JRFJYall5RjQwRmJtRCs1eld5Q0sKeTNCaWhoQjkzTUo3T3FsM1VUdlo4VEVMcXlhRGtuUmwvanYvU3hnWGtvazBBQlVUcFdNeDRCcFNpS2IwVSt0RQpJRjVueEF0dE1Wa0RQUTdOYmVaUkc0M2IrUVdsVkdSL3o2RFdPZkpuYmZlek90...
signerName: kubernetes.io/kube-apiserver-client
usages:
- digital signature
- key encipherment
- server auth
username: agent-x
status: {}