CKA 006、CICD
This commit is contained in:
@ -13,19 +13,27 @@ p img {
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
p code {
|
||||
p>code {
|
||||
/*border: 1px solid #007af5;*/
|
||||
color: #c7254e !important;
|
||||
background-color: #f9f2f4;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
li code {
|
||||
li>code {
|
||||
color: #c7254e !important;
|
||||
background-color: #f9f2f4;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
.custom-block .custom-block-title {
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
.custom-block .custom-block-title~p {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.noselect {
|
||||
-moz-user-select: -moz-none;
|
||||
-moz-user-select: none;
|
||||
|
||||
BIN
guide/cicd/README.assets/image-20191127210025546.png
Normal file
BIN
guide/cicd/README.assets/image-20191127210025546.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 184 KiB |
BIN
guide/cicd/README.assets/image-20191127211528237.png
Normal file
BIN
guide/cicd/README.assets/image-20191127211528237.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
BIN
guide/cicd/README.assets/image-20191127212306366.png
Normal file
BIN
guide/cicd/README.assets/image-20191127212306366.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
BIN
guide/cicd/README.assets/image-20191127215923426.png
Normal file
BIN
guide/cicd/README.assets/image-20191127215923426.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
BIN
guide/cicd/README.assets/image-20191127220528541.png
Normal file
BIN
guide/cicd/README.assets/image-20191127220528541.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
@ -11,4 +11,93 @@ meta:
|
||||
|
||||
<AdSenseTitle/>
|
||||
|
||||
文档建设中...
|
||||
下图展示了当前比较典型的持续构建集成的一种做法。
|
||||
|
||||
<p>
|
||||
<img src="./README.assets/image-20191127210025546.png" alt="Kubernetes教程_CI/CD集成典型做法" style="padding: 10px;"/>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
在是否自动将最新版本部署到 Kubernetes 环境这个问题上,可能会有多种做法。
|
||||
|
||||
|
||||
|
||||
## 手工触发
|
||||
|
||||
当容器镜像推送到 docker registry 中之后,手工触发是否更新 Kubernetes 环境中的容器镜像。这样做的主要理由是:
|
||||
* 提交代码以及构建镜像的操作频次太高,如果每次都自动触发测试环境的部署,会使得环境总是处于一种不稳定的状态
|
||||
* 微服务环境中,部署单元比较多,开发团队可能要求将两个或者更多相互依赖的部署单元(微服务)一起更新
|
||||
|
||||
<p>
|
||||
<img src="./README.assets/image-20191127211528237.png" alt="Kubernetes教程_CI/CD集成_手工触发" style="padding: 10px;"/>
|
||||
</p>
|
||||
|
||||
如果使用手工触发,在使用 Kuboard 管理 Kubernetes 的情况下,只需要熟悉 Kuboard / Kubernetes 以下几个功能即可轻松完成 CI/CD:
|
||||
|
||||
* [使用私有仓库中的 docker 镜像](/learning/k8s-intermediate/private-registry.html)
|
||||
* [批量调整镜像版本](/guide/namespace/adjustion.html#批量调整镜像版本) 可以一次性更新多个容器的镜像版本
|
||||
* 假设在标签不变的情况下,对应的容器镜像已经更新,[批量删除容器组](/guide/namespace/adjustion.html#批量删除容器组) 可以在 [imagePullPolicy=Always](/learning/k8s-intermediate/container/images.html#更新镜像) 的情况下更新 Pod 的容器镜像
|
||||
|
||||
|
||||
|
||||
## 自动触发
|
||||
|
||||
当容器镜像推送到 docker registry 中之后,自动触发是否更新 Kubernetes 环境中的容器镜像。这样做的主要理由是:
|
||||
* 更完全的自动化,将手工操作降到最低
|
||||
|
||||
<p>
|
||||
<img src="./README.assets/image-20191127212306366.png" alt="Kubernetes教程_CI/CD集成_自动触发" style="padding: 10px;"/>
|
||||
</p>
|
||||
|
||||
为了支持这种做法,Kuboard 在工作负载界面中提供了 CI/CD 脚本(需更新到 Kuboard v1.0.5-beta.2 以上),如下图所示:
|
||||
|
||||
|
||||

|
||||
|
||||
点击工作负载界面上方的 ***CI/CD集成*** 按钮,将在如下界面中显示两段脚本
|
||||
|
||||

|
||||
|
||||
### 更新镜像版本
|
||||
|
||||
通过更新镜像版本的脚本,可以直接在 shell 脚本中调用 Kuboard/Kubernetes API,更新对应容器镜像的标签。完成此接口调用后,Kubernetes 将自动完成滚动更新。
|
||||
|
||||
界面中提供的脚本里,容器的版本是当前 Kubernetes 中已部署的版本,通常在 Jenkins/GitlabRunner 之类的工具里,需要将该脚本的镜像标签参数化。如下所示:
|
||||
|
||||
```sh {5}
|
||||
export BUSY_BOX_TAG=1.29
|
||||
curl -X PATCH \
|
||||
-H "content-type: application/strategic-merge-patch+json" \
|
||||
-H "Authorization:Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcTlnemsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmQyZWRkOTAtODU2Zi00MDA2LThjNTYtOTBmNjI0MzVkZGI2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.hGeV_w3ouydhPAEGYAXMO646-97alroek00JbM4wSIUqM64rd30WAHQLKH2OsD3DR9zg3syXhCvVIgGu_ErMpaLIWFRiAJbOXJiaB0w7Haod-gc-dpL3ABz_IBqCJf5dOP-PDKHhgAEbjEl6b7-0HPTdwHFI0MHRwF0hoUbW8BpUHCzV_UlX5CqQ7Yz51pNivXkC40x2vng6Nx7MVz8enSH_9IoGdddBhkOSdhJgUkh-drWvXFe2ayGZv1mJRZSe-sXdyQFWpPh1W0nRR_CuIEA5I7eiWlIMYuZT5-llQvEjzXg2SqGGHqcqGr2DQnoIdI24Gwnyz1THYjC4pgKPlQ" \
|
||||
-d '{"spec":{"template":{"spec":{"containers":[{"name":"busybox","image":"busybox:'$BUSY_BOX_TAG'"}]}}}}' \
|
||||
"http://kuboard.demo.eip.work:/k8s-api/apis/apps/v1/namespaces/example/deployments/web-busybox"
|
||||
```
|
||||
|
||||
::: tip 参数化
|
||||
例子中,
|
||||
* 脚本中添加了 `export BUSY_BOX_TAG=1.29` 语句
|
||||
* 参数化时,对变量使用单引号,如上例中,将界面中直接复制下来的脚本中 `"image":"busybox:1.28"` 修改为 `"image":"busybox:'$BUSY_BOX_TAG'"`
|
||||
:::
|
||||
|
||||
### 删除Pod
|
||||
|
||||
假设在标签不变的情况下,对应的容器镜像已经更新,执行 `删除Pod的脚本` 可以在 [imagePullPolicy=Always](/learning/k8s-intermediate/container/images.html#更新镜像) 的情况下更新 Pod 的容器镜像。
|
||||
|
||||
例如:
|
||||
|
||||
``` sh
|
||||
curl -X DELETE \
|
||||
-H "Content-Type: application/yaml" \
|
||||
-H "Authorization:Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcTlnemsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmQyZWRkOTAtODU2Zi00MDA2LThjNTYtOTBmNjI0MzVkZGI2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.hGeV_w3ouydhPAEGYAXMO646-97alroek00JbM4wSIUqM64rd30WAHQLKH2OsD3DR9zg3syXhCvVIgGu_ErMpaLIWFRiAJbOXJiaB0w7Haod-gc-dpL3ABz_IBqCJf5dOP-PDKHhgAEbjEl6b7-0HPTdwHFI0MHRwF0hoUbW8BpUHCzV_UlX5CqQ7Yz51pNivXkC40x2vng6Nx7MVz8enSH_9IoGdddBhkOSdhJgUkh-drWvXFe2ayGZv1mJRZSe-sXdyQFWpPh1W0nRR_CuIEA5I7eiWlIMYuZT5-llQvEjzXg2SqGGHqcqGr2DQnoIdI24Gwnyz1THYjC4pgKPlQ" \
|
||||
"http://kuboard.demo.eip.work:/k8s-api/api/v1/namespaces/example/pods?labelSelector=k8s.eip.work/layer%3dweb,k8s.eip.work/name%3dweb-busybox"
|
||||
```
|
||||
|
||||
|
||||
::: tip YAML文件在哪儿?
|
||||
|
||||
* Kuboard 的设计目标是,不使用 YAML 文件,就可以轻松完成 Kubernetes 部署。
|
||||
* 当您需要 [复制一个新的环境](/guide/namespace/multi-env.html) 时,从已有名称空间导出 YAML 文件,再到新的名称空间或 Kubernetes 集群导入
|
||||
* 将导出的 YAML 文件备份到 git,可以使部署的脚本版本化
|
||||
|
||||
:::
|
||||
|
||||
@ -21,7 +21,7 @@ meta:
|
||||
:::
|
||||
|
||||
|
||||
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题003')">答案及解析</b-button>
|
||||
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题004')">答案及解析</b-button>
|
||||
<b-collapse id="collapse-join-error" class="mt-2">
|
||||
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ meta:
|
||||
|
||||
:::
|
||||
|
||||
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题003')">答案及解析</b-button>
|
||||
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题005')">答案及解析</b-button>
|
||||
<b-collapse id="collapse-join-error" class="mt-2">
|
||||
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
|
||||
|
||||
|
||||
201
t/cka/daily/006.md
Normal file
201
t/cka/daily/006.md
Normal file
@ -0,0 +1,201 @@
|
||||
---
|
||||
vssueId: 170
|
||||
# layout: StepLayout
|
||||
sharingTitle: CKA备考打卡 - 每日一题 - Day 6
|
||||
description: CKA备考打卡 - 每日一题 - Day 6
|
||||
meta:
|
||||
- name: keywords
|
||||
content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator
|
||||
---
|
||||
|
||||
# CKA每日一题 --- Day 6
|
||||
|
||||
<AdSenseTitle/>
|
||||
|
||||
::: tip 考题
|
||||
|
||||
通过命令行,创建1个deployment,副本数为3,镜像为 `nginx:latest`。然后滚动升 级到 `nginx:1.9.1`,再回滚到原来的版本
|
||||
|
||||
要求:Deployment的名称为cka-1125,贴出用到的相关命令。
|
||||
|
||||
最好附带创建的Deployment完整yaml,以及和升级回滚有关的命令。
|
||||
|
||||
:::
|
||||
|
||||
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题006')">答案及解析</b-button>
|
||||
<b-collapse id="collapse-join-error" class="mt-2">
|
||||
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
|
||||
|
||||
|
||||
|
||||
## 答案
|
||||
|
||||
先创建deployment,可以用命令创建:
|
||||
|
||||
```
|
||||
kubectl run cka-1125 --image=nginx --replicas=3
|
||||
```
|
||||
|
||||
也可以用以下yaml:cka-1125.yaml创建
|
||||
|
||||
```
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: cka-1125
|
||||
name: cka-1125
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cka-1125
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cka-1125
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx
|
||||
name: cka-1125
|
||||
```
|
||||
|
||||
创建:
|
||||
|
||||
```
|
||||
kubectl apply -f cka-1125.yaml
|
||||
```
|
||||
|
||||
升级:
|
||||
|
||||
```
|
||||
kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record
|
||||
deployment.extensions/cka-1125 image updated
|
||||
```
|
||||
|
||||
回滚:
|
||||
|
||||
```
|
||||
# 回滚到上一个版本
|
||||
kubectl rollout undo deploy/cka-1125
|
||||
# 回滚到指定版本
|
||||
kubectl rollout undo deploy/cka-1125 --to-revision=2
|
||||
```
|
||||
|
||||
## 解析
|
||||
|
||||
**官方中set image命令:**
|
||||
[https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#set](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#set)
|
||||
|
||||
### set image命令
|
||||
|
||||
set image命令格式如下:
|
||||
|
||||
```
|
||||
kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N [--record]
|
||||
```
|
||||
|
||||
--record指定,在annotation中记录当前的kubectl命令。如果设置为false,则不记录命令。如果设置为true,则记录命令。默认为false。
|
||||
|
||||
```
|
||||
[root@liabio test]# kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record
|
||||
deployment.extensions/cka-1125 image updated
|
||||
[root@liabio test]#
|
||||
[root@liabio test]# kubectl rollout history deploy/cka-1125
|
||||
deployment.extensions/cka-1125
|
||||
REVISION CHANGE-CAUSE
|
||||
3 <none>
|
||||
4 kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record=true
|
||||
```
|
||||
|
||||
像上面这样,CHANGE-CAUSE中会有升级命令。
|
||||
|
||||
`set image`命令可以对:`pod (po), replicationcontroller (rc), deployment (deploy), daemonset (ds), replicaset (rs),statefulset(sts)`进行操作。
|
||||
|
||||
### roll命令
|
||||
|
||||
**roll命令官方文档:**
|
||||
[https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout)
|
||||
|
||||
可以管理`deployments、daemonsets、statefulsets`资源的回滚:
|
||||
|
||||
查询升级历史:
|
||||
|
||||
```
|
||||
[root@liabio test]# kubectl rollout history deploy/cka-1125
|
||||
deployment.extensions/cka-1125
|
||||
REVISION CHANGE-CAUSE
|
||||
1 <none>
|
||||
2 <none>
|
||||
```
|
||||
|
||||
查看指定版本的详细信息:
|
||||
|
||||
```
|
||||
kubectl rollout history deploy/cka-1125 --revision=3 -o=yaml
|
||||
```
|
||||
|
||||
回滚到上一个版本:
|
||||
|
||||
```
|
||||
[root@liabio test]# kubectl rollout undo deploy/cka-1125
|
||||
deployment.extensions/cka-1125 rolled back
|
||||
```
|
||||
|
||||
或者回滚到指定版本:
|
||||
|
||||
```
|
||||
[root@liabio test]# kubectl rollout undo deploy/cka-1125 --to-revision=3
|
||||
deployment.extensions/cka-1125 rolled back
|
||||
```
|
||||
|
||||
### 其他roll子命令
|
||||
|
||||
restart:资源将重新启动;
|
||||
status:展示回滚状态;
|
||||
resume:恢复被暂停的资源。控制器不会控制被暂停的资源。通过恢复资源,可以让控制器再次控制。resume仅对deployment支持。
|
||||
pause:控制器不会控制被暂停的资源。使用`kubectl rollout resume`来恢复暂停的资源。当前,只有deployment支持被暂停。
|
||||
|
||||
### 滚动更新策略
|
||||
|
||||
**滚动更新官网文档:**
|
||||
[https://kubernetes.io/docs/concepts/workloads/controllers/deployment/](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
|
||||
|
||||
中文文档: [滚动更新](/learning/k8s-intermediate/workload/wl-deployment/update.html)
|
||||
|
||||
```
|
||||
minReadySeconds: 5
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
maxSurge: 1
|
||||
maxUnavailable: 1
|
||||
```
|
||||
|
||||
**minReadySeconds**
|
||||
Kubernetes在等待设置的时间后才进行升级
|
||||
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
|
||||
如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
|
||||
|
||||
**maxSurge**
|
||||
|
||||
控制滚动更新过程中副本总数超过DESIRED的上限。maxSurge可以是具体的整数,也可以是百分比,向上取整。maxSurge默认值为25%。
|
||||
|
||||
例如DESIRED为10,那么副本总数的最大值为roundUp(10 + 10*25%)=13,所以CURRENT为13。
|
||||
|
||||
**maxUnavaible**
|
||||
控制滚动更新过程中,不可用副本占DESIRED的最大比例。maxUnavailable可以是具体的整数,也可以是百分之百,向下取整。默认值为25%。
|
||||
|
||||
例如DESIRED为10,那么可用的副本数至少要为 `10-roundDown(10*25%)=8`所以AVAILABLE为8。
|
||||
|
||||
**maxSurge越大,初始创建的新副本数量就越多;maxUnavailable越大,初始销毁的旧副本数目就越多。**
|
||||
|
||||
|
||||
|
||||
</b-card>
|
||||
</b-collapse>
|
||||
|
||||
> CKA 考试每日一题系列,全部内容由 [我的小碗汤](https://mp.weixin.qq.com/s/5tYgb_eSzHz_TMsi0U32gw) 创作,本站仅做转载
|
||||
|
||||
|
||||
<JoinCKACommunity/>
|
||||
Reference in New Issue
Block a user