Kubernetes证书过期重新部署+证书自动化

之前一个不重要的站点,k8s最近启动不来了,这是之前在研究k8s时用kubeadm搭建的单节点,结合cert-manager.io实现证书自动化(主要是为了验证k8s上的证书自动化,哈哈)。原因如下:

kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便。但是它创建的apiserver、controller-manager等证书默认只有一年的有效期,同时kubelet 证书也只有一年有效期,一年之后 kubernetes 将停止服务。

官方推荐一年之内至少用 kubeadm upgrade 更新一次 kubernetes 系统,更新时也会自动更新证书。不过,在产线环境或者无法连接外网的环境频繁更新 kubernetes 不太现实。

我们可以在过期之前或之后,使用kubeadm alpha phase里的certs和kubeconfig命令,同时配合kubelet证书自动轮换机制来解决这个问题。

k8s现在升级也快,想着也是折腾,就升级到新版本。

但是新的kubernetes至少要2 Core CPU,目前是aws t2.small 1 Core 2G

就修改为aws t3.small 2 Core 2G 价格还便宜,性能更好,但是实例起来网络连不上。

与 T2 实例相比,AWS Nitro 系统和高频 Intel Xeon 可扩展处理器的性价比提升了 30%

实例 vCPU* CPU 积分/小时 内存 (GiB) 存储
t3.small 每小时 0.0272 USD 2 24 2 仅限 EBS
t2.small 每小时 0.0304 USD 1 12 2 仅限 EBS

尝试排查无果

~~参考 https://forums.aws.amazon.com/thread.jspa?threadID=288480~~

aws ec2 describe-instances –instance-ids i-089637d6b57c7052b **–query “Reservations[].Instances[].EnaSupport”**

aws ec2 modify-instance-attribute –instance-id i-c7746f20 –ena-support

重新部署

kubeadm init --kubernetes-version=v1.15.5 --pod-network-cidr=10.244.0.0/16

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

mkdir /mnt/data

mount /dev/sdf /mnt/data

echo "/dev/sdf    /mnt/data    ext4   defaults     0    0" >> /etc/fstab

安装 cert-manager https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html

遇到问题:

  1. The connection to the server localhost:8080 was refused
sudo cp /etc/kubernetes/admin.conf $HOME/

sudo chown $(id -u):$(id -g) $HOME/admin.conf

export KUBECONFIG=$HOME/admin.conf

  1. kubenetes 1.16 对配置的部分已经做了调整,为了与其他生产环境兼容,暂时粗暴降级版本(下载二进制直接覆盖)

https://kubernetes.io/blog/2019/09/18/kubernetes-1-16-release-announcement/

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.5/bin/linux/amd64/kubectl && mv kubectl /bin/kubectl && chmod +x /bin/kubectl`

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.5/bin/linux/amd64/kubelet && mv kubelet /bin/kubelet && chmod +x /bin/kubelet
  1. 有时候一个pod创建之后一直是pending,没有日志,也没有pull镜像,describe的时候发现里面有一句话: 1 node(s) had taints that the pod didn’t tolerate.

直译意思是节点有了污点无法容忍,执行 kubectl get no -o yaml | grep taint -A 5 之后发现该节点是不可调度的。这是因为kubernetes出于安全考虑默认情况下无法在master节点上部署pod,于是用下面方法解决:

kubectl taint nodes --all node-role.kubernetes.io/master-

1E86A1CE-62CD-4ED9-B2B9-2CABD0E0F328 copy


UPDATE:

March 19, 2020 发现证书不自动更新了,试试升级 0.11到 https://cert-manager.io/docs/installation/upgrading/upgrading-0.13-0.14/

kubectl delete -n cert-manager deployment cert-manager cert-manager-cainjector cert-manager-webhook

**kubectl apply -f ./certs/ 遇到错误:**error: error validating “certificate.yaml”: error validating data: ValidationError(Certificate.spec): unknown field “acme” in io.cert-manager.v1alpha2.Certificate.spec; if you choose to ignore these errors, turn validation off with –validate=false

因为新版的用法变了

https://cert-manager.io/docs/usage/certificate/