K8s资源对象的基本管理(升级、回滚、扩容、缩容)

博文大纲:
一、资源创建
二、解决客户端无法访问k8s内部pod所运行的服务
三、搭建私有仓库,并自定义镜像
四、版本扩容、缩容
五、服务的升级与回滚

一、资源创建

本次博文主要介绍如何使用命令行的方式创建资源!

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

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

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

返回的信息如图:

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

返回的结果如图:

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

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

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

[[email protected] ~]# kubectl get pod -o wide         //查看pod的详细信息
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
test-66cbf74d74-5tcqz   1/1     Running   0          28m   10.244.1.7   node01   <none>           <none>
test-66cbf74d74-6975b   1/1     Running   0          28m   10.244.2.3   node02   <none>           <none>
test-66cbf74d74-d7wcg   1/1     Running   0          28m   10.244.1.6   node01   <none>           <none>
test-66cbf74d74-d9lj6   1/1     Running   0          28m   10.244.1.5   node01   <none>           <none>
test-66cbf74d74-r4fmp   1/1     Running   0          28m   10.244.2.2   node02   <none>           <none>

集群内部测试访问:

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

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

客户端访问测试:

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

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

搭建私有仓库可以参考博文:Docker搭建私有仓库(registry与Harbor)

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

[[email protected] ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker
//重启docker服务使配置文件生效,node01、node02的操作一致
[[email protected] ~]# scp [email protected]:/usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker
//node01的操作
[[email protected] ~]#  scp [email protected]:/usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker
//node02的操作
##############搭建私有仓库完成##################
[[email protected] ~]# mkdir v{1,2,3}
[[email protected] ~]# cd v1
[[email protected] v1]# echo -e "FROM nginx:latest\nADD index.html /usr/share/nginx/html/" > Dockerfile
[[email protected] v1]# echo -e "<h1>hello lvzhenjiang:v1</h1>" > index.html
[[email protected] v1]# docker build -t 192.168.1.1:5000/nginx:version1 .
[[email protected] v1]# cp Dockerfile ../v2/
[[email protected] v1]# cp Dockerfile ../v3/
[[email protected] v1]# echo -e "<h1>hello lvzhenjiang:v2</h1>" > ../v2/index.html
[[email protected] v1]# echo -e "<h1>hello lvzhenjiang:v3</h1>" > ../v3/index.html
[[email protected] v1]# cd ../v2
[[email protected] v2]# docker build -t 192.168.1.1:5000/nginx:version2 .
[[email protected] v2]# cd ../v3
[[email protected] v3]# docker build -t 192.168.1.1:5000/nginx:version3 .
//生成三个不同版本的镜像,在主页上进行区分
[[email protected] v3]# docker push 192.168.1.1:5000/nginx:version1
[[email protected] v3]# docker push 192.168.1.1:5000/nginx:version2
[[email protected] v3]# docker push 192.168.1.1:5000/nginx:version3
//将镜像上传到私有仓库中
##################创建pod进行测试###################
[[email protected] v3]# kubectl run nginx --image=192.168.1.1:5000/nginx:version1 --port=80 --replicas=4
//基于自定义镜像(192.168.1.1:5000/nginx:v1)创建pod,副本数量为4个,并映射端口
[[email protected] 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地址
[[email protected] v3]# curl 10.244.2.11
<h1>hello lvzhenjiang:v1</h1>
[[email protected] v3]# curl 10.244.2.10
<h1>hello lvzhenjiang:v1</h1>
//访问副本的任意IP地址都可以看到同样的页面

四、版本扩容、缩容

第一种方法:

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

第二种方法:

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

五、服务的升级与回滚

服务升级操作:

[[email protected] v3]# kubectl set image deployment nginx nginx=192.168.1.1:5000/nginx:version2
//将nginx资源的镜像升级为192.168.1.1:5000/nginx:version2
[[email protected] 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
[[email protected] v3]# curl 10.244.1.19
<h1>hello lvzhenjiang:v2</h1>
//可以通过测试访问的方式进行验证
[[email protected] 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.1.1:5000/nginx:version2   run=nginx
//可以通过查看nginx资源的信息进行查看
[[email protected] v3]# kubectl describe deployments. nginx
//也可以通过查看nginx资源的详细信息进行查看

查询结果如下:

[[email protected] v3]#  kubectl set image deployment nginx nginx=192.168.1.1:5000/nginx:version3
//再次升级
[[email protected] 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.1.1:5000/nginx:version3   run=nginx
//根据显示信息可以看出已经升级成功

服务回滚操作:

[[email protected] v3]# kubectl rollout undo deployment nginx
//对nginx资源进行回滚操作
[[email protected] 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.1.1:5000/nginx:version2   run=nginx
//从查询结果中可以查看已经回滚到上一个版本
[[email protected] v3]# kubectl rollout undo deployment nginx
[[email protected] 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.1.1:5000/nginx:version3   run=nginx
//再次执行回滚操作,发现又回到版本3

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

但是在k8s中回滚操作可以通过回滚到指定的版本,在以后的博文中会介绍到!

————————本文到此为止,感谢阅读————————

原文地址:https://blog.51cto.com/14157628/2464824

时间: 2024-09-30 19:47:58

K8s资源对象的基本管理(升级、回滚、扩容、缩容)的相关文章

k8s核心资源对象& NameSpace(指定版本回滚)

k8s核心的资源对象: Pod:是运行以及调度的原子单位,也就是k8s中最小的资源单位,同一个pod可以同时运行多个container,多个container之间共享:(UTS(主机名和域名),IPC(消息队列和共享内存),NET(网络栈,端口等),namespace(名称空间)),但USR(用户和组),MNT(挂载点),PID(进行编号)是相互隔离的.pod有两种类型的pod:一类是由控制器控制的pod,一类是自主式pod(不受控制器管理,自己管理自己) Deployment:最常见的pod控

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

一.资源创建的方式之一,命令的方式创建资源,理解命令运行之后的动作,通过查看资源的方式,总结Pod名称的由来. 当我们执行创建资源的命令后,deployment这个控制器会通过replicaset控制器去管理pod,下面通过一个实例来分析,当我们执行创建资源的命令后,k8s都做了些什么(通过其NAME即可发现规律)? 运行一个deployment [[email protected] ~]# kubectl run test01 --image=nginx:latest --replicas=2

spring管理事务回滚

spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: ? 1 2 3 4 5 6 7 public method() {   Dao1.save(Person1);   Dao1.save(Person2);   Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中   Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正常情

Swarm平滑升级回滚

#滚动更新创建服务: docker service create --name my_web --replicas=5 nginx:1.12更新为1.14 docker service update --image nginx:1.14 my_web 默认配置下,Swarm 一次只更新一个副本,并且两个副本之间没有等待时间.我们可以通过 --update-parallelism 设置并行更新的副本数目,通过 --update-delay 指定滚动更新的间隔时间. docker service u

k8s中helm安装部署,升级和回滚(chart,helm,tiller,StorageClass)

一.Helm介绍 helm是基于kubernetes 的包管理器.它之于 kubernetes 就如 yum 之于 centos,pip 之于 python,npm 之于 javascript 那 helm 的引入对于管理集群有哪些帮助呢? 更方便地部署基础设施,如 gitlab,postgres,prometheus,grafana 等 更方便地部署自己的应用,为公司内部的项目配置 Chart,使用 helm 结合 CI,在 k8s 中部署应用一行命令般简单 1.Helm用途 Helm把Kub

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

应用升级 Kubectl set image --help 有案例指定新版本 [[email protected] ~]# kubectl set image deployment/nginx nginx=nginx:1.11 升级之后他会将所有版本进行替换,用describe来查看版本 [[email protected] ~]# kubectl get pods NAME                       READY     STATUS    RESTARTS   AGE bus

K8S的名称空间创建&amp;&amp;版本的升级、回滚操作(回滚到指定版本)

创建一个私有仓库. #运行一个registry容器 [[email protected] ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest #在所有需要使用私有仓库的的节点上进行以下配置: [[email protected] ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H un

k8s之Labels,Daemonset,Job资源对象

Label(标签) 我们为什么要使用label呢?当相同类型的资源对象越来越多,为了更好的管理,才按照标签分为一个小组,为的是提升资源的管理效率. lable是附着到object上(例如pod)的键值对.可以在创建object的时候指定,也可以在object创建后随时指定.Labels的值对系统本身并没有什么含义,只是对用户才有意义. "labels": { "key1" : "value1", "key2" : "

k8s的 Job/CronJob资源对象及添加api版本

Job资源对象 服务类的Pod容器:RC.RS.DS.Deployment 工作类的Pod容器:Job--->执行一次,或者批量执行处理程序,完成之后退出容器. 注意: 如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里的容器重启策略只能是: Never和 OnFailure. 概念 在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了.在这种场景下,创建pod就显得不那么合适.于是就是了Job,Job指的就是那些一次性任务.通过Job运行一