K8s资源对象管理+(升级回滚扩容缩容)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s资源对象管理+(升级回滚扩容缩容)相关的知识,希望对你有一定的参考价值。

一、资源创建

一)、资源创建的方式之一,命令的方式创建资源,理解命令运行之后的动作,通过查看资源的方式,总结Pod名称的由来。

[root@master ~]# kubectl run test --image=nginx:latest --replicas=5
//基于httpd的镜像创建一个deployment类型的控制组,名称为test,并指定副本数量为5
[root@master ~]# kubectl get deployments.       //查看deployment控制器
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
test   5/5     5            5           6m26s
//可以看到deployment的name是我们指定的test
[root@master ~]# kubectl get replicasets.        //查看replicasets这个控制器
NAME              DESIRED   CURRENT   READY   AGE
test-66cbf74d74   5         5         5       7m50s
//可以看到replicasets的NAME就是在deployment的NAME后面追加了一串ID号
[root@master ~]# kubectl get pod -o wide        //查看pod的详细信息
NAME                    READY   STATUS    RESTARTS   AGE    IP           NODE     NOMINATED NODE   READINESS GATES
test-66cbf74d74-2j9jr   1/1     Running   0          2m8s   10.244.1.2   node02   <none>           <none>
test-66cbf74d74-54p95   1/1     Running   0          2m8s   10.244.2.4   node01   <none>           <none>
test-66cbf74d74-5pkjs   1/1     Running   0          2m8s   10.244.2.2   node01   <none>           <none>
test-66cbf74d74-lcmdl   1/1     Running   0          2m8s   10.244.2.3   node01   <none>           <none>
test-66cbf74d74-wh574   1/1     Running   0          2m8s   10.244.1.3   node02   <none>           <none>
//可以看到该pod的NAME就是在上面replicasets的后面又追加了一段ID

也可以使用以下方法,查看控制器的详细信息!方法如下:


[root@master ~]# kubectl describe deployments. test
//查看名为test控制器的详细信息

返回的信息如图:
技术图片


[root@master ~]# kubectl describe replicasets. test
//查看replicasets控制器的详细信息

返回的结果如图:
技术图片
从以上创建一个pod的过程中,就可以看出当我们执行创建资源的命令后,deployment这个控制器会通过replicaset控制器去管理并创建所需的pod!

二、解决客户端无法访问k8s内部pod所运行的服务

当k8s集群创建pod完成后,集群内部是可以访问pod所提供的服务的,方法如下:

[root@master ~]#  kubectl get pod -o wide 
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
test-66cbf74d74-2j9jr   1/1     Running   0          22m   10.244.1.2   node02   <none>           <none>
test-66cbf74d74-54p95   1/1     Running   0          22m   10.244.2.4   node01   <none>           <none>
test-66cbf74d74-5pkjs   1/1     Running   0          22m   10.244.2.2   node01   <none>           <none>
test-66cbf74d74-lcmdl   1/1     Running   0          22m   10.244.2.3   node01   <none>           <none>
test-66cbf74d74-wh574   1/1     Running   0          22m   10.244.1.3   node02   <none>           <none>
[root@master ~]# curl  -I   10.244.1.2 
HTTP/1.1 200 OK
Server: nginx/1.19.1
Date: Wed, 12 Aug 2020 10:47:40 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 07 Jul 2020 15:52:25 GMT
Connection: keep-alive
ETag: "5f049a39-264"
Accept-Ranges: bytes
//这里显示内部访问是没有问题的

注:集群内部访问是没有问题,但是此时除了集群内部,外部是访问不到的,这就很伤脑筋了。不过好在k8s提供了完美的解决方案,实现过程如下:

[root@master ~]# kubectl run web --image=nginx:latest --port=80 --replicas=2
//创建一个名为web的deployment的资源对象,并映射容器的80端口到宿主机
[root@master ~]# kubectl expose deployment web --name=service --port=80 --type=NodePort
//创建一个service(名称可以自定义),将部署web资源对象的80端口映射出来
[root@master ~]# kubectl get svc service    
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service   NodePort   10.111.15.250   <none>        80:31293/TCP   2s
//可以看出将部署的服务端口映射到了宿主机的31293端口

技术图片
注:是访问群集中任意节点都可以访问k8s集群中pod所提供的服务!

三、搭建私有仓库,并自定义镜像

仓库选择registry或者是Harbor都可以,为了简单起见。这里搭建registry私有仓库,方法如下:

[root@master ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest 
[root@master ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.45.129:5000
[root@master ~]# scp  /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
[root@master ~]# scp  /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/docker.service
//将更改完的配置文件复制到另外两台worker节点上
[root@master ~]# systemctl  daemon-reload 
[root@master ~]# systemctl  restart  docker.service
//另外两台worker主机也需重启docker服务
[root@master ~]# mkdir v{1,2,3}
[root@master ~]# cd v1
[root@master v1]#  echo -e "FROM nginx:latest
ADD index.html /usr/share/nginx/html/" > Dockerfile
[root@master v1]#  echo -e "<h1>hello bjq:v1</h1>" > index.html
[root@master v1]# docker build -t 192.168.45.129:5000/nginx:version1 .
[root@master v1]# cp Dockerfile ../v2/
[root@master v1]# cp Dockerfile ../v3/
[root@master v1]# echo -e "<h1>hello bjq:v2</h1>" > ../v2/index.html
[root@master v1]# echo -e "<h1>hello bjq:v3</h1>" > ../v3/index.html
[root@master v1]# cd ../v2
[root@master v2]# docker build -t 192.168.45.129:5000/nginx:version2 .
[root@master v2]# cd ../v3
[root@master v3]# docker build -t 192.168.45.129:5000/nginx:version3 .
//生成三个不同版本的镜像,在主页上进行区分
[root@master v3]# docker push 192.168.45.129:5000/nginx:version1
[root@master v3]# docker push 192.168.45.129:5000/nginx:version2
[root@master v3]# docker push 192.168.45.129:5000/nginx:version3
//将镜像上传到私有仓库中
##################创建pod进行测试###################
[root@master v3]# kubectl run nginx --image=192.168.45.129:5000/nginx:version1 --port=80 --replicas=4
//基于自定义镜像(192.168.45.129:5000/nginx:v1)创建pod,副本数量为4个,并映射端口
[root@master v3]# kubectl get pod -o wide | grep nginx | awk ‘{print $6}‘
10.244.2.11
10.244.2.10
10.244.1.16
10.244.1.15
//创建四个副本的IP地址
[root@master v3]# curl 10.244.2.11
<h1>hello lvzhenjiang:v1</h1>
[root@master v3]# curl 10.244.2.10
<h1>hello lvzhenjiang:v1</h1>
//访问副本的任意IP地址都可以看到同样的页面

四、版本扩容、缩容

第一种方法:


[root@master v3]# kubectl scale deployment nginx --replicas=8
//使用命令行的方式进行扩容操作(缩容也是一样的道理)
[root@master v3]# kubectl get pod -o wide | grep nginx | wc -l
8
[root@master v3]# kubectl get deployments. nginx -o yaml
[root@master v3]# kubectl get deployments. nginx -o json
//也可以将nginx资源类型已json或yaml文件格式输出(其中也可查看到副本的数量)

第二种方法:


[root@master v3]# kubectl edit deployments. nginx
//编辑名为nginx的资源类型
     19 spec:                  //找到spec字段
     20   progressDeadlineSeconds: 600
     21   replicas: 6           //更改副本数量
//在保存退出的一瞬间就生效了
[root@master v3]# kubectl get pod -o wide | grep nginx | wc -l
6
//查看副本数量

五、服务的升级与回滚

服务升级操作:


[root@master v3]# kubectl set image deployment nginx nginx=192.168.45.129:5000/nginx:version2
//将nginx资源的镜像升级为192.168.45.129:5000/nginx:version2
[root@master v3]# kubectl get pod -o wide | grep nginx | awk ‘{print $6}‘
10.244.1.19
10.244.1.21
10.244.1.20
10.244.2.14
10.244.2.15
10.244.2.16
[root@master v3]# curl 10.244.1.19
<h1>hello lvzhenjiang:v2</h1>
//可以通过测试访问的方式进行验证
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     6            6           18m   nginx        192.168.45.129:5000/nginx:version2   run=nginx
//可以通过查看nginx资源的信息进行查看
[root@master v3]# kubectl describe deployments. nginx
//也可以通过查看nginx资源的详细信息进行查看

查询结果如下:
技术图片

[root@master v3]#  kubectl set image deployment nginx nginx=192.168.45.129:5000/nginx:version3
//再次升级
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     6            6           20m   nginx        192.168.45.129:5000/nginx:version3   run=nginx
//根据显示信息可以看出已经升级成功

服务回滚操作:

[root@master v3]# kubectl rollout undo deployment nginx
//对nginx资源进行回滚操作
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     4            6           22m   nginx        192.168.45.129:5000/nginx:version2   run=nginx
//从查询结果中可以查看已经回滚到上一个版本
[root@master v3]# kubectl rollout undo deployment nginx
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   5/6     6            5           53m   nginx        192.168.45.129:5000/nginx:version3   run=nginx
//再次执行回滚操作,发现又回到版本3

由此可以看出在k8s集群中版本的升级、回滚操作与docker swarm中差不多一致!

以上是关于K8s资源对象管理+(升级回滚扩容缩容)的主要内容,如果未能解决你的问题,请参考以下文章

k8s资源对象的升级回滚扩容缩容

K8s资源对象管理之YAML文件的方式(升级回滚扩容缩容)

k8s用kubectl管理应用升级,服务发布与回滚,扩缩容

k8s学习-deployment(模板更新扩缩容回滚等)

k8s 实践经验:实操中学 k8s 五种资源

K8s