Files
kuboard-press/learning/k8s-intermediate/workload/wl-deployment/create.md
huanqing.shao 1b69a42777 vssue
2019-09-22 21:56:32 +08:00

141 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 34
layout: LearningLayout
description: 本文描述了如何创建一个 Deployment如何理解 Deployment 各个字段,以及如何查看 Deployment 的创建结果
---
# 创建 Deployment
[返回 Deployment](./#deployment-概述)
本文描述了如何创建一个 Deployment如何理解 Deployment 各个字段,以及如何查看 Deployment 的创建结果。
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 创建 Deployment">
下面的 yaml 文件定义了一个 Deployment该 Deployment 将创建一个有 3 个 nginx Pod 副本的 ReplicaSet副本集
``` yaml
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**
1. 执行命令以创建 Deployment
``` sh
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
```
::: tip
您可以为该命令增加 --record 选项,此时 kubectl 会将 `kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml --record` 写入 Deployment 的 annotation注解 `kubernetes.io/change-cause` 中。这样,您在将来就可以回顾某一个 Deployment 版本变化的原因
:::
2. 执行命令 `kubectl get deployments` 检查 Deployment 的创建情况。如果该 Deployment仍在创建过程中输出结果如下所示
``` sh
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 0 0 0 1s
```
**字段含义**
| 字段名称 | 说明 |
| -------------- | ------------------------------------------------------------ |
| **NAME** | Deployment name |
| **DESIRED** | Deployment 期望的 Pod 副本数,即 Deployment 中 `.spec.replicas` 字段指定的数值。该数值是“期望”值 |
| **CURRENT** | 当前有多少个 Pod 副本数在运行 |
| **UP-TO-DATE** | Deployment 中,符合当前 Pod Template 定义的 Pod 数量 |
| **AVAILABLE** | 当前对用户可用的 Pod 副本数 |
| **AGE** | Deployment 部署以来到现在的时长 |
3. 查看 Deployment 的发布状态rollout status执行命令 `kubectl rollout status deployment.v1.apps/nginx-deployment`。输出结果树下所示:
```sh
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.apps/nginx-deployment successfully rolled out
```
4. 等待几秒后,再次执行命令 `kubectl get deployments`,输出结果如下所示:
```sh
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 18s
```
此时该 Deployment 已经完成了 3 个 Pod 副本的创建,并且所有的副本都是 UP-TO-DATE符合最新的 Pod template 定义) 和 AVAILABEL
5. 查看该 Deployment 创建的 ReplicaSetrs执行命令 `kubectl get rs`,输出结果如下所示:
``` sh
NAME DESIRED CURRENT READY AGE
nginx-deployment-75675f5897 3 3 3 18s
```
6. 查看 Pod 的标签,执行命令 `kubectl get pods --show-labels`,输出结果如下所示:
```sh
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。
::: tip
您必须为 Deployment 中的 `.spec.selector` 和 `.template.metadata.labels` 定义一个合适的标签(这个例子中的标签是 app: nginx。请不要使用与任何其他控制器其他 Deployment / StatefulSet 等)相同的 `.spec.selector` 和 `.template.metadata.labels`。否则可能发生冲突,并产生不可预见的行为。
:::
**Pod-template-hash 标签**
::: danger 警告
请不要修改这个标签
:::
pod-template-hash 标签时 Deployment 创建 ReplicaSet 时添加到 ReplicaSet 上的ReplicaSet 进而将此标签添加到 Pod 上。这个标签用于区分 Deployment 中哪个 ReplicaSet 创建了哪些 Pod。该标签的值是 `.spec.template` 的 hash 值。
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 创建 Deployment">
正在撰写
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)