[TOC]
> 1. k8s提供五種控制器Deployment、DaemonSet、StatefulSet、Job和Cronjob
> 2. 控制器可以保證pod的副本數,保證服務的運行,也可以平滑升級容器版本如Deployment
# 1. Deployment
## 1.1 基礎概念
> 1. Deployment是一種控制器資源,控制pod和ReplicaSet,通過控制replicaSet間接完成對pod的期望控制
> 2. Deployment用來取代老的ReplicationController
> 3. Deployment可以
## 1.2 功能
1. Deployment用來創建ReplicaSet,ReplicaSet創建pod,也可以不用Deployment,直接用ReplicaSet直接創建Pod
2. 滾動升級和回滾`->`不影響服務正常運行
3. 擴縮容
4. 啟動、停止和刪除Deployment
## 1.3 功能實踐
### 1.3.1 通過ReplicaSet創建pod
**1. ReplicaSet創建**
```
apiVersion: apps/v1
kind: ReplicaSet
metadata: # RS 元素信息
name: rsnginx # RS 名稱
labels: # 自定義標簽
app: test # RS 標簽
tier: nginx # RS 標簽
spec:
replicas: 3 # Pod 副本數
selector: # 選擇標簽
matchLabels: # 匹配標簽
tier: ng-pod # 匹配 frontend 標簽
template: # Pod 模板
metadata: # Pod 元素信息
labels: # 自定義標簽
tier: ng-pod # 標簽 frontend
spec:
containers:
- name: mynginx # 容器名稱
image: nginx:1.14.0 # 鏡像地址
```
**2. 利用文件創建**
`kubectl apply -f rs_nginx.yaml`
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6876dc68c9 3 3 1 41h
rsnginx 3 3 3 95s
```
> pod名稱 = Deployment名稱-ReplicaSet名稱-隨機字母
```
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 3 4d14h run=nginx
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx2 1/1 Running 2 2d18h run=nginx2
rsnginx-fj6hg 1/1 Running 0 7m20s tier=ng-pod
rsnginx-j6djf 1/1 Running 0 7m20s tier=ng-pod
rsnginx-thpmb 1/1 Running 0 7m20s tier=ng-pod
```
**3. 修改pod標簽**
```
[root@master ~]# kubectl label pod rsnginx-j6djf tier=ng-podbak --overwrite
pod/rsnginx-j6djf labeled
[root@master ~]#
[root@master ~]#
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 3 4d14h run=nginx
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h app=nginx,pod-template-hash=6876dc68c9
nginx2 1/1 Running 2 2d18h run=nginx2
rsnginx-fj6hg 1/1 Running 0 9m6s tier=ng-pod
rsnginx-hlqlc 1/1 Running 0 3s tier=ng-pod
rsnginx-j6djf 1/1 Running 0 9m6s tier=ng-podbak
rsnginx-thpmb 1/1 Running 0 9m6s tier=ng-pod
```
因為rs或Deployment根據標簽Label識別pod
修改標簽后,相當于pod少了一個,rs維持了pod的副本數,又增加了一個pod
但是ReplicaSet不能滾動升級
### 1.3.2 通過Deployment創建pod
deployment 不寫 matchLabels:
app: nginx
**1. yaml配置文件**
```
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.0
name: nginx
tolerations:
- key: "disktype"
operator: "Equal"
value: "ssd"
effect: "NoExecute"
```
**2. 通過yaml文件創建pod**
`kubectl apply -f nginx-dp.yaml`
注意名稱的變化
**3. 擴縮容**
--replicas=4,改變數量達到擴縮容
```
[root@master ~]# kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
[root@master ~]#
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 3 4d14h
nginx-deployment-6876dc68c9-67hdm 0/1 ContainerCreating 0 13s
nginx-deployment-6876dc68c9-gpjjv 1/1 Running 1 41h
nginx-deployment-6876dc68c9-j7vhl 0/1 Completed 0 41h
nginx-deployment-6876dc68c9-sdcdx 0/1 Completed 0 41h
```
**4. 更新鏡像**
【格式】:kubectl set image Deployment名稱 容器名稱=鏡像
`kubectl set image deployment/nginx-deployment nginx=nginx:latest`
原來的rs被停止
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 3 3 3 21s
nginx-deployment-6876dc68c9 0 0 0 14m
```
**5.回滾鏡像**
【格式】`kubectl rollout undo [Deployment名稱]`
```
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 2 2 2 5m4s
nginx-deployment-6876dc68c9 2 2 1 19m
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 1 1 1 5m6s
nginx-deployment-6876dc68c9 3 3 2 19m
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-65875d475b 0 0 0 5m8s
nginx-deployment-6876dc68c9 3 3 3 19m
```
如上,鏡像變更沒有使得原來的rs(ReplicaSet)全部停止,達到平穩升級的效果
也可以set指定鏡像版本,達到回滾的目的,
**6. 回滾到指定版本**
1. 查看歷史版本
`kubectl rollout history DeploymentName`
2. 回滾到指定版本
`kubectl rollout undo deployment/nginx-deployment --to-revision=3`
### 1.3.3 根據負載動態擴縮容
https://www.cnblogs.com/l-hh/p/14840573.html
# 2. DaemonSet
## 2.1 功能
1. 確保每個(某些)節點都有這個pod,新加入的節點自動部署pod
**DaemonSet 典型應用場景:**
* 運行集群存儲,例如在每個Node上運行`glusterd`、`ceph`等
* 每個Node 上運行日志收集,例如`fluentd`、`logstash`等
* 每個Node上運行監控程序,例如`Prometheus Node Exporter`、`collectd`等
## 2.2 使用
### 2.1 每個節點都部署pod
```
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
labels:
app: daemonset
spec:
selector:
matchLabels:
name: daemonset-ng
template:
metadata:
labels:
name: daemonset-ng
spec:
containers:
- name: mynginx
image: nginx:1.14.0
```
每個節點都有一個pod
```
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-c8w2j 1/1 Running 0 14s 10.244.1.31 node01 <none> <none>
daemonset-tg2c8 1/1 Running 0 14s 10.244.2.19 node02 <none> <none>
```
# 3. StatefulSet
## 3.1 功能
1. StatefulSet 是用來管理**有狀態服務**,為了解決有狀態服務的問題,而 Deployment 和 ReplicaSet 更適用于無狀態服務的部署。
2. StatefulSet的pod無論怎么調度,每個 Pod 都有一個永久不變的 ID。
**StatefulSet 應用場景:**
* 穩定的、唯一的網絡標識符。
* 穩定的、持久的存儲。
* 有序的、優雅的部署和縮放。
* 有序的、自動的滾動更新。
# 4. Job
## 4.1 功能
1. Job 負載批處理任務,**僅執行一次的任務**,它能夠保證批處理任務的一個或者多個 Pod 成功執行結束。
2. 可以設置 Job 執行成功的數值,Job 跟蹤記錄成功完成的 Pod 個數,當數量達到指定的成功個數閾值時,任務結束。
3. 如果 Jod 沒有以`0代碼`成功退出的話,它會重新執行這個程序。
```
apiVersion: batch/v1
kind: Job
metadata:
name: pi # Job 名稱
spec:
template:
spec:
containers:
- name: pi # Pod 名稱
image: perl # 鏡像名稱
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
# 計算圓周率,計算小數點后 2000 位
restartPolicy: Never # 重啟策略,永不重啟
backoffLimit: 4 # 設置重試次數,達到后將 Job 標記為失敗
```
其他參數
`.spec.completions`標志 Job 需要成功完成 Pod 個數,才視為整個 Job 完成。(默認1)
`.spec.parallelism`標志 Pod 并行運行個數。(默認1)
`.spec.activeDeadlineSeconds`標志 Job 的整個生命期,一旦 Job 運行時間達到設定值,則所有運行中的 Pod 都會被終止。(秒數值)
# 5. Cronjob
定期的執行Job
- docker
- docker安裝
- 數據持久化
- 鏡像管理
- Dockerfile
- 鏡像的分層
- add copy
- 構建實例
- 鏡像的導入導出
- 清理構建空間
- 配置阿里云加速器
- docker網絡模型
- 本地倉庫
- registry
- harbor
- IDEA部署docker
- 軟件安裝
- 安裝es
- 安裝MongoDB
- 安裝rabbitmq
- 安裝redis
- 安裝nacos
- 安裝mysql
- Minio
- 鏡像中心
- kubernetes
- 1. 安裝k8s
- 2.主要組件
- 3.污點
- 4.pod
- 5.控制器
- 6.網絡
- 7.探針
- 8.安裝Dashbord
- 9.secret
- 9.serviceAccount
- 10.service
- 資源清單
- kube-proxy
- flannel源文件
- 服務升級
- 筆記
- 鏡像