【k8s资源调度-Deployment】
1、标签和选择器
1.1 标签Label
- 配置文件:在各类资源的sepc.metadata.label 中进行配置
- 通过kubectl 命令行创建修改标签,语法如下
- 创建临时label:kubectl label po <资源名称> app=hello -n <命令空间(可不加)>
- 修改已经存在的label: kubectl label po <资源名称> app=hello -n <命令空间(可不加)> --overwrite
- 通过查看lable的时候修改label
- selector 按照 label 单值查找节点: kubectl get po -A -l app=hello
- 查看所有节点的labels :kubectl get po --show-labels
## 创建pod
[root@k8s-master ~]# kubectl create -f nginx-po.yml
pod/nginx-liveness-po created# 查看pod状态
[root@k8s-master ~]# kubectl get po nginx-liveness-po
NAME READY STATUS RESTARTS AGE
nginx-liveness-po 1/1 Running 0 51s# 查看pod状态,显示label信息
[root@k8s-master ~]# kubectl get po nginx-liveness-po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-liveness-po 1/1 Running 0 68s test=l.0.0,type=app# 临时给pod添加label
[root@k8s-master ~]# kubectl label po nginx-liveness-po auth=xiaobai
pod/nginx-liveness-po labeled[root@k8s-master ~]# kubectl get po nginx-liveness-po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-liveness-po 1/1 Running 0 105s auth=xiaobai,test=l.0.0,type=app# 修改pod的label,但是不加 --overwrite 会提示失败,需要加 --overweite
[root@k8s-master ~]# kubectl label po nginx-liveness-po auth=xiaohong
error: 'auth' already has a value (xiaobai), and --overwrite is false
[root@k8s-master ~]# kubectl label po nginx-liveness-po auth=xiaohong --overwrite
pod/nginx-liveness-po labeled# 修改label属性已经更改
[root@k8s-master ~]# kubectl get po nginx-liveness-po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-liveness-po 1/1 Running 0 2m3s auth=xiaohong,test=l.0.0,type=app# 通过单个labe信息查找pod
[root@k8s-master ~]# kubectl get po -A -l type=app
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-liveness-po 1/1 Running 0 8m27s
1.2 选择器Seletor
- 通过yaml配置文件,在各对象的配置 spec.seletor 或其他可以写selector的属性中编写。
- 通过命令行模式,语法如下
- 匹配但个值,查找app=hello的pod:kubectl get po -A -I app=hello
- 匹配多个值:kubectl get po -A -I ‘k8s-app in (metrics-server,kubernetes-dashboard)’
- 查找version!=1 and app=nginx的pod信息:kubectl get po -I version!=1,app=nginx
# 单值匹配的时候
[root@k8s-master ~]# kubectl get po -A -l type=app --show-labels
NAMESPACE NAME READY STATUS RESTARTS AGE LABELS
default nginx-liveness-po 1/1 Running 0 18m auth=xiaohong,test=l.0.0,type=app# 显示所有的pod的label信息
[root@k8s-master ~]# kubectl get po -A --show-labels
NAMESPACE NAME READY STATUS RESTARTS AGE LABELS
default nginx-liveness-po 1/1 Running 0 18m auth=xiaohong,test=l.0.0,type=app
kube-flannel kube-flannel-ds-glkkb 1/1 Running 4 (24h ago) 3d19h app=flannel,controller-revision-hash=7cfb6d964b,pod-template-generation=1,tier=node
kube-flannel kube-flannel-ds-pdmtw 1/1 Running 1 (24h ago) 44h app=flannel,controller-revision-hash=7cfb6d964b,pod-template-generation=1,tier=node
kube-flannel kube-flannel-ds-tpm8x 1/1 Running 2 (24h ago) 3d19h app=flannel,controller-revision-hash=7cfb6d964b,pod-template-generation=1,tier=node
kube-system coredns-c676cc86f-pdsl6 1/1 Running 3 (24h ago) 2d7h k8s-app=kube-dns,pod-template-hash=c676cc86f
kube-system coredns-c676cc86f-q7hcw 1/1 Running 1 (24h ago) 2d7h k8s-app=kube-dns,pod-template-hash=c676cc86f
kube-system etcd-k8s-master 1/1 Running 2 (24h ago) 3d20h component=etcd,tier=control-plane
kube-system kube-apiserver-k8s-master 1/1 Running 3 (24h ago) 3d20h component=kube-apiserver,tier=control-plane
kube-system kube-controller-manager-k8s-master 1/1 Running 4 (24h ago) 3d20h component=kube-controller-manager,tier=control-plane
kube-system kube-proxy-n2w92 1/1 Running 4 (24h ago) 3d19h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-proxy-p8fhs 1/1 Running 1 (24h ago) 44h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-proxy-xtllb 1/1 Running 2 (24h ago) 3d20h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-scheduler-k8s-master 1/1 Running 4 (24h ago) 3d20h component=kube-scheduler,tier=control-plane# 匹配单个值 app!=flannel
[root@k8s-master ~]# kubectl get po -A -l app!=flannel
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-liveness-po 1/1 Running 0 19m
kube-system coredns-c676cc86f-pdsl6 1/1 Running 3 (24h ago) 2d7h
kube-system coredns-c676cc86f-q7hcw 1/1 Running 1 (24h ago) 2d7h
kube-system etcd-k8s-master 1/1 Running 2 (24h ago) 3d20h
kube-system kube-apiserver-k8s-master 1/1 Running 3 (24h ago) 3d20h
kube-system kube-controller-manager-k8s-master 1/1 Running 4 (24h ago) 3d20h
kube-system kube-proxy-n2w92 1/1 Running 4 (24h ago) 3d19h
kube-system kube-proxy-p8fhs 1/1 Running 1 (24h ago) 44h
kube-system kube-proxy-xtllb 1/1 Running 2 (24h ago) 3d20h
kube-system kube-scheduler-k8s-master 1/1 Running 4 (24h ago) 3d20h[root@k8s-master ~]# kubectl get po -A -l app!=flannel --show-labels
NAMESPACE NAME READY STATUS RESTARTS AGE LABELS
default nginx-liveness-po 1/1 Running 0 19m auth=xiaohong,test=l.0.0,type=app
kube-system coredns-c676cc86f-pdsl6 1/1 Running 3 (24h ago) 2d7h k8s-app=kube-dns,pod-template-hash=c676cc86f
kube-system coredns-c676cc86f-q7hcw 1/1 Running 1 (24h ago) 2d7h k8s-app=kube-dns,pod-template-hash=c676cc86f
kube-system etcd-k8s-master 1/1 Running 2 (24h ago) 3d20h component=etcd,tier=control-plane
kube-system kube-apiserver-k8s-master 1/1 Running 3 (24h ago) 3d20h component=kube-apiserver,tier=control-plane
kube-system kube-controller-manager-k8s-master 1/1 Running 4 (24h ago) 3d20h component=kube-controller-manager,tier=control-plane
kube-system kube-proxy-n2w92 1/1 Running 4 (24h ago) 3d19h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-proxy-p8fhs 1/1 Running 1 (24h ago) 44h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-proxy-xtllb 1/1 Running 2 (24h ago) 3d20h controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-system kube-scheduler-k8s-master 1/1 Running 4 (24h ago) 3d20h component=kube-scheduler,tier=control-plane# 多值匹配
[root@k8s-master ~]# kubectl get po -A -l app!=flannel,test=1.0.0 --show-labels
No resources found# 多值匹配,多值匹配是“与”的关系,不是“或”的关系
[root@k8s-master ~]# kubectl get po -A -l app!=flannel,type=app --show-labels
NAMESPACE NAME READY STATUS RESTARTS AGE LABELS
default nginx-liveness-po 1/1 Running 0 20m auth=xiaohong,test=l.0.0,type=app
2、部署对象Deployment(无状态应用)
2.1 创建deploy
2.1.1 通过命令行创建一个deployment
# 创建一个deployment
[root@k8s-master ~]# kubectl create deploy nginx-deploy --image=nginx:1.20
deployment.apps/nginx-deploy created
创建一个deployment
使用命令行模式:kubectl create deploy nginx-deploy --image=nginx:1.20
或执行 kubectl create -f xxx.yaml --record
-record会在annotation中记录当前命令创建或升级了资源,后续可以查看做过哪变动操作。
2.1.2 查看deployment 信息
通过kubectl get 查看deployment,可以使用deployment,也可以用deploy
# 通过kubectl get 查看deployment,可以使用deployment,也可以用deploy
[root@k8s-master ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 10s[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 14s
2.1.3 查看replicasets 信息
由于创建的deployment资源包含 replicasets信息(replicasets是可以自动扩容和缩容),可以查看到 replicasets的名字中包含deploy资源的名字信息
# 由于deployment包含 replicasets(replicasets是可以自动扩容和缩容),可以查看到 replicasets的名字中包含deploy的名字信息
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-86b7d8c46d 1 1 1 18s[root@k8s-master ~]# kubectl get replicasets.apps
NAME DESIRED CURRENT READY AGE
nginx-deploy-86b7d8c46d 1 1 1 38s
2.1.4 查看pod 信息
可以查看到deployment创建的pod种包含 replicasets 资源的名字信息
# 下面的pod可以查看到pod的名字包含 replicasets 名字的信息
[root@k8s-master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deploy-86b7d8c46d-78rj9 1/1 Running 0 46s
2.1.5 通过命令行模式创建的deployment 生成 yaml信息
# 通过创建好的deploy生成yaml文件
[root@k8s-master ~]# kubectl get deploy nginx-deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2024-02-23T10:59:04Z"generation: 1labels:app: nginx-deployname: nginx-deploynamespace: defaultresourceVersion: "235341"uid: def47aae-13f7-415a-a9d1-18ef72e5a925
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: nginx-deploystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginx-deployspec:containers:- image: nginx:1.20imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
status:availableReplicas: 1conditions:- lastTransitionTime: "2024-02-23T10:59:05Z"lastUpdateTime: "2024-02-23T10:59:05Z"message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: "True"type: Available- lastTransitionTime: "2024-02-23T10:59:04Z"lastUpdateTime: "2024-02-23T10:59:05Z"message: ReplicaSet "nginx-deploy-86b7d8c46d" has successfully progressed.reason: NewReplicaSetAvailablestatus: "True"type: ProgressingobservedGeneration: 1readyReplicas: 1replicas: 1updatedReplicas: 1
2.1.6 查看po、rs、deploy中所有的label信息
通过以下信息,可以查看到:
deploy、rs、pod种都包含同一个label信息:app=nginx-deploy;
rs和pod中同时还有一个相同的pod标签信息:pod-template-hash=86b7d8c46d,这个标签信息就是为了我们能更方便的动态创建pod使用。
[root@k8s-master ~]# kubectl get po,rs,deploy --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod/nginx-deploy-86b7d8c46d-78rj9 1/1 Running 0 30m app=nginx-deploy,pod-template-hash=86b7d8c46dNAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/nginx-deploy-86b7d8c46d 1 1 1 30m app=nginx-deploy,pod-template-hash=86b7d8c46dNAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/nginx-deploy 1/1 1 1 30m app=nginx-deploy
2.1.7 通过(2.1.5)中生成的yaml信息创建yaml文件
通过命令行创建的deployment信息生成yaml信息,根据我们所需信息来创建yaml文件
apiVersion: apps/v1 # deployment api版本
kind: Deployment # 资源类型为 Deployment
metadata: # 原信息labels: # 标签app: nginx-deploy # 具体的标签信息:app=nginx-deploy key: value 配置形式name: nginx-deploy # deployment的名字namespace: default # 所在的命名空间
spec:replicas: 1 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数量selector: # 选择器,用于找到匹配的RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签strategy: #更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 滚动更新时,更新的个数最多超过多少个期望副本数,或者比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod模板的元信息labels: # pod模板的标签app: nginx-deploy # pod模板的标签信息spec: # pod 期望信息containers: # pod 的容器信息- image: nginx:1.20 # 镜像信息imagePullPolicy: IfNotPresent # 镜像拉取策略name: nginx # 容器名字restartPolicy: Always # pod的重启策略terminationGracePeriodSeconds: 30 # pod的过期时间
2.2 滚动更新
只有修改了deployment 配置文件文件中的template中的属性后,才会触发滚动更新操作
2.2.1 修改deploy中的其他属性查看pod是否会更新
[root@k8s-master ~]# kubectl get deployments --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 1/1 1 1 44m app=nginx-deploy[root@k8s-master ~]# kubectl edit deployments nginx-deploy
deployment.apps/nginx-deploy edited
可以通过下面新的看到我们的deploy更新并没有导致pod更新,只是把新加的标签给更新到了deploy上。
[root@k8s-master ~]# kubectl get deployments --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 1/1 1 1 49m app=nginx-deploy,new-version=test# rs和pod并没有这个标签信息
[root@k8s-master ~]# kubectl get deployments,rs,pod --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/nginx-deploy 1/1 1 1 51m app=nginx-deploy,new-version=testNAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/nginx-deploy-86b7d8c46d 1 1 1 51m app=nginx-deploy,pod-template-hash=86b7d8c46dNAME READY STATUS RESTARTS AGE LABELS
pod/nginx-deploy-86b7d8c46d-78rj9 1/1 Running 0 51m app=nginx-deploy,pod-template-hash=86b7d8c46d
2.2.2 修改这个deploy的副本数
[root@k8s-master ~]# kubectl get deploy nginx-deploy --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 3/3 3 3 55m app=nginx-deploy,new-version=test
[root@k8s-master ~]# kubectl describe deployments nginx-deploy
Name: nginx-deploy
Namespace: default
CreationTimestamp: Fri, 23 Feb 2024 18:59:04 +0800
Labels: app=nginx-deploynew-version=test
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx-deploy
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:Labels: app=nginx-deployContainers:nginx:Image: nginx:1.20Port: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>
Conditions:Type Status Reason---- ------ ------Progressing True NewReplicaSetAvailableAvailable True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-86b7d8c46d (3/3 replicas created)
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 55m deployment-controller Scaled up replica set nginx-deploy-86b7d8c46d to 1Normal ScalingReplicaSet 27s deployment-controller Scaled up replica set nginx-deploy-86b7d8c46d to 3 from 1
[root@k8s-master ~]#
通过增加副本数后,我们可以看到deploy变为了3,rs为1,pod为3,pod的模版使用的都是同一个模版。
[root@k8s-master ~]# kubectl get deployments,rs,po --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/nginx-deploy 3/3 3 3 57m app=nginx-deploy,new-version=testNAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/nginx-deploy-86b7d8c46d 3 3 3 57m app=nginx-deploy,pod-template-hash=86b7d8c46dNAME READY STATUS RESTARTS AGE LABELS
pod/nginx-deploy-86b7d8c46d-6cf95 1/1 Running 0 93s app=nginx-deploy,pod-template-hash=86b7d8c46d
pod/nginx-deploy-86b7d8c46d-78rj9 1/1 Running 0 57m app=nginx-deploy,pod-template-hash=86b7d8c46d
pod/nginx-deploy-86b7d8c46d-vjncw 1/1 Running 0 93s app=nginx-deploy,pod-template-hash=86b7d8c46d
2.2.3 通过edit选项编辑template属性后我们看看会发生那些变化
通过实时监控deploy的时候可以看到deploy的变化
[root@k8s-master ~]# kubectl get deployments.apps nginx-deploy -w
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 61m
nginx-deploy 3/3 3 3 61m
nginx-deploy 3/3 3 3 61m
nginx-deploy 3/3 0 3 61m
nginx-deploy 3/3 1 3 61m
nginx-deploy 4/3 1 4 62m
nginx-deploy 3/3 1 3 62m
nginx-deploy 3/3 2 3 62m
nginx-deploy 4/3 2 4 62m
nginx-deploy 3/3 2 3 62m
nginx-deploy 3/3 3 3 62m
nginx-deploy 4/3 3 4 62m
nginx-deploy 3/3 3 3 62m# 通过这个命令可以看到更新的状态为成功了
[root@k8s-master ~]# kubectl rollout status deployment nginx-deploy
deployment "nginx-deploy" successfully rolled out
2.2.4 修改set选项编辑刚才的镜像信息看看更新如何
[root@k8s-master ~]# kubectl set image deployment/nginx-deploy nginx=nginx:1.20
deployment.apps/nginx-deploy image updated[root@k8s-master ~]# kubectl get deployments.apps nginx-deploy -w
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 72m
nginx-deploy 3/3 3 3 72m
nginx-deploy 3/3 3 3 72m
nginx-deploy 3/3 0 3 72m
nginx-deploy 3/3 1 3 72m
nginx-deploy 4/3 1 4 72m
nginx-deploy 3/3 1 3 72m
nginx-deploy 3/3 2 3 72m
nginx-deploy 4/3 2 4 72m
nginx-deploy 3/3 2 3 72m
nginx-deploy 3/3 3 3 72m
nginx-deploy 4/3 3 4 72m
nginx-deploy 3/3 3 3 72m
通过如下信息,可以看到新的nginx pod信息可以看到他滚动更新到刚开始的rs信息
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-6bf65c4445 0 0 0 17m
nginx-deploy-86b7d8c46d 3 3 3 79m
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-86b7d8c46d-4s98c 1/1 Running 0 7m17s
nginx-deploy-86b7d8c46d-7s9gz 1/1 Running 0 7m19s
nginx-deploy-86b7d8c46d-w8ljk 1/1 Running 0 7m15s
2.3 回滚操作
有时候你可能想回退一个Deployment,例如,当Deployment不稳定时,比如一直crash looping。
默认侍况下,kubernetes会在系统中保存前两次的Deployment的rollout历史记录,以便你可以随时会退(你可以修改revisionhistory limit来更改保存的revision数),
2.3.1 通过set选项修改一个错误的images信息
[root@k8s-master ~]# kubectl set image deployment/nginx-deploy nginx=nginx:1.200
deployment.apps/nginx-deploy image updated# 可以看到一个更新的这个nginx的状态是ImagePullBackOff
[root@k8s-master ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-deploy-85bc5c8fdb-h4rmn 0/1 ImagePullBackOff 0 83s
nginx-deploy-86b7d8c46d-4s98c 1/1 Running 0 25m
nginx-deploy-86b7d8c46d-7s9gz 1/1 Running 0 25m
nginx-deploy-86b7d8c46d-w8ljk 1/1 Running 0 25m
使用命令:kubectl describe pod nginx-deploy-85bc5c8fdb-h4rmn 可以查看到这个新的pod信息
2.3.2 通过edit选项查看这个deploy的信息
2.3.3 查看历史的版本信息
[root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy --revision=0
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
2.3.4 查看历史更新的具体信息
[root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy --revision=4
deployment.apps/nginx-deploy with revision #4
Pod Template:Labels: app=nginx-deploypod-template-hash=85bc5c8fdbContainers:nginx:Image: nginx:1.200Port: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>[root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy --revision=3
deployment.apps/nginx-deploy with revision #3
Pod Template:Labels: app=nginx-deploypod-template-hash=86b7d8c46dContainers:nginx:Image: nginx:1.20Port: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>[root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy --revision=2
deployment.apps/nginx-deploy with revision #2
Pod Template:Labels: app=nginx-deploypod-template-hash=6bf65c4445Containers:nginx:Image: nginx:1.21Port: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>
2.3.5 回滚为revision=3的版本
[root@k8s-master ~]# kubectl rollout undo deployment/nginx-deploy --to-revision=3
deployment.apps/nginx-deploy rolled back[root@k8s-master ~]# kubectl rollout status deployments.apps nginx-deploy
deployment "nginx-deploy" successfully rolled out
如下已经回滚为了revision=3的版本。
[root@k8s-master ~]# kubectl describe deployments nginx-deploy
Name: nginx-deploy
Namespace: default
CreationTimestamp: Fri, 23 Feb 2024 18:59:04 +0800
Labels: app=nginx-deploynew-version=test
Annotations: deployment.kubernetes.io/revision: 5
Selector: app=nginx-deploy
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:Labels: app=nginx-deployContainers:nginx:Image: nginx:1.20Port: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>
Conditions:Type Status Reason---- ------ ------Available True MinimumReplicasAvailableProgressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-86b7d8c46d (3/3 replicas created)
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 57m deployment-controller Scaled up replica set nginx-deploy-86b7d8c46d to 3 from 1Normal ScalingReplicaSet 51m deployment-controller Scaled up replica set nginx-deploy-6bf65c4445 to 1Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set nginx-deploy-86b7d8c46d to 2 from 3Normal ScalingReplicaSet 50m deployment-controller Scaled up replica set nginx-deploy-6bf65c4445 to 2 from 1Normal ScalingReplicaSet 49m deployment-controller Scaled down replica set nginx-deploy-86b7d8c46d to 1 from 2Normal ScalingReplicaSet 49m deployment-controller Scaled up replica set nginx-deploy-6bf65c4445 to 3 from 2Normal ScalingReplicaSet 49m deployment-controller Scaled down replica set nginx-deploy-86b7d8c46d to 0 from 1Normal ScalingReplicaSet 40m deployment-controller Scaled up replica set nginx-deploy-86b7d8c46d to 1 from 0Normal ScalingReplicaSet 40m deployment-controller Scaled down replica set nginx-deploy-6bf65c4445 to 2 from 3Normal ScalingReplicaSet 40m (x4 over 40m) deployment-controller (combined from similar events): Scaled down replica set nginx-deploy-6bf65c4445 to 0 from 1Normal ScalingReplicaSet 16m deployment-controller Scaled up replica set nginx-deploy-85bc5c8fdb to 1Normal ScalingReplicaSet 116s deployment-controller Scaled down replica set nginx-deploy-85bc5c8fdb to 0 from 1
2.3.6 为啥可以回退为revision=3呢?
可以通过设置,spec.revisonHistoryLimit来指定deployment保留多少revision。如果revisonHistoryLimit设置为0,则不允许deployment回退了。
2.4 扩容和缩容
- 扩缩容命令: kubectl scale --replicas=6 deployment nginx-deploy
- 扩容和缩容一样,只需要通过–replicas 指定数量即可
2.4.1 扩容
# 目前有3个pod,扩容到6个
[root@k8s-master ~]# kubectl scale --replicas=6 deployment nginx-deploy
deployment.apps/nginx-deploy scaled
[root@k8s-master ~]# kubectl get deployments nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 6/6 6 6 5h43m
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-6bf65c4445 0 0 0 4h42m
nginx-deploy-85bc5c8fdb 0 0 0 4h7m
nginx-deploy-86b7d8c46d 6 6 6 5h43m
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-86b7d8c46d-4s98c 1/1 Running 0 4h31m
nginx-deploy-86b7d8c46d-7s9gz 1/1 Running 0 4h31m
nginx-deploy-86b7d8c46d-n2m6j 1/1 Running 0 33s
nginx-deploy-86b7d8c46d-w8ljk 1/1 Running 0 4h31m
nginx-deploy-86b7d8c46d-wgdnv 1/1 Running 0 33s
nginx-deploy-86b7d8c46d-z86rx 1/1 Running 0 33s
2.4.1 缩容
# 缩容,有6个pod,现在缩容到4个pod
[root@k8s-master ~]# kubectl scale --replicas=4 deployment nginx-deploy
deployment.apps/nginx-deploy scaled
[root@k8s-master ~]# kubectl get deployments nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 4/4 4 4 5h45m
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-6bf65c4445 0 0 0 4h44m
nginx-deploy-85bc5c8fdb 0 0 0 4h9m
nginx-deploy-86b7d8c46d 4 4 4 5h45m
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-86b7d8c46d-4s98c 1/1 Running 0 4h33m 10.2.2.12 k8s-node-01 <none> <none>
nginx-deploy-86b7d8c46d-7s9gz 1/1 Running 0 4h33m 10.2.1.28 k8s-node-02 <none> <none>
nginx-deploy-86b7d8c46d-w8ljk 1/1 Running 0 4h33m 10.2.1.29 k8s-node-02 <none> <none>
nginx-deploy-86b7d8c46d-z86rx 1/1 Running 0 2m33s 10.2.2.14 k8s-node-01 <none> <none>
2.5 暂停和恢复
由于每次对pod 的 template中的信息发生修改后,都会触发更新deployment操作,那么此时如果频繁修改信息,就会产生多次更新,而实际上只需要执行最后一次更新即可,当出现此类情况时我们就可以暂停deployment的 rollout。
2.5.1 给template添加一个最小cpu和内存的参数
2.5.2 暂停deploy更新
通过kubectl rollout pause deployment <name> 就可以实现暂停,直到你下次恢复后才会继续进行滚动更新。
# 暂时deploy更新
[root@k8s-master ~]# kubectl rollout pause deployment nginx-deploy
deployment.apps/nginx-deploy paused
2.5.3 再次更新template,给cpu和内存添加一个最大参数
这次更新过之后,rs信息和pod信息都没有发生改变,是由于我们暂停了deploy的更新
[root@k8s-master ~]# kubectl edit deploy nginx-deploy
deployment.apps/nginx-deploy edited[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-6bf65c4445 0 0 0 5h7m
nginx-deploy-6dc7697cfb 3 3 3 8m33s
nginx-deploy-85bc5c8fdb 0 0 0 4h32m
nginx-deploy-86b7d8c46d 0 0 0 6h8m
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-6dc7697cfb-6p9mj 1/1 Running 0 8m38s
nginx-deploy-6dc7697cfb-lc472 1/1 Running 0 8m37s
nginx-deploy-6dc7697cfb-w295s 1/1 Running 0 8m35s
2.5.4 查看更新信息
通过下面的信息,可以看到刚才添加cpu和内存参数在更新历史列表里面没有显示,说明我们的deploy没有更新
[root@k8s-master ~]# kubectl rollout history deployment nginx-deploy --revision=0
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
2 <none>
4 <none>
5 <none>
6 <none>[root@k8s-master ~]# kubectl rollout history deployment nginx-deploy --revision=6
deployment.apps/nginx-deploy with revision #6
Pod Template:Labels: app=nginx-deploypod-template-hash=6dc7697cfbContainers:nginx:Image: nginx:1.20Port: <none>Host Port: <none>Requests:cpu: 100mmemory: 128MiEnvironment: <none>Mounts: <none>Volumes: <none>
2.5.5 恢复deploy的更新
启动deploy的更新
[root@k8s-master ~]# kubectl rollout resume deployment nginx-deploy
deployment.apps/nginx-deploy resumed
这里 rs 已经发生了改变
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-57bf686b9d 3 3 3 12s
nginx-deploy-6bf65c4445 0 0 0 5h15m
nginx-deploy-6dc7697cfb 0 0 0 17m
nginx-deploy-85bc5c8fdb 0 0 0 4h41m
nginx-deploy-86b7d8c46d 0 0 0 6h17m
刚才查询的历史更新版本只有4个,现在又多了一个
[root@k8s-master ~]# kubectl rollout history deployment nginx-deploy --revision=0
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
2 <none>
4 <none>
5 <none>
6 <none>
7 <none>
通过历史更新版本信息可以看到,我们添加的最大cpu和内存参数都发生了改变。
[root@k8s-master ~]# kubectl rollout history deployment nginx-deploy --revision=7
deployment.apps/nginx-deploy with revision #7
Pod Template:Labels: app=nginx-deploypod-template-hash=57bf686b9dContainers:nginx:Image: nginx:1.20Port: <none>Host Port: <none>Limits:cpu: 500mmemory: 512MiRequests:cpu: 100mmemory: 128MiEnvironment: <none>Mounts: <none>Volumes: <none>
2.6 配置文件(部署无状态服务nginx的yaml文件)
[root@k8s-master ~]# cat nginx-deploy.yaml
apiVersion: apps/v1 # deployment api版本
kind: Deployment # 资源类型为 Deployment
metadata: # 原信息labels: # 标签app: nginx-deploy # 具体的标签信息:app=nginx-deploy key: value 配置形式name: nginx-deploy # deployment的名字namespace: default # 所在的命名空间
spec:replicas: 1 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数量selector: # 选择器,用于找到匹配的RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签strategy: #更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 滚动更新时,更新的个数最多超过多少个期望副本数,或者比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod模板的元信息labels: # pod模板的标签app: nginx-deploy # pod模板的标签信息spec: # pod 期望信息containers: # pod 的容器信息- image: nginx:1.20 # 镜像信息imagePullPolicy: IfNotPresent # 镜像拉取策略name: nginx # 容器名字restartPolicy: Always # pod的重启策略terminationGracePeriodSeconds: 30 # pod的过期时间
相关文章:

【k8s资源调度-Deployment】
1、标签和选择器 1.1 标签Label 配置文件:在各类资源的sepc.metadata.label 中进行配置通过kubectl 命令行创建修改标签,语法如下 创建临时label:kubectl label po <资源名称> apphello -n <命令空间(可不加࿰…...

【Oracle】玩转Oracle数据库(五):PL/SQL编程
前言 嗨,各位数据库达人!准备好迎接数据库编程的新挑战了吗?今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程!🔮💻 在这篇博文【Oracle】玩转Oracle数据库(五)࿱…...

JavaScript流程控制
文章目录 1. 顺序结构2. 分支结构2.1 if 语句2.2 if else 双分支语句2.3 if else if 多分支语句三元表达式 2.4 switch 语句switch 语句和 if else if语句区别 3. 循环结构3.1 for 循环断点调试 3.2 双重 for 循环3.3 while 循环3.4 do while 循环3.5 contiue break 关键字 4. …...
五个使用Delphi语言进行开发的案例
案例一:学生信息管理系统 某学校需要开发一个学生信息管理系统,用于记录学生的基本信息、成绩和考勤情况等。开发者使用Delphi语言进行开发,设计了一个包含多个窗体的应用程序。主窗体用于展示学生的列表和基本信息,其他窗体则用…...
蓝桥杯第1374题——锻造兵器
题目描述 小明一共有n块锻造石,第块锻造石的属性值为ai. 现在小明决定从这n块锻造石中任取两块来锻造兵器 通过周密计算,小明得出,只有当两块锻造石的属性值的差值等于C,兵器才能锻造成功 请你帮小明算算,他有多少种选…...

坚鹏:政府数字化转型数字机关、数据共享及电子政务类案例研究
政府数字化转型数字机关、数据共享及电子政务类案例研究 课程背景: 很多地方政府存在以下问题: 不清楚政府数字化转型的数字机关类成功案例 不清楚政府数字化转型的数据共享类成功案例 不清楚政府数字化转型的电子政务类成功案例 课程特色&…...

【架构】面向人工智能 (AI) 的硬件的可靠性(2021)
由于激进的技术扩展,现代系统越来越容易受到可靠性威胁的影响,例如软错误、老化和工艺变化。这些威胁在硬件级别表现为位翻转,并且根据位置,可能会损坏输出,从而导致不准确或潜在的灾难性结果。 传统的缓解技术基于冗…...
Unity3D MVC开发模式与开发流程详解
前言 MVC(Model-View-Controller)是一种常用的软件架构模式。将MVC应用于Unity3D开发可以提高项目的可维护性和可扩展性,使代码更加清晰和易于理解。本文将详细介绍Unity3D中MVC开发模式的应用以及开发流程,并给出技术详解和代码…...
简单介绍一下Android里面的IntentFirewall
源码链接 https://android.googlesource.com/platform/frameworks/base//633dc9b/services/java/com/android/server/firewall/IntentFirewall.java 源码如下: package com.android.server.firewall; import android.content.Intent; import android.content.Inte…...

Stable Diffusion 3 发布及其重大改进
1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后,Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说,我们快来看看吧! 2. 什么是Stable Diffusion…...
【后端】springboot项目
文章目录 1. 2.3.7.RELEASE版本搭建1.1 pom文件1.1.1 方式一1.1.2 方式二 1.2 启动类1.3 测试类 2. 引入Value乱码问题解决 【后端目录贴】 1. 2.3.7.RELEASE版本搭建 1.1 pom文件 1.1.1 方式一 <parent><groupId>org.springframework.boot</groupId><…...
React Native调用摄像头画面及拍照和保存图片到相册全流程
今天主要做了一个demo,功能很简单,就是调用手机摄像头画面,并且可以通过按钮控制拍照以及将图片保存到手机相册的功能,接下来我将从创建项目开始一步一步完成这个demo,各位只需要复制粘贴即可 创建React Native项目 npx react-native init yx_rnDemo --version 0.70.6 // 这里…...
Kubernetes基本部署概念
文章目录 命名空间(Namespaecs)查看命名空间查看带有命名空间对象下资源 文件存储持久卷(pv,Persistent Volumes)卷容量卷模式(volumeMode)访问模式(accessModes)回收策略…...
QT c++ 海康红外热像仪
//本文描述2通道海康通道红外热像仪预览和抓图 #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); userID-1; …...

OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(一)
前面的OpenAI DevDay活动上,GPTs技术的亮相引起了广泛关注。随着GPTs的创建权限开放给Plus用户,社区里迅速涌现了各种有趣的GPT应用,这些都是利用了Prompt提示词的灵活性。这不仅展示了技术的创新潜力,也让人们开始思考如何获取他…...

中科大计网学习记录笔记(十五):可靠数据传输的原理
前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…...

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)
一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)࿰…...
力扣:93. 复原 IP 地址
回溯: 1.先定义一个接收的集合,之后再定义一个记录小数点的变量。之后编写回溯函数,终止条件为小数点的个数为3时,同时要判断最后一段的组合的值是否属于ip地址的范围。之后再用for循环来遍历ip地址的组合,先判断组合…...
利用序列化和反序列化实现深拷贝
利用序列化和反序列化可以实现对象的深拷贝,具体步骤如下: 将要深拷贝的对象序列化为字节流。从字节流中反序列化出一个新的对象,即完成了深拷贝。下面是一个示例代码: import java.io.*;class MyClass implements Serializable {private static final long serialVersion…...
【AHK】68键键盘键位布局优化/esc改退格键/回车键
本人习惯使用~作为退格键,但是由于keychron 68键的布局只能用esc平替~来修改,然后也将回车键通过alt和大小写锁定键一起触发 esc::bs ;次步骤与下面步骤相对应,如果是用send bs方式则下面的不生效^esc:: ;通过建立 保留esc功能 send {esc} re…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...