首页 > 其他分享 >Docker学习第十天——k8s之ReplicaSet及Deployment

Docker学习第十天——k8s之ReplicaSet及Deployment

时间:2023-09-21 11:48:13浏览次数:39  
标签:kubectl 第十天 ReplicaSet v1 Terminating myapp Deployment 67fd9fc9c8 root

原文:https://blog.csdn.net/qq_39637333/article/details/130686963

一、ReplicaSet
ReplicaSet,即副本控制器,简称rs,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数,保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副本。

官方不推荐,使用Deployment代替。

二、Deployment
1、Deployment概述

1.1 介绍

• 除了能够调用ReplicaSet之外还可以提供滚动升级及回滚的功能。

• deployment是一个三级结构,deployment管理replicaset,replicaset管理pod,用deployment创建一个pod。

1.2 功能

• 创建ReplicaSet和Pod

• 滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)

• 平滑地扩容和缩容

• 暂停和继续Deployment

1.3 简单案例

apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 3 #副本数:3
selector: #标签选择器,选择其关联的pod
matchLabels:
app: myapp-blue #匹配模板中label
template: #定义的pod模板
metadata:
labels:
app: myapp-blue
spec:
containers:
- name: myapp-blue
image: busybox:1.28
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
1.4 查看命令

• 查看Deployment:kubectl get deploy

• 查看RaplicaSet:kubectl get rs

1.5 扩缩容

修改对应的yaml文件中的replicas的数量

1.6 滚动更新

• 修改对应的yaml文件中的image信息

• kubectl edit deploy deployname

1.7 回滚

• 查看历史版本:kubectl rollout history deployment name

• 回滚操作:kubectl rollout undo deployment name --to-revision=1

1.8 自定义更新策略

• 编写位置:在spec→strategy内,为rollingUpdate

spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
• maxUnavailable:和期望的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;

• maxSurge:和期望的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。

• 按数量更新:

◇ maxUnavailable: [0, 副本数]

◇ maxSurge: [0, 副本数]

◇ 两者不能同时为0。

• 按比例更新:

◇ maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;

◇ maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;

◇ 注意:两者不能同时为0。

• 查看控制器详细信息:kubectl describe deployment 控制器名

◇ 显示:RollingUpdateStrategy: 1 max unavailable, 1 max surge

2、Deployment使用案例
2.1 Deployment创建一个web站点

把myapp-blue-v1.tar.gz和myapp-blue-v2.tar.gz上传到hd2.com和hd3.com上,手动解压:

[[email protected] ~]# docker load -i myapp-blue-v1.tar.gz
[[email protected] ~]# docker load -i myapp-blue-v1.tar.gz
[[email protected] ~]# docker load -i myapp-blue-v2.tar.gz
[[email protected] ~]# docker load -i myapp-blue-v2.tar.gz
编写yaml文件并使用:

[[email protected] ~]# cat deploy-demo.yaml
apiVersion: apps/v1 #deployment对应的api版本
kind: Deployment #创建的资源是deployment
metadata:
name: myapp-v1 #deployment的名字
spec:
replicas: 2 #deployment管理的pod副本数
selector: #标签选择器
matchLabels: # matchLabels下定义的标签需要跟template.metadata.labels定义的标签一致
app: myapp
version: v1
template:
metadata:
labels:
app: myapp
version: v1
spec: #定义容器的属性
containers:
- name: myapp
image: janakiramm/myapp:v1 #容器使用的镜像
imagePullPolicy: IfNotPresent #镜像拉取策略
ports:
- containerPort: 80 #容器里的应用的端口

[root@hd1 ~]# kubectl apply -f deploy-demo.yaml
[root@hd1 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-v1 3/3 3 3 22s

创建的控制器名字是myapp-v1

◇ NAME :列出名称空间中deployment的名称。

◇ READY:显示deployment有多少副本数。它遵循ready/desired的模式。

◇ UP-TO-DATE: 显示已更新到所需状态的副本数。

◇ AVAILABLE: 显示你的可以使用多少个应用程序副本。

◇ AGE :显示应用程序已运行的时间。

kubectl get rs 显示如下:

[root@hd1 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-v1-67fd9fc9c8 3 3 3 8m13s
• 创建deploy的时候也会创建一个rs(replicaset),67fd9fc9c8 这个随机数字是我们引用pod的模板template的名字的hash值

◇ NAME: 列出名称空间中ReplicaSet资源

◇ DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。

◇ CURRENT: 显示当前正在运行多少个副本。

◇ READY: 显示你的用户可以使用多少个应用程序副本。

◇ AGE :显示应用程序已运行的时间。

◇ 注意:ReplicaSet的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。RANDOM-STRING是随机生成的

生成pod查看与测试:

[root@hd1 ~]# kubectl get pods -o wide | grep myapp
myapp-v1-67fd9fc9c8-28gnd 1/1 Running 0 97m 10.244.25.211 hd3.com <none> <none>
myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 97m 10.244.156.147 hd2.com <none> <none>
myapp-v1-67fd9fc9c8-dfg5v 1/1 Running 0 97m 10.244.25.212 hd3.com <none> <none>

[[email protected] ~]# curl 10.244.25.211
background-color: blue;
[[email protected] ~]# curl 10.244.156.147
background-color: blue;
2.2 Deployment管理pod:扩容、缩容、滚动更新、回滚

通过deployment管理应用,实现扩容,把副本数变成5

[[email protected] ~]# cat deploy-demo.yaml
#直接修改replicas数量,如下,变成5
spec:
replicas: 5
#修改之后保存退出,执行
[[email protected] ~]# kubectl apply -f deploy-demo.yaml

[root@hd1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-67fd9fc9c8-28gnd 1/1 Running 0 106m
myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 106m
myapp-v1-67fd9fc9c8-dfg5v 1/1 Running 0 106m
myapp-v1-67fd9fc9c8-kdfhx 1/1 Running 0 71s
myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 71s
#上面可以看到pod副本数变成了5个

#查看myapp-v1这个控制器的详细信息:
[[email protected] ~]# kubectl describe deploy myapp-v1

通过deployment管理应用,实现缩容,把副本数变成2

[[email protected] ~]# cat deploy-demo.yaml
#直接修改replicas数量,如下,变成2
spec:
replicas: 2
#修改之后保存退出,执行
[[email protected] ~]# kubectl apply -f deploy-demo.yaml
[root@hd1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-67fd9fc9c8-28gnd 0/1 Terminating 0 108m
myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 108m
myapp-v1-67fd9fc9c8-dfg5v 0/1 Terminating 0 108m
myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 3m28s
[root@hd1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 108m
myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 3m39s

还可以通过kubectl edit deploy myapp-v1 实现自动扩容或缩容

[root@hd1 deploy]# kubectl edit deploy myapp-v1
#同样找到replicas并修改
通过deployment管理应用,实现滚动更新

[[email protected] ~]# kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-v1-67fd9fc9c8-fcprr 1/1 Running 0 19m
myapp-v1-67fd9fc9c8-hw4f9 1/1 Running 0 22m
#实时显示当前pods状态

#打开一个新的终端窗口更改镜像版本,按如下操作:
[[email protected] ~]# vim deploy-demo.yaml
#把image: janakiramm/myapp:v1 变成image: janakiramm/myapp:v2
#保存退出,执行
[[email protected] ~]# kubectl apply -f deploy-demo.yaml

#再回到刚才执行监测kubectl get pods -l app=myapp -w的那个窗口,可以看到信息如下:
NAME READY STATUS RESTARTS AGE
myapp-v1-67fd9fc9c8-8fdnn 1/1 Running 0 4m1s
myapp-v1-67fd9fc9c8-cfzh7 1/1 Running 0 114m
myapp-v1-67fd9fc9c8-khkj7 1/1 Running 0 4m1s
myapp-v1-67fd9fc9c8-s86wz 1/1 Running 0 9m40s
myapp-v1-75fb478d6c-2gzt8 0/1 Pending 0 0s
myapp-v1-75fb478d6c-2gzt8 0/1 Pending 0 0s
myapp-v1-67fd9fc9c8-khkj7 1/1 Terminating 0 5m6s
myapp-v1-75fb478d6c-2gzt8 0/1 ContainerCreating 0 0s
myapp-v1-75fb478d6c-pl7pr 0/1 Pending 0 0s
myapp-v1-75fb478d6c-pl7pr 0/1 Pending 0 0s
myapp-v1-75fb478d6c-pl7pr 0/1 ContainerCreating 0 0s
myapp-v1-67fd9fc9c8-khkj7 1/1 Terminating 0 5m7s
myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m7s
myapp-v1-75fb478d6c-2gzt8 0/1 ContainerCreating 0 1s
myapp-v1-75fb478d6c-pl7pr 0/1 ContainerCreating 0 2s
myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m8s
myapp-v1-67fd9fc9c8-khkj7 0/1 Terminating 0 5m8s
myapp-v1-75fb478d6c-2gzt8 1/1 Running 0 2s
myapp-v1-67fd9fc9c8-s86wz 1/1 Terminating 0 10m
myapp-v1-75fb478d6c-v2d4x 0/1 Pending 0 0s
myapp-v1-75fb478d6c-v2d4x 0/1 Pending 0 0s
myapp-v1-75fb478d6c-v2d4x 0/1 ContainerCreating 0 0s
myapp-v1-67fd9fc9c8-s86wz 1/1 Terminating 0 10m
myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m
myapp-v1-75fb478d6c-pl7pr 1/1 Running 0 3s
myapp-v1-67fd9fc9c8-8fdnn 1/1 Terminating 0 5m9s
myapp-v1-75fb478d6c-zx74h 0/1 Pending 0 0s
myapp-v1-75fb478d6c-zx74h 0/1 Pending 0 0s
myapp-v1-75fb478d6c-zx74h 0/1 ContainerCreating 0 0s
myapp-v1-67fd9fc9c8-8fdnn 1/1 Terminating 0 5m9s
myapp-v1-75fb478d6c-v2d4x 0/1 ContainerCreating 0 1s
myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m9s
myapp-v1-75fb478d6c-zx74h 0/1 ContainerCreating 0 1s
myapp-v1-75fb478d6c-v2d4x 1/1 Running 0 3s
myapp-v1-75fb478d6c-zx74h 1/1 Running 0 2s
myapp-v1-67fd9fc9c8-cfzh7 1/1 Terminating 0 115m
myapp-v1-67fd9fc9c8-cfzh7 1/1 Terminating 0 115m
myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115m
myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m
myapp-v1-67fd9fc9c8-s86wz 0/1 Terminating 0 10m
myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m22s
myapp-v1-67fd9fc9c8-8fdnn 0/1 Terminating 0 5m22s
myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115m
myapp-v1-67fd9fc9c8-cfzh7 0/1 Terminating 0 115m

pending表示正在进行调度,ContainerCreating表示正在创建一个pod,running表示运行一个pod,running起来一个pod之后再Terminating(停掉)一个pod,以此类推,直到所有pod完成滚动升级。

 

查看myapp-v1这个控制器的历史版本:

[[email protected] ~]# kubectl rollout history deployment myapp-v1
deployment.apps/myapp-v1
REVISION CHANGE-CAUSE
1 <none>
2 <none>
回滚:

[[email protected] ~]# kubectl rollout undo deployment myapp-v1 --to-revision=1
deployment.apps/myapp-v1 rolled back

[[email protected] ~]# kubectl rollout history deployment myapp-v1
deployment.apps/myapp-v1
REVISION CHANGE-CAUSE
2 <none>
3 <none>
————————————————
版权声明:本文为CSDN博主「鸟择良木而栖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39637333/article/details/130686963

标签:kubectl,第十天,ReplicaSet,v1,Terminating,myapp,Deployment,67fd9fc9c8,root
From: https://www.cnblogs.com/bruce1992/p/17719543.html

相关文章

  • 关于Kubernetes-v1.23.6-资源调度-Deployment-版本的回滚
    先看一下,当前笔者这里的k8s环境,主要是deployment,rs,pods相关的信息[root@k8s-masterqq-5201351]#kubectlgetdeployNAMEREADYUP-TO-DATEAVAILABLEAGEnginx-deploy3/33324h[root@k8s-masterqq-5201351]#[root@k8s-......
  • 代码随想录算法训练营第十天
    代码随想录算法训练营第十天|LeetCode20(有效的括号)LeetCode1047(删除字符串中的所有相邻重复项)LeetCode150(逆波兰表达式求值)20:有效的括号LeetCode20(有效的括号)方法一importjava.util.Stack;classSolution{publicbooleanisValid(Strings){......
  • k8s 说一下deployment,statefulset,daemonset 的区别
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)在Kubernetes(K8s)中,Deployment、StatefulSet和DaemonSet是三种常用的控制器对象,用于管理应用程序的部署和运行。它们在不同的场景下有不同......
  • 关于Kubernetes-v1.23.6-集群测试-创建一个nginx的deployment进行验证
    关于k8s集群环境搭建完成后,我们可以通过创建一个deployment进行效果的测试这里以nginx为例,还是在k8s-master上进行创建kubectlcreatedeploymentnginx--image=nginxkubectlexposedeploymentnginx--port=80--type=NodePort这里--port只是指定了容器(container )暴......
  • Kubernetes Deployment控制器创建pod k8s
    Deployment因为RCRS无法支持动态更新Deployment支持动态更新无状态应用管理Deployment控制器下面就是ReplicaSet当我们创建Deployment的时候实际上会给我们创建一个同名的ReplicaSet控制器,这个RS上面是我们对应的pod节点更新的时候,Deployment是支持自动更新的,RS也可以更新,就是......
  • 代码随想录算法训练营第十天|力扣232.用栈实现队列、力扣225.用队列实现栈
    栈与队列理论知识栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set或者map提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制......
  • 10.ReplicaSet手动蓝绿部署、滚动发布、回滚及Deployment自动滚动发布、回滚及金丝雀
    Kubernetes的控制器Kubernetes的控制器类型◼打包于ControllerManager中内置提供的控制器,例如ServiceController、DeploymentController等◆基础型、核心型控制器◆打包运行于kube-controller-manager中◼插件或第三方应用的专用控制器,例如Ingress插件ing......
  • kubernetes-Deployment和DaemonSet
    在Kubernetes中,Deployment和DaemonSet是两个不同的资源类型,用于不同的目的。Deployment用于在集群中运行可扩展的应用程序,可以管理Pod的副本数量,执行滚动升级和回滚操作。DaemonSet用于确保在集群的每个节点上运行一个Pod副本。它通常用于部署运行在每个节点上的系统级别的服务......
  • k8s 学习笔记之 Pod 控制器——Deployment
    Deployment(Deploy)为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    232.用栈实现队列   卡哥建议:大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。  题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html   做题思路:   记住栈和队列的......