img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

 DeploymentStrategy describes how to replace existing pods with new ones.

FIELDS:
rollingUpdate
#支持两种更新,Recreate 和 RollingUpdate
#Recreate 是重建式更新,删除一个更新一个
#RollingUpdate 滚动更新,定义滚动更新方式,也就是 pod 能多几个,少几个
type

#查看 Deployment 下的 spec.strategy.rollingUpdate 字段
[root@k8smaster node]# kubectl explain deploy.spec.strategy.rollingUpdate
KIND: Deployment
VERSION: apps/v1

RESOURCE: rollingUpdate

DESCRIPTION:
Rolling update config params. Present only if DeploymentStrategyType =
RollingUpdate.

 Spec to control the desired behavior of rolling update.

FIELDS:
maxSurge
#我们更新的过程当中最多允许超出的指定的目标副本数有几个,它有两种取值方式,第一种直接给定数量,第二种根据百分比,百分比表示原本是 5 个,最多可以超出 20%,那就允许多一个,最多可以超过 40%,那就允许多两个.

maxUnavailable
#最多允许几个不可用 假设有 5 个副本,最多一个不可用,就表示最少有 4 个可用


查看 Deployment 下的 spec.template 字段,template 为定义 Pod 的模板,Deployment 通过模板创建 Pod



[root@k8smaster node]# kubectl explain deploy.spec.template
KIND: Deployment
VERSION: apps/v1

RESOURCE: template

DESCRIPTION:
Template describes the pods that will be created.

 PodTemplateSpec describes the data a pod should have when created from a
 template

FIELDS:
metadata #定义模板的名字

spec

deployment.spec.template 为 Pod 定义的模板,和 Pod 定义不太一样,template 中不包含 apiVersion 和 Kind 属性,要求必须有 metadata。deployment.spec.template.spec 为容器的属性信息,其他定义内容和 Pod 一致。


查看 Deployment 下的 spec.template.spec 字段



[root@k8smaster node]# kubectl explain deploy.spec.template.spec
KIND: Deployment
VERSION: apps/v1

RESOURCE: spec

DESCRIPTION:
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

 PodSpec is a description of a pod.

FIELDS:
activeDeadlineSeconds
#activeDeadlineSeconds 表示 Pod 可以运行的最长时间,达到设置的该值后,Pod 会自动停止。

affinity
#定义亲和性,跟直接创建 pod 时候定义亲和性类似

automountServiceAccountToken
#身份认证相关的

containers <[]Object> -required-
#定义容器属性

dnsConfig
#设置 Pod 的 DNS 和 host 对齐
dnsPolicy: None
dnsConfig:
nameservers:
- 192.168.11.141
- 192.168.11.140
searches:
- paopao.svc.cluster.local
- my.dns.search.paopao

dnsPolicy

dnsPolicy 决定 Pod 内预设的 DNS 配置策略

None 无任何策略:使用自定义的策略
Default 默认:使用宿主机的 dns 配置,/etc/resolv.conf
ClusterFirst 集群 DNS 优先,与 Default 相反,会预先使用 kube-dns (或 CoreDNS ) 的信息当预设置参数写入到该 Pod 内的 DNS 配置。
ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络:同时使用 hostNetwork 与 kube-dns 作为 Pod 预设 DNS 配置。

enableServiceLinks

ephemeralContainers <[]Object> #定义临时容器
临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序。临时容器使用与常规容器相同的 ContainerSpec 段进行描述,但许多字段是不相容且不允许的。
临时容器没有端口配置,因此像 ports,livenessProbe,readinessProbe 这样的字段是不允许的,Pod 资源分配是不可变的,因此 resources 配置是不允许的。
临时容器用途: 当由于容器崩溃或容器镜像不包含调试应用程序而导致 kubectl exec 无用时,临时容器对于交互式故障排查很有用。

hostAliases <[]Object> #在 pod 中增加域名解析的 和 containers 对齐
hostAliases:
– ip: “10.1.1.1”
hostnames:
– “mc.local”
– “rabbitmq.local”

  • ip: “10.1.2.3”
    hostnames:
    – “redis.local”
    – “mq.local”

hostIPC #使用主机 IPC

hostNetwork #是否使用宿主机的网络

hostPID #可以设置容器里是否可以看到宿主机上的进程。True 可以

hostname

imagePullSecrets <[]Object>

initContainers <[]Object> #定义初始化容器

nodeName #定义 pod 调度到具体哪个节点上

nodeSelector <map[string]string> #定义节点选择器

overhead <map[string]string>
#overhead 是 1.16 引入的字段,在没有引入 Overhead 之前,只要一个节点的资源可用量大于等于 Pod 的 requests 时,这个 Pod 就可以被调度到这个节点上。引入 Overhead 之后,只有节点的资源可用量大于等于 Overhead 加上 requests 的和时才能被调度上来。

preemptionPolicy

priority

priorityClassName

readinessGates <[]Object>

restartPolicy #Pod 重启策略

runtimeClassName

schedulerName

securityContext #是否开启特权模式

serviceAccount

serviceAccountName

shareProcessNamespace

subdomain

terminationGracePeriodSeconds
#在真正删除容器之前,K8S 会先发终止信号(kill -15 {pid})给容器,默认 30s

tolerations <[]Object> #定义容忍度

topologySpreadConstraints <[]Object>

volumes <[]Object> #挂载存储卷


## Deployment 使用案例:创建一个 web 站点



deployment 是一个三级结构,deployment 管理 replicaset,replicaset 管理 pod,
用 deployment 创建一个 pod
#把 myapp-blue-v1.tar.gz 和 myapp-blue-v2.tar.gz 上传到 node1 和 node2 上,
[root@k8snode ~]# docker load -i myapp-blue-v1.tar.gz
[root@k8snode2 ~]# docker load -i myapp-blue-v1.tar.gz
[root@k8snode ~]# docker load -i myapp-blue-v2.tar.gz
[root@k8snode2 ~]# docker load -i myapp-blue-v2.tar.gz
[root@xianchaomaster1 ~]# vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
spec:
replicas: 2
selector:
matchLabels:
app: myapp
version: v1
template:
metadata:
name: test
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: janakiramm/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
httpGet:
port: 80
readinessProbe:
httpGet:
port: 80
#不加ip默认是对主机ip进行httpget存活验证
[root@k8smaster node]# kubectl apply -f deploy-demo.yaml
deployment.apps/myapp-v1 created
#kubectl apply:表示声明式的定义,既可以创建资源,也可以动态更新资源

[root@k8smaster node]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-v1 2/2 2 2 41s

#创建的控制器名字是 myapp-v1
1.NAME :列出名称空间中 deployment 的名称。
2.READY:显示 deployment 有多少副本数。它遵循 ready/desired 的模式。
3.UP-TO-DATE: 显示已更新到所需状态的副本数。
4.AVAILABLE: 显示你的可以使用多少个应用程序副本。
5.AGE :显示应用程序已运行的时间。

[root@k8smaster node]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-v1-8ff97699c 2 2 2 72s
#创建 deploy 的时候也会创建一个 rs(replicaset),8ff97699c 这个随机数字是我们引用pod 的模板 template 的名字的 hash 值
1.NAME: 列出名称空间中 ReplicaSet 资源
2.DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。
3.CURRENT: 显示当前正在运行多少个副本。
4.READY: 显示你的用户可以使用多少个应用程序副本。
5.AGE :显示应用程序已运行的时间。

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

[root@k8smaster node]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-8ff97699c-42wts 1/1 Running 0 2m20s
myapp-v1-8ff97699c-vvld2 1/1 Running 0 2m20s
[root@k8smaster node]# kubectl get pods -o wide | grep myapp
myapp-v1-8ff97699c-42wts 1/1 Running 0 2m35s 10.244.2.31 k8snode
myapp-v1-8ff97699c-vvld2 1/1 Running 0 2m35s 10.244.1.21 k8snode2

#请求刚才创建的 pod 资源
[root@k8smaster node]# curl 10.244.2.31
background-color: blue;
[root@k8smaster node]# curl 10.244.1.21
background-color: blue;

#资源清单文件详细解读
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 #容器里的应用的端口

## Deployment 管理 pod:扩容、缩容、滚动更新、回滚



#通过 deployment 管理应用,实现扩容,把副本数变成 3
[root@k8smaster node]# vim deploy-demo.yaml
直接修改 replicas 数量,如下,变成 3
spec:
replicas: 3
修改之后保存退出,执行
[root@k8smaster node]# kubectl apply -f deploy-demo.yaml
注意:apply 不同于 create,apply 可以执行多次;create 执行一次,再执行就会报错复。
[root@k8smaster node]# kubectl get pods
显示如下:
[root@k8smaster node]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-646f8f7485-5xbpc 1/1 Running 0 16h
myapp-v1-646f8f7485-jksp9 1/1 Running 0 16h
myapp-v1-646f8f7485-ntbkx 1/1 Running 0 4s
#上面可以看到 pod 副本数变成了 3 个
#查看 myapp-v1 这个控制器的详细信息
[root@k8smaster node]# kubectl describe deploy myapp-v1
Name: myapp-v1
Namespace: default
CreationTimestamp: Mon, 11 Jul 2022 04:36:48 -0700
Labels:
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=myapp,version=v1
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=myapp
version=v1
Containers:
myapp:
Image: janakiramm/myapp:v1
Port: 80/TCP
Host Port: 0/TCP
Liveness: http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason


Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets:
NewReplicaSet: myapp-v1-646f8f7485 (3/3 replicas created)
Events:
Type Reason Age From Message


Normal ScalingReplicaSet 16h deployment-controller Scaled up replica set myapp-v1-8ff97699c to 2
Normal ScalingReplicaSet 16h deployment-controller Scaled up replica set myapp-v1-646f8f7485 to 1
Normal ScalingReplicaSet 16h deployment-controller Scaled down replica set myapp-v1-8ff97699c to 1
Normal ScalingReplicaSet 16h deployment-controller Scaled up replica set myapp-v1-646f8f7485 to 2
Normal ScalingReplicaSet 16h deployment-controller Scaled down replica set myapp-v1-8ff97699c to 0
Normal ScalingReplicaSet 26s deployment-controller Scaled up replica set myapp-v1-646f8f7485 to 3

#通过 deployment 管理应用,实现缩容,把副本数变成 2
[root@k8smaster node]# vim deploy-demo.yaml
直接修改 replicas 数量,如下,变成 2
spec:
replicas: 2
修改之后保存退出,执行
[root@k8smaster node]# kubectl apply -f deploy-demo.yaml
[root@k8smaster node]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-v1-646f8f7485-5xbpc 1/1 Running 0 16h
myapp-v1-646f8f7485-jksp9 1/1 Running 0 16h

#通过 deployment 管理应用,实现滚动更新
在一个终端窗口执行如下
[root@k8smaster node]# kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-v1-646f8f7485-5xbpc 1/1 Running 0 16h
myapp-v1-646f8f7485-jksp9 1/1 Running 0 16h

打开一个新的终端窗口更改镜像版本,按如下操作
[root@k8smaster node]# vim deploy-demo.yaml
把 image: janakiramm/myapp:v1 变成 image: janakiramm/myapp:v2 保存退出,执行
[root@k8smaster node]# kubectl apply -f deploy-demo.yaml
再回到刚才执行监测 kubectl get pods -l app=myapp -w 的那个窗口,可以看到信息如下
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 8 43h
myapp-v1-646f8f7485-5xbpc 1/1 Running 0 16h
myapp-v1-646f8f7485-jksp9 1/1 Running 0 16h
myapp-v1-68b9dcdb96-hwgkl 0/1 Pending 0 0s
myapp-v1-68b9dcdb96-hwgkl 0/1 Pending 0 0s
myapp-v1-68b9dcdb96-hwgkl 0/1 ContainerCreating 0 0s
myapp-v1-68b9dcdb96-hwgkl 1/1 Running 0 2s
myapp-v1-646f8f7485-5xbpc 1/1 Terminating 0 16h
myapp-v1-68b9dcdb96-lj5xl 0/1 Pending 0 0s
myapp-v1-68b9dcdb96-lj5xl 0/1 Pending 0 0s
myapp-v1-68b9dcdb96-lj5xl 0/1 ContainerCreating 0 0s
myapp-v1-646f8f7485-5xbpc 0/1 Terminating 0 16h
myapp-v1-68b9dcdb96-lj5xl 1/1 Running 0 1s
myapp-v1-646f8f7485-jksp9 1/1 Terminating 0 16h
myapp-v1-646f8f7485-jksp9 0/1 Terminating 0 16h
myapp-v1-646f8f7485-jksp9 0/1 Terminating 0 16h
myapp-v1-646f8f7485-jksp9 0/1 Terminating 0 16h
myapp-v1-646f8f7485-5xbpc 0/1 Terminating 0 16h
myapp-v1-646f8f7485-5xbpc 0/1 Terminating 0 16h

pending 表示正在进行调度,ContainerCreating 表示正在创建一个 pod,running 表示运行一个 pod,running 起来一个 pod 之后再 Terminating(停掉)一个 pod,以此类推,直到所有 pod 完成滚动升级,它是自动的,不用手动去删除!

在另外一个窗口执行
[root@k8smaster node]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-v1-646f8f7485 0 0 0 16h
myapp-v1-68b9dcdb96 2 2 2 52s

#上面可以看到 rs 有两个,上面那个是升级之前的,已经被停掉,但是可以随时回滚
#查看 myapp-v1 这个控制器的历史版本
[root@k8smaster node]# kubectl rollout history deployment myapp-v1
deployment.apps/myapp-v1
REVISION CHANGE-CAUSE
1
2
3

#回滚到指定版本
[root@k8smaster node]# kubectl rollout undo deployment myapp-v1 --to-revision=1
deployment.apps/myapp-v1 rolled back

[root@k8smaster node]# kubectl rollout history deployment myapp-v1
deployment.apps/myapp-v1
REVISION CHANGE-CAUSE
2
3
4


## 自定义滚动更新策略




![img](https://img-blog.csdnimg.cn/img_convert/f10b2157a30cfc12699f0cfd4e433733.png)
![img](https://img-blog.csdnimg.cn/img_convert/54dd2b41827cf23e9b7a4bc8508a82e4.png)
![img](https://img-blog.csdnimg.cn/img_convert/38f0dff407f4d3355ebf0b0e4860beb5.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>

自定义滚动更新策略

[外链图片转存中…(img-9KK2nhPF-1715708402082)]
[外链图片转存中…(img-4l07O3dP-1715708402083)]
[外链图片转存中…(img-tgrHWxv4-1715708402083)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐