什么是Deployment
K8S的Deployment是一种用于管理Pod副本的控制器,它通过管理ReplicaSet来间接管理Pod。
以下是关于K8S Deployment的一些关键点:
- 间接管理:Deployment不直接管理Pod,而是通过ReplicaSet来实现对Pod的管理。
- 版本控制:支持滚动更新和版本回退,使得应用部署更加灵活和可控。
- 扩展性强:Deployment提供了比ReplicaSet更强大的功能,包括扩容、缩容、暂停和继续部署等操作。
- 资源文件:Deployment的资源清单文件通常定义了应用的版本号、类型等信息,是声明式配置的一部分。
- 创建流程:用户通过kubectl命令创建Deployment,Deployment再创建ReplicaSet,最后由ReplicaSet创建Pod。
- 通信机制:Pod中的容器能够通过localhost互相通信,因为它们运行在同一台服务器中并共享资源。
我们先看一下Deployment在K8S集群中的位置:
Deployment并不直接操作Pod,而是使用ReplicaSet这种资源来控制Pod,它也正是通过ReplicaSet实现了水平拓展、滚动更新,只不过ReplicaSet属于内部资源,我们一般情况下不需要直接操作。ReplicaSet给Deployment做一些“跑腿”的工作。
Deployment资源对象介绍
接下来给出一个K8S中通过Deployment创建应用的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-app-deployment
spec:
replicas: 3 #副本数
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 设置在滚动更新中可以额外创建的Pod的最大数量
maxUnavailable: 1 # 设置在滚动更新中允许不可用的Pod的最大数量
selector: #以此筛选所控制的pod
matchLabels:
app: your-app
template: #以下内容为pod模版
metadata:
labels: #以此匹配deployment
app: your-app
spec:
initContainers: #初始化容器
- name: init-container
image: your-registry/init-container:latest
# 在这里可以定义初始化容器的其他配置,如环境变量、卷挂载等
containers: #正式的应用容器
- name: your-app
image: your-registry/your-app:latest
ports:
- containerPort: 80
# 在这里可以定义主应用容器的其他配置,如环境变量、卷挂载等
imagePullPolicy: Always # 设置镜像拉取策略为始终拉取最新镜像
livenessProbe: #存活探针
httpGet:
path: /healthz # 替换成你的应用提供的 liveness 探针路径
port: 80
initialDelaySeconds: 3
periodSeconds: 5
readinessProbe: #可读探针
httpGet:
path: /readiness # 替换成你的应用提供的 readiness 探针路径
port: 80
initialDelaySeconds: 5
periodSeconds: 5
在这个示例中:
- strategy 部分定义了滚动更新策略,其中 maxSurge 控制在滚动更新中可以额外创建的 Pod 的最大数量
- maxUnavailable 控制在滚动更新中不可用的 Pod 的最大数量,这可以确保在更新过程中始终保持一定数量的可用 Pod
- imagePullPolicy: Always 部分设置了镜像拉取策略为始终拉取最新镜像。这表示每次启动 Pod 时,都会拉取最新的镜像,这个值也可以设置为 IfNotPresent 或 Never。
滚动更新
当Deployment中的Pod模板更新(如镜像更新)之后会发生什么呢?相信你已经知道,会发生滚动更新,而strategy部分定义了更新的策略。但是这个过程中具体是怎么做的呢?请看下图:
Kubernetes会创建了一个新版本的ReplicaSet(基于新镜像的Pod),此时就有两个ReplicaSet了:一个是基于旧镜像的Pod,一个是基于新镜像的Pod。之后新版本的ReplicaSet每启动一个新的Pod,旧版本的ReplicaSet就会删除一个旧的Pod,直到全部更新完成。这就在服务不停止的状态下实现了一次平滑的滚动更新。
滚动更新完成之后,旧版本的ReplicaSet将会暂停并且它已经不再管理任何Pod,但是它仍然保留了所有的配置信息,这使得我们轻松地可以将服务回滚到之前的版本。
水平扩容/缩容
如何实现水平扩缩容呢,比如我们想将副本数设置为5,相信聪明如你,已经知道,只需要修改replicas对应的值,我们可以更改your-app-deployment.yaml
文件中的replicas
的值,然后重新执行 kubectl apply -f your-app-deployment.yaml
命令,也可以直接更改Deployment资源示例,命令如下:
kubectl scale deployment your-app-deployment --replicas=5 -n yournamespaces
这个时候,会发生什么呢?相信你已经猜到了,Deployment 所对应的ReplicaSet,就会根据修改后的replicas值自动创建2个新的 Pod,这也就是所谓的水平拓展,同理,如果我们想水平缩容,只需要将replicas的值缩减即可。
回滚
当我们进行回滚操作时,可以使用以下命令来查看历史版本列表信息:
kubectl rollout history deployment your-deplyment-name -n yournamespaces
然后通过以下命令来查看某个版本的详细信息:
kubectl rollout history deployment your-deplyment-name --revisinotallow=revisionnumber -n yournamespaces
最后,如果我们想回滚到某个版本,可以使用以下命令进行回滚:
kubectl rollout undo deployment your-deplyment-name --to- revisinotallow=revisionnumber -n your
CKA真题
真题截图
中文解析
切换 k8s 集群环境:kubectl config use-context k8s
Task
将loadbalancer
的 deployment 管理的 Pod 的副本数扩容成 6 个。
参考文档
Deployments
解题作答
- 切换集群环境
kubectl config use-context k8s
- 检查现有的Pod数量
kubectl get deploy loadbalancer -o wide
- 扩容
loadbalancer
的 deployment 管理的 Pod 的副本数扩容成 6 个
kubelct scale deploy loadbalancer --replicas=6
- 检查Pod的数量
kubectl get pod