zoukankan      html  css  js  c++  java
  • kubeadm升级证书-集群已GG

    集群GG了,一查默认的证书失效只有一年。恢复吧,手生啊。

    kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便,但是它创建的 apiserver、controller-manager 等证书默认只有一年的有效期,
    同时 kubelet 证书也只有一年有效期,一年之后 kubernetes 将停止服务。
    方法总结下来有以下几个:
    1、官方推荐:一年之内 kubeadm upgrade 更新一次 kubernetes 系统。
    2、坊间方法:源代码编译,使得 kubeadm 生成的证书时间边长。
    3、手动更新证书( kubeadm alpha phase )。
    4、启用自动轮换 kubelet 证书

    查询api证书过期时间
    openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
    查询etcd证书过期时间
    openssl x509 -in /etc/kubernetes/pki/etcd/healthcheck-client.crt -noout -text |grep ' Not '

    一、环境GG的情况下更新证书
    1、准备 kube-config.yaml
    kubeadm命令升级master证书时,它也会默认从墙外读取一个stable.txt的文件,生产环境没有墙外线是绝对访问不到的。
    这时候就需要自备的kube-config.yaml文件。生成方式如下命令:

    kubeadm config view > kube-config.yaml
    

    实际情况集群挂了的时候这个命令也是无法执行,可以自己写一个,但是担心版本问题,之前也没备份。好在我司用的集群是我标准化过的。
    找台机器重新部署一个同版本的,>kubeadm config view > kube-config.yaml 生成一个kube-config.yaml当然新生成的yml要修改里边的apiserver地址为master地址。应该是替换/etc/kube下的同名文件,记得备份。补的文档,记不太清楚了,当时也没标注这个。应该是没问题。
    修改:

    apiVersion: kubeadm.k8s.io/v1beta1  
    kind: ClusterConfiguration  
    kubernetesVersion: v1.14.1 #-->这里改成你集群对应的版本  
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers  
    #这里使用国内的镜像仓库,否则在重新签发的时候会报错:could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt"
    

    2、备份证书
    cp -r /etc/kubernetes /etc/kubernetes.bak
    移动证书和配置【注意!必须移动,不然会使用现有的证书,不会重新生成】

    cd /etc/kubernetes
    mkdir ./pki_bak
    mkdir ./pki_bak/etcd
    mkdir ./conf_bak
    mv pki/apiserver* ./pki_bak/
    mv pki/front-proxy-client.* ./pki_bak/
    mv pki/etcd/healthcheck-client.* ./pki_bak/etcd/
    mv pki/etcd/peer.* ./pki_bak/etcd/
    mv pki/etcd/server.* ./pki_bak/etcd/
    mv ./admin.conf ./conf_bak/
    mv ./kubelet.conf ./conf_bak/
    mv ./controller-manager.conf ./conf_bak/
    mv ./scheduler.conf ./conf_bak/
    

    3、生成证书

    kubeadm alpha phase certs all --config=cluster.yaml
    版本不一致执行的命令也不一样,需要查看对应版本alpha命令
    参考文档:
    https://www.cnblogs.com/skymyyang/p/11093686.html
    https://hacpai.com/article/1575013191401 ()
    有相关介绍,不过我参考的是第二个,第一个尝试失败

    4、更新配置文件

    kubeadm alpha phase kubeconfig all --config=cluster.yaml
    mv $HOME/.kube/config $HOME/.kube/config.old
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    sudo chmod 777 $HOME/.kube/config
    

    完成后重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器,亲测systemctl rstart docker 也可以

    报错:
    error: Error loading config file "/etc/kubernetes/scheduler.conf": read /etc/kubernetes/scheduler.conf: is a directory

    diff kube-config.yaml cluster.yaml 发现nodename不一致,可能是他导致的,试试
    kubeadm config view > kube-config.yaml
    rm -rf /etc/kubernetes/scheduler.conf 我这里secheduler.conf现在是个目录,不知道啥情况。
    单独更新scheduler的证书就行
    kubeadm alpha phase kubeconfig scheduler --config=/root/kube-config.yaml

    完成
    二、启用自动轮换 kubelet 证书
    kubelet 证书分为 server 和 client 两种, k8s 1.9 默认启用了 client 证书的自动轮换,但 server 证书自动轮换需要用户开启.

    1、增加 kubelet 参数
    在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 增加如下参数
    Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true"
    增加 controller-manager 参数
    在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下参数

    • command:
      • kube-controller-manager
      • --experimental-cluster-signing-duration=87600h0m0s
      • --feature-gates=RotateKubeletServerCertificate=true
      • ....

    2、创建 rbac 对象
    创建rbac对象,允许节点轮换kubelet server证书:
    cat > ca-update.yaml << EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
    labels:
    kubernetes.io/bootstrapping: rbac-defaults
    name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
    rules:

    • apiGroups:
      • certificates.k8s.io
        resources:
      • certificatesigningrequests/selfnodeserver
        verbs:
      • create

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: kubeadm:node-autoapprove-certificate-server
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
    subjects:

    • apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: system:nodes
      EOF

    3、开启轮换
    kubectl create –f ca-update.yaml

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13282169.html
Copyright © 2011-2022 走看看