ericpuwang

使用kubernetes证书保护工作负载

介绍

由于稳定版的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不会自动批准该证书

签发证书

singerName cms.io/app-serving

  1. 创建私有
    openssl genrsa -out server.key 2048
    openssl req -new -key server.key -out server.csr -subj "/CN=apiserver-proxy"
    
  2. 创建CertificateSigningRequest
    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
    
  3. 批准CertificateSigningRequest
    kubectl certificate approve apiserver-proxy
    
  4. 取得证书
    kubectl get csr apiserver-proxy -o jsonpath='{.status.certificate}'| base64 -d > server.crt