二进制部署的K8s集群,如何对到期证书更新

一年前搭建的k8s集群,突然不能够正常访问,出现502错误,首先怀疑容器没起来,先对问题进行排查,排查响应的容器有没有正常启动,状态一切正常,访问容器地址也可以正常访问,于是访问node port地址,发现无法正常访问,确定问题出现在svc中。

由于其他的应用、系统也无法提供正常的服务,应该是k8s的问题,非单个应用的原因。查看服务状态,kubectl describe svc xxx,endpoint相关地址为空,观察系统日志,出现unauthorized字样,怀疑证书到期导致,下面进行证书的排查和处理,最后更新完证书后,提供服务正常。

一、更新master节点证书

1、查看服务状态

systemctl status kube-apiserver –l

查看配置的service位置和状态,服务中有请求失败,或者unauthorized字样,说明有可能是证书的问题。 /etc/systemd/system/kube-apiserver.service这个是本集群的master节点apiserver的文件位置。我们看看他的配置情况

关键内容如下:

  --kubelet-client-certificate=/etc/kubernetes/ssl/kubernetes.pem \
  --kubelet-client-key=/etc/kubernetes/ssl/kubernetes-key.pem \
  --basic-auth-file=/etc/kubernetes/ssl/basic-auth.csv \
  --token-auth-file=/etc/kubernetes/ssl/token.csv \
  --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  --client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --etcd-cafile=/etc/kubernetes/ssl/ca.pem \
  --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \
  --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \

相关的证书分别是,除了以下证书,还有admin、kube-proxy证书

ca.pem

ca-key.pem

kubernetes.pem

kubernetes-key.pem

basic-auth.csv

token.cs

2、确认证书到期时间

# openssl x509 -noout -text -in /etc/kubernetes/ssl/ca.pem | grep Not
            Not Before: Sep  8 17:41:00 2018 GMT
            Not After : Sep  7 17:41:00 2019 GMT

目录下的admin、kube-proxy、kubernetes证书均已过期,到期时间2019年,我们需要更新他们

3、更新证书

#重新生成admin证书与私钥
cfssl gencert \
        -ca=ca.pem \
        -ca-key=ca-key.pem \
        -config=ca-config.json \
        -profile=kubernetes admin-csr.json | cfssljson -bare admin

#创建 kube-proxy证书与私钥

cfssl gencert \
        -ca=ca.pem \
        -ca-key=ca-key.pem \
        -config=ca-config.json \
        -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

#创建 kubernetes证书与私钥
cfssl gencert \
        -ca=ca.pem \
        -ca-key=ca-key.pem \
        -config=ca-config.json \
        -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

4、修改kube-proxy配置

这里以kube-proxy为例,其他配置的证书如果要更新,也需要一并修改。

kubectl config set-credentials kube-proxy \

        --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \

        --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \

        --embed-certs=true \

        --kubeconfig=kube-proxy.kubeconfig

kubectl config set-context default \

        --cluster=kubernetes \

        --user=kube-proxy \

        --kubeconfig=kube-proxy.kubeconfig

kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

二、Node节点证书过期更新

1、修改节点kubelet的证书设置

如果节点证书没有更新,查看kubelet服务日志,会出现大量的Unauthorized字样,重启kueblet服务进行观察,会出现错误:

Unable to register node "xxx" with API server: Unauthorized

这时候需要更新kubelet的配置证书,该证书首次node加入集群时,会自动生成。

2、确定配置文件的位置

systemctl status kubelet

找到服务的配置文件

/etc/systemd/system/kubelet.service

配置文件中,下面几个参数配置比较关键,具体作用如下:

#Cert-dir证书的配置路径

# bootstrap.kubeconfig是kubelet首次启动注册时的相关信息

# kubelet.kubeconfig是kubelet正常工作时,提交请求需要用的的配置

  --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \

  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \

  --cert-dir=/etc/kubernetes/ssl \

  --client-ca-file=/etc/kubernetes/ssl/ca.pem \

因为基本证书ca.pem是10年才过期,因此我们不去处理。

3、删掉原来的配置,重新签发一下证书

进入证书文件目录,对原来配置进行备份,因为之前证书过期已经失效,所以不备份也没有太大问题,但可以用来新老比较其中的内容。

cd /etc/kubernetes

mv kubelet.kubeconfig kubelet.kubeconfig.bak

4、重启kubelet服务

重新启动kubelet,因为没有kubeconfig配置文件,会想集群申请相关证书,自动下发。

systemctl restart kubelet

5、查看状态,正在使用bootstrap生成客户证书

跟踪服务启动日志,提示如下使用bootstrap配置生成tls客户证书、key和配置文件。

systemctl status kubelet

Using bootstrap kubeconfig to generate TLS client cert, key and kubeconfig file

6、查看授权情况

进一步观察csr情况,有一条pending记录,即为刚刚node节点申请的授权申请。

kubectl get csr

NAME                                                   AGE       REQUESTOR           CONDITION

node-csr-FqMMSMM04alm6cKexvktqsu-ihiA37ypVJ5867tPrnc   7m        kubelet-bootstrap   Pending

7、重新通过授权验证

对请求进行授权,批准节点的加入

kubectl certificate approve node-csr-FqMMSMM04alm6cKexvktqsu-ihiA37ypVJ5867tPrnc

至此,客户端的证书更新完毕

 

你可能感兴趣的:(k8s)