【云原生 从零开始学Kubernetes】十六、k8s核心技术-Deployment深入使用_deployment 替换entrypoint

img
img
img

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

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

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

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


## 自定义滚动更新策略


maxSurge 和 maxUnavailable 用来控制滚动更新的更新策略


取值范围


数值


1.maxUnavailable: [0, 副本数]


2.maxSurge: [0, 副本数] 注意:两者不能同时为 0。


比例


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


2.maxSurge: [0%, 100%] 向上取整,比如 10 个副本,5%的话==0.5 个,但计算按照 1 个。 注意:两者不能同时为 0。


建议配置


1.maxUnavailable == 0


2.maxSurge == 1


这是我们生产环境提供给用户的默认配置。即“一上一下,先上后下”最平滑原则:


一个新版本 pod ready(结合 readiness)后,才销毁旧版本 pod。此配置适用场景是平滑更新、保证服务平稳,但也有缺点,就是太慢了。


总结:


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


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



自定义策略:
修改更新策略:maxUnavailable=1,maxSurge=1
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
spec:
replicas: 2
selector:
matchLabels:
app: myapp
version: v1
strategy: #从这里开始就是新的策略 同时更新一下镜像版本 不然不会更新
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
maxunava默认就行了,防止有两个pod才能提供服务的时候挂一个出问题
查看 myapp-v1 这个控制器的详细信息
[root@k8smaster node]# kubectl describe deployment myapp-v1
Name: myapp-v1
Namespace: default
CreationTimestamp: Mon, 11 Jul 2022 04:36:48 -0700
Labels:
Annotations: deployment.kubernetes.io/revision: 5
Selector: app=myapp,version=v1
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge

上面可以看到 RollingUpdateStrategy: 1 max unavailable, 1 max surge
这个 rollingUpdate 更新策略变成了刚才设定的,因为我们设定的 pod 副本数是 2,1 和 1 表示最少不能少于 1 个 pod,最多不能超过 3 个 pod 这个就是通过控制 RollingUpdateStrategy 这个字段来设置滚动更新策略的.


## Deployment 资源清单详解



apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-tpp
namespace: ms
spec:
replicas: 1
selector:
matchLabels:
project: ms
app: portal
template:
metadata:
labels:
project: ms
app: portal
spec:
containers:
- name: portal
image: tomcat
imagePullPolicy: Always
ports:
- protocol: TCP
containerPort: 8080
resources: #资源配额 如果超过会被重启 根据项目实际修改
limits: #资源限制,最多可用的 cpu 和内存
cpu: 1
memory: 1Gi
requests: #最少需要多少资源才可以运行 Pod
cpu: 0.5
memory: 1Gi
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 60
periodSeconds: 10

livenessProbe: #存活性探测
#用于判断容器是否存活,即 Pod 是否为 running 状态,如果 LivenessProbe 探针探测到容器不健康,则kubelet 将 kill 掉容器,并根据容器的重启策略是否重启。如果一个容器不包含 LivenessProbe 探针,则 Kubelet 认为容器的 LivenessProbe 探针的返回值永远成功。
tcpSocket:
port: 8080 #检测 8080 端口是否存在
initialDelaySeconds: 60 #Pod 启动 60s 执行第一次检查
periodSeconds: 10 #第一次检查后每隔 10s 检查一次
readinessProbe: #就绪性探测
有时候应用程序可能暂时无法接受请求,比如 Pod 已经 Running 了,但是容器内应用程序尚未启动成功,在这种情况下,如果没有 ReadinessProbe,则 Kubernetes 认为它可以处理请求了,然而此时,我们知道程序还没启动成功是不能接收用户请求的,所以不希望 kubernetes 把请求调度给它,则使用ReadinessProbe 探针。

ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同,ReadinessProbe 是将 Pod IP:Port 从对应的 EndPoint 列表中删除,而 livenessProbe 则 Kill 容器并根据 Pod 的重启策略来决定作出对应的措施。

ReadinessProbe 探针探测容器是否已准备就绪,如果未准备就绪则 kubernetes 不会将流量转发给此Pod。
tcpSocket:
port: 8080

img
img
img

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

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

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

来决定作出对应的措施。

ReadinessProbe 探针探测容器是否已准备就绪,如果未准备就绪则 kubernetes 不会将流量转发给此Pod。
tcpSocket:
port: 8080

[外链图片转存中…(img-2fhkxRnI-1715708438113)]
[外链图片转存中…(img-A0qiP3aM-1715708438113)]
[外链图片转存中…(img-YyAe79pC-1715708438113)]

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

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

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

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值