📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。
📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看
📙Java并发编程系列,设计模式系列、go web开发框架 系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!
介绍 Deployment
Pod 容器组
Pod 容器组是 Kubernetes 中最小的调度单元,更多信息请参考 容器组 - 概述
ReplicaSet 副本集
ReplicaSet 副本集的用途是为指定的 Pod 维护一个副本(实例)数量稳定的集合。下面是一个定义 ReplicaSet 副本集的 yaml 文件:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
ReplicaSet 副本集的主要几个字段有:
- selector 确定哪些 Pod 属于该副本集
- replicas 副本集应该维护几个 Pod 副本(实例)
- template Pod 的定义
副本集将通过创建、删除 Pod 容器组来确保符合 selector 选择器的 Pod 数量等于 replicas 指定的数量。当符合 selector 选择器的 Pod 数量不够时,副本集通过使用 template 中的定义来创建 Pod。
在 Kubernetes 中,并不建议您直接使用 ReplicaSet,推荐使用 Deployment,由 Deployment 创建和管理 ReplicaSet.
Deployment 概述
Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。
以“声明”的方式管理 Pod 和 ReplicaSet,其本质是将一些特定场景的一系列运维步骤固化下来,以便快速准确无误的执行。Deployment 为我们确定了如下几种运维场景:
- 创建Deployment 创建 Deployment 后,Deployment 控制器将立刻创建一个 ReplicaSet 副本集,并由 ReplicaSet 创建所需要的 Pod。
- 更新Deployment 更新 Deployment 中 Pod 的定义(例如,发布新版本的容器镜像)。此时 Deployment 控制器将为该 Deployment 创建一个新的 ReplicaSet 副本集,并且逐步在新的副本集中创建 Pod,在旧的副本集中删除 Pod,以达到滚动更新的效果。
- 回滚Deployment 回滚到一个早期 Deployment 版本。
- 伸缩Deployment 水平扩展 Deployment,以便支持更大的负载,或者水平- 收缩 Deployment,以便节省服务器资源。
- 暂停和继续Deployment
- 查看Deployment状态
- 清理策略
- 金丝雀发布
创建 Deployment
下面的 yaml 文件定义了一个 Deployment,该 Deployment 将创建一个有 3 个 nginx Pod 副本的 ReplicaSet(副本集):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
在这个例子中:
- 将创建一个名为 nginx-deployment 的 Deployment(部署),名称由 .metadata.name 字段指定
- 该 Deployment 将创建 3 个 Pod 副本,副本数量由 .spec.replicas 字段指定
- .spec.selector 字段指定了 Deployment 如何找到由它管理的 Pod。此案例中,我们使用了 Pod template 中定义的一个标签(app: nginx)。对于极少数的情况,这个字段也可以定义更加复杂的规则
- .template 字段包含了如下字段:
- .template.metadata.labels 字段,指定了 Pod 的标签(app: nginx)
- .template.spec.containers[].image 字段,表明该 Pod 运行一个容器 nginx:1.7.9
- .template.spec.containers[].name 字段,表明该容器的名字是 nginx
执行命令以创建 Deployment
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
字段含义
字段名称 | 说明 |
---|---|
NAME | Deployment name |
DESIRED | Deployment 期望的 Pod 副本数,即 Deployment 中 .spec.replicas 字段指定的数值。该数值是“期望”值 |
CURRENT | 当前有多少个 Pod 副本数在运行 |
UP-TO-DATE | Deployment 中,符合当前 Pod Template 定义的 Pod 数量 |
AVAILABLE | 当前对用户可用的 Pod 副本数 |
AGE | Deployment 部署以来到现在的时长 |
- 查看 Deployment 的发布状态(rollout status),执行命令 kubectl rollout status deployment.v1.apps/nginx-deployment。输出结果树下所示:
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.apps/nginx-deployment successfully rolled out
- 等待几秒后,再次执行命令 kubectl get deployments,输出结果如下所示:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 18s
此时该 Deployment 已经完成了 3 个 Pod 副本的创建,并且所有的副本都是 UP-TO-DATE(符合最新的 Pod template 定义) 和 AVAILABEL
- 查看该 Deployment 创建的 ReplicaSet(rs),执行命令 kubectl get rs,输出结果如下所示:
NAME DESIRED CURRENT READY AGE
nginx-deployment-75675f5897 3 3 3 18s
- 查看 Pod 的标签,执行命令 kubectl get pods --show-labels,输出结果如下所示:
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
Deployment 创建的 ReplicaSet(副本集)确保集群中有 3 个 nginx Pod。