linux运维、架构之路-K8s二进制版本升级

一、升级说明

       Kubernetes集群小版本升级基本上是只需要更新二进制文件即可。如果大版本升级需要注意kubelet参数的变化,以及其他组件升级之后的变化。 由于Kubernetes版本更新过快许多依赖并没有解决完善,并不建议生产环境使用较新版本。

二、软件准备

1、下载地址

https://github.com/kubernetes/kubernetes/releases

2、目前集群版本信息

[root@k8s-node1 ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE    VERSION
k8s-node1   Ready    <none>   336d   v1.16.0
k8s-node2   Ready    <none>   336d   v1.16.0
k8s-node3   Ready    <none>   336d   v1.16.0
[root@k8s-node1 ~]# 
[root@k8s-node1 ~]# 
[root@k8s-node1 ~]# 
[root@k8s-node1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

3、升级目标版本v1.18.15

wget https://dl.k8s.io/v1.18.15/kubernetes-server-linux-amd64.tar.gz

三、开始升级

1、Master节点升级

①kubectl工具升级(在所有master节点操作)

备份:

cd /usr/bin && mv kubectl{,.bak_2021-03-02}

升级:

tar xf kubernetes-server-linux-amd64.tar.gz
cp kubernetes/server/bin/kubectl /usr/bin/

升级前:

[root@k8s-node1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

升级后:

[root@k8s-node1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.15", GitCommit:"73dd5c840662bb066a146d0871216333181f4b64", GitTreeState:"clean", BuildDate:"2021-01-13T13:22:41Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

因为apiserver还没有升级,所以在Server Version中显示为1.16.0版本

②组件升级(生产环境可以一台一台的升级替换)

#在所有master节点执行 (升级生产环境可以不停止keeplived)
systemctl stop keepalived   #先停掉本机keepalived,切走高可用VIP地址
systemctl stop kube-apiserver
systemctl stop kube-scheduler
systemctl stop kube-controller-manager

备份:

cd /app/kubernetes/bin
mv kube-apiserver{,.bak_2021-03-02}
mv kube-controller-manager{,.bak_2021-03-02}
mv kube-scheduler{,.bak_2021-03-02}

升级:

cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /app/kubernetes/bin/

启动keepalived和apiserver:

systemctl start keepalived
systemctl start kube-apiserver

查看启动日志是否有异常:

journalctl -fu kube-apiserver

查看:

[root@k8s-node1 ~]# kubectl get cs
NAME                 STATUS      MESSAGE                                                                                     ERROR
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused   
etcd-0               Healthy     {"health":"true"}                                                                           
etcd-1               Healthy     {"health":"true"}                                                                           
etcd-2               Healthy     {"health":"true"} 

可以查看到etcd中的数据说明kube-apiserver没有问题

[root@k8s-node1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.15", GitCommit:"73dd5c840662bb066a146d0871216333181f4b64", GitTreeState:"clean", BuildDate:"2021-01-13T13:22:41Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.15", GitCommit:"73dd5c840662bb066a146d0871216333181f4b64", GitTreeState:"clean", BuildDate:"2021-01-13T13:14:05Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

查看客户端和服务端的版本都是v1.18.15,说明版本相同没有问题

启动其他组件:

systemctl start kube-controller-manager && systemctl start kube-scheduler

查看启动状态,此时kubernetes集群已经恢复:

[root@k8s-node1 ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
etcd-2               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}

2、node组件升级

①停止服务,并且备份二进制文件(所有node节点)

systemctl stop kubelet
systemctl stop kube-proxy

备份:

cd /app/kubernetes/bin
mv kubelet{,.bak_2021-03-02}
mv kube-proxy{,.bak_2021-03-02}

升级:

scp kubernetes/server/bin/{kubelet,kube-proxy} /app/kubernetes/bin/        #分发所有节点

启动kubelet服务:

systemctl daemon-reload && systemctl start kubelet

查看kubelet日志,检查是否有报错

journalctl -fu kubelet

过几分钟查看节点是否正常:

[root@k8s-node1 ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE    VERSION
k8s-node1   Ready    <none>   336d   v1.18.15
k8s-node2   Ready    <none>   336d   v1.18.15
k8s-node3   Ready    <none>   336d   v1.18.15

启动kube-proxy服务:

systemctl start kube-proxy

 验证集群的状态:

[root@k8s-node1 ~]# systemctl status kube-proxy|grep Active
   Active: active (running) since Tue 2021-03-02 17:31:32 CST; 33s ago
[root@k8s-node1 ~]# kubectl cluster-info 
Kubernetes master is running at http://localhost:8080
CoreDNS is running at http://localhost:8080/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

[root@k8s-node1 ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE    VERSION
k8s-node1   Ready    <none>   337d   v1.18.15
k8s-node2   Ready    <none>   337d   v1.18.15
k8s-node3   Ready    <none>   337d   v1.18.15

四、创建应用测试

1、测试yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28.3
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

2、查看创新的Pod

[root@k8s-node1 ~]# kubectl get pod
NAME                                READY   STATUS      RESTARTS   AGE
busybox                             1/1     Running     0          14s
cronjob-demo-1614661200-mth6n       0/1     Completed   0          4h37m
cronjob-demo-1614664800-2s9w5       0/1     Completed   0          3h37m
cronjob-demo-1614668400-jt7ld       0/1     Completed   0          157m
cronjob-demo-1614672000-8zx6j       0/1     Completed   0          82m
cronjob-demo-1614675600-whjvf       0/1     Completed   0          37m
job-demo-ss6mf                      0/1     Completed   0          12d
kubia-deployment-7b5fb95f85-fzn4d   1/1     Running     0          33d
static-web-k8s-node2                1/1     Running     0          64m
tomcat1-79c47dc8f-75mr4             1/1     Running     3          41d
tomcat2-8fd94cc4-z9mmq              1/1     Running     4          41d
tomcat3-6488575ff7-csmsh            1/1     Running     4          41d

3、测试coredns功能是否正常

[root@k8s-node1 ~]# kubectl exec -it busybox -- nslookup kubernetes
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

至此k8s二进制版本升级完毕

成功最有效的方法就是向有经验的人学习!
原文地址:https://www.cnblogs.com/yanxinjiang/p/14469563.html