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

  • 相关阅读:
    C# DictionaryHelper
    C# Autofac 的 BeanFactory
    正则替换
    java页面表格导出为Excel实现
    CentOS 7 下安装Nginx
    认识Java 虚拟机的架构
    06 查看网卡实时流量
    05 找出占用CPU、内存过高的进程
    04 一键查看服务器资源利用率
    03 批量创建100个用户并设置随机密码
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13282169.html
Copyright © 2011-2022 走看看