You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Minikube SSL证书有效期延长至10年并解决RBAC权限问题

解决Minikube证书延长后RBAC权限问题

问题背景

在隔离训练环境中,需要将AMI上Minikube集群的证书有效期设置为10年,避免证书过期导致集群无法启动。因kubeadm会增加AMI启动时间,故采用自定义脚本扩展证书。证书有效期已成功延长至约10年,但集群启动后API server出现RBAC权限错误,例如apiserver-kubelet-client用户被禁止对nodes/proxy执行create操作。

现有证书扩展脚本

# Extend Certificates
extend_certificate() {
    local base_path="$1"
    local node_name="$2"
    local days=3649
    cd "$base_path"

    # Map of COMMON_NAME to "KEY_NAME:CA_CERT:CA_KEY"
    declare -A map=(
        ["front-proxy-client"]="front-proxy-client.key:front-proxy-ca.crt:front-proxy-ca.key"
        ["apiserver-etcd-client"]="apiserver-etcd-client.key:etcd/ca.crt:etcd/ca.key"
        ["apiserver-kubelet-client"]="apiserver-kubelet-client.key:ca.crt:ca.key"
    )

    for COMMON_NAME in "${!map[@]}"; do
        IFS=":" read -r KEY_NAME CA_CERT CA_KEY <<< "${map[$COMMON_NAME]}"
        
        openssl11 req -new -key "$KEY_NAME" -out "$COMMON_NAME.csr" -subj "/CN=$COMMON_NAME"
        openssl11 x509 -req -in "$COMMON_NAME.csr" -CA "$CA_CERT" -CAkey "$CA_KEY" -CAcreateserial -out "${COMMON_NAME}_new.crt" -days $days
        mv "$COMMON_NAME.crt" "${COMMON_NAME}_old.crt"
        mv "${COMMON_NAME}_new.crt" "$COMMON_NAME.crt"
    done

    cd "$base_path/etcd"
    COMMON_NAME="kube-etcd-healthcheck-client"
    openssl11 req -new -key healthcheck-client.key -out healthcheck-client.csr -subj "/O=system:masters/CN=$COMMON_NAME"
    openssl11 x509 -req -in healthcheck-client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out healthcheck-client_new.crt -days $days
    mv healthcheck-client.crt healthcheck-client_old.crt
    mv healthcheck-client_new.crt healthcheck-client.crt

    COMMON_NAME="$node_name"
    for cert_name in peer server; do
        openssl11 req -new -key "$cert_name.key" -out "$cert_name.csr" -subj "/CN=$COMMON_NAME" -addext "subjectAltName = DNS:localhost, DNS:$node_name, IP:192.168.49.2, IP:127.0.0.1, IP:0:0:0:0:0:0:0:1"
        openssl11 x509 -req -in "$cert_name.csr" -CA ca.crt -CAkey ca.key -CAcreateserial -out "${cert_name}_new.crt" -days $days -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:localhost, DNS:$node_name, IP:192.168.49.2, IP:127.0.0.1, IP:0:0:0:0:0:0:0:1")
        mv "$cert_name.crt" "${cert_name}_old.crt"
        mv "${cert_name}_new.crt" "$cert_name.crt"
    done
}

extend_certificate "/var/lib/docker/volumes/sf-node-1/_data/lib/minikube/certs" "$NODE_NAME"
extend_certificate "/var/lib/docker/volumes/sfdev-node-1/_data/lib/minikube/certs" "$DEV_NODE_NAME"

出现的RBAC错误

++ kubectl get svc -n ingress-nginx
++ grep -oP '^ingress-nginx-.*controller\b'
++ awk 'NR==1{print $1}'
error: error upgrading connection: unable to upgrade connection: Forbidden (user=apiserver-kubelet-client, verb=create, resource=nodes, subresource=proxy)

证书有效期检查结果

[root@ip-xxx-xx-xx-xxx xxxxxx]$ kubeadm certs check-expiration --cert-dir /var/lib/docker/volumes/sf-node-1/_data/lib/minikube/certs
CERTIFICATE                         EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
!MISSING! admin.conf                                                                                 
apiserver                           Aug 19, 2033 14:21 UTC   9y              ca                      no      
apiserver-etcd-client               Aug 18, 2033 14:25 UTC   9y              etcd-ca                 no      
apiserver-kubelet-client            Aug 18, 2033 14:25 UTC   9y              ca                      no      
!MISSING! controller-manager.conf                                                                     
etcd-healthcheck-client             Aug 18, 2033 14:25 UTC   9y              etcd-ca                 no      
etcd-peer                           Aug 18, 2033 14:25 UTC   9y              etcd-ca                 no      
etcd-server                         Aug 18, 2033 14:25 UTC   9y              etcd-ca                 no      
front-proxy-client                  Aug 18, 2033 14:25 UTC   9y              front-proxy-ca          no      
!MISSING! scheduler.conf                                                                              

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Aug 19, 2033 14:21 UTC   9y              no      
etcd-ca                 Aug 19, 2033 14:21 UTC   9y              no      
front-proxy-ca          Aug 19, 2033 14:21 UTC   9y              no

解决方案

1. 修复apiserver-kubelet-client的RBAC绑定

apiserver-kubelet-client用户需要绑定到预设的ClusterRole以获取nodes/proxy的操作权限:

# 检查现有绑定是否存在
kubectl get clusterrolebinding | grep apiserver-kubelet-client

# 若不存在则创建绑定
kubectl create clusterrolebinding apiserver-kubelet-client-binding \
  --clusterrole=system:kube-apiserver-to-kubelet \
  --user=apiserver-kubelet-client

2. 验证权限配置

执行命令确认权限已生效:

kubectl auth can-i create nodes/proxy --user=apiserver-kubelet-client

返回yes则说明权限配置正确。

3. 重启API server组件

让RBAC配置生效:

# 通过Minikube ssh重启API server
minikube ssh -- sudo systemctl restart kube-apiserver

# 若API server运行在容器中,也可直接重启容器
minikube ssh -- sudo docker restart $(sudo docker ps | grep kube-apiserver | awk '{print $1}')

4. 优化证书生成脚本(避免后续问题)

重新生成apiserver-kubelet-client证书时,需确保证书Subject包含system:masters组,修改脚本中对应CSR生成命令:
将脚本中apiserver-kubelet-client的CSR生成行替换为:

openssl11 req -new -key "$KEY_NAME" -out "$COMMON_NAME.csr" -subj "/O=system:masters/CN=$COMMON_NAME"

这样生成的证书会带有正确的组标识,避免RBAC识别异常。


内容的提问来源于stack exchange,提问作者Aedan Lawrence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:08:10