由于稳定版的CertificateSigningRequest API(certificates.k8s.io/v1
)不允许将.spec.signerName
设置为kubernetes.io/legacy-unknown
, 为了使用kubernetes证书保护工作负载, 参考kube-controller-manager中的certificate controller
实现一个自定义证书签署者。
cms.io/app-serving
: 该服务证书被API服务器视为有效的服务端证书, 但没有其他保证。certificate-controller
不会自动批准该证书
["server auth"]
,但不能包含["digital signature", "key encipherment", "server auth"]
之外的键singerName
cms.io/app-serving
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=apiserver-proxy"
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: apiserver-proxy
labels:
k8s-app: apiserver-proxy
spec:
groups:
- system:authenticated
request: $(cat server.csr | base64 -w 0 | tr -d "\n")
signerName: cms.io/app-serving
expirationSeconds: 86400 # one day, default is one year
usages:
- server auth
- digital signature
- key encipherment
EOF
kubectl certificate approve apiserver-proxy
kubectl get csr apiserver-proxy -o jsonpath='{.status.certificate}'| base64 -d > server.crt