# Kubernetes控制器Controller詳解
## Statefulset
Statefulset主要是用來部署有狀態應用
對于StatefulSet中的Pod,每個Pod掛載自己獨立的存儲,如果一個Pod出現故障,從其他節點啟動一個同樣名字的Pod,要掛載上原來Pod的存儲繼續以它的狀態提供服務。
### 無狀態應用
我們原來使用 deployment,部署的都是無狀態的應用,那什么是無狀態應用?
- 認為Pod都是一樣的
- 沒有順序要求
- 不考慮應用在哪個node上運行
- 能夠進行隨意伸縮和擴展
### 有狀態應用
上述的因素都需要考慮到
- 讓每個Pod獨立的
- 讓每個Pod獨立的,保持Pod啟動順序和唯一性
- 唯一的網絡標識符,持久存儲
- 有序,比如mysql中的主從
適合StatefulSet的業務包括數據庫服務MySQL 和 PostgreSQL,集群化管理服務Zookeeper、etcd等有狀態服務
StatefulSet的另一種典型應用場景是作為一種比普通容器更穩定可靠的模擬虛擬機的機制。傳統的虛擬機正是一種有狀態的寵物,運維人員需要不斷地維護它,容器剛開始流行時,我們用容器來模擬虛擬機使用,所有狀態都保存在容器里,而這已被證明是非常不安全、不可靠的。
使用StatefulSet,Pod仍然可以通過漂移到不同節點提供高可用,而存儲也可以通過外掛的存儲來提供
高可靠性,StatefulSet做的只是將確定的Pod與確定的存儲關聯起來保證狀態的連續性。
### 部署有狀態應用
無頭service, ClusterIp:none
這里就需要使用 StatefulSet部署有狀態應用


然后通過查看pod,能否發現每個pod都有唯一的名稱

然后我們在查看service,發現是無頭的service

這里有狀態的約定,肯定不是簡簡單單通過名稱來進行約定,而是更加復雜的操作
- deployment:是有身份的,有唯一標識
- statefulset:根據主機名 + 按照一定規則生成域名
每個pod有唯一的主機名,并且有唯一的域名
- 格式:主機名稱.service名稱.名稱空間.svc.cluster.local
- 舉例:nginx-statefulset-0.default.svc.cluster.local
## DaemonSet
DaemonSet 即后臺支撐型服務,主要是用來部署守護進程
長期伺服型和批處理型的核心在業務應用,可能有些節點運行多個同類業務的Pod,有些節點上又沒有這類的Pod運行;而后臺支撐型服務的核心關注點在K8S集群中的節點(物理機或虛擬機),要保證每個節點上都有一個此類Pod運行。節點可能是所有集群節點,也可能是通過 nodeSelector選定的一些特定節點。典型的后臺支撐型服務包括:存儲、日志和監控等。在每個節點上支撐K8S集群運行的服務。
守護進程在我們每個節點上,運行的是同一個pod,新加入的節點也同樣運行在同一個pod里面
- 例子:在每個node節點安裝數據采集工具

這里是不是一個FileBeat鏡像,主要是為了做日志采集工作

進入某個 Pod里面,進入
```bash
kubectl exec -it ds-test-cbk6v bash
```
通過該命令后,我們就能看到我們內部收集的日志信息了

## Job和CronJob
一次性任務 和 定時任務
- 一次性任務:一次性執行完就結束
- 定時任務:周期性執行
Job是K8S中用來控制批處理型任務的API對象。批處理業務與長期伺服業務的主要區別就是批處理業務的運行有頭有尾,而長期伺服業務在用戶不停止的情況下永遠運行。Job管理的Pod根據用戶的設置把任務成功完成就自動退出了。成功完成的標志根據不同的 spec.completions 策略而不同:單Pod型任務有一個Pod成功就標志完成;定數成功行任務保證有N個任務全部成功;工作隊列性任務根據應用確定的全局成功而標志成功。
### Job
Job也即一次性任務

使用下面命令,能夠看到目前已經存在的Job
```bash
kubectl get jobs
```

在計算完成后,通過命令查看,能夠發現該任務已經完成

我們可以通過查看日志,查看到一次性任務的結果
```bash
kubectl logs pi-qpqff
```

### CronJob
定時任務,cronjob.yaml如下所示

這里面的命令就是每個一段時間,這里是通過 cron 表達式配置的,通過 schedule字段
然后下面命令就是每個一段時間輸出
我們首先用上述的配置文件,創建一個定時任務
```bash
kubectl apply -f cronjob.yaml
```
創建完成后,我們就可以通過下面命令查看定時任務
```bash
kubectl get cronjobs
```

我們可以通過日志進行查看
```bash
kubectl logs hello-1599100140-wkn79
```

然后每次執行,就會多出一個 pod

## 刪除svc 和 statefulset
使用下面命令,可以刪除我們添加的svc 和 statefulset
```bash
kubectl delete svc web
kubectl delete statefulset --all
```
## Replication Controller
Replication Controller 簡稱 **RC**,是K8S中的復制控制器。RC是K8S集群中最早的保證Pod高可用的API對象。通過監控運行中的Pod來保證集群中運行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少于指定數目,RC就會啟動新的Pod副本;多于指定數目,RC就會殺死多余的Pod副本。
即使在指定數目為1的情況下,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有一個Pod在運行。RC是K8S中較早期的技術概念,只適用于長期伺服型的業務類型,比如控制Pod提供高可用的Web服務。
### Replica Set
Replica Set 檢查 RS,也就是副本集。RS是新一代的RC,提供同樣高可用能力,區別主要在于RS后來居上,能夠支持更多種類的匹配模式。副本集對象一般不單獨使用,而是作為Deployment的理想狀態參數來使用
- Kubernetes簡介
- 搭建K8S集群前置知識
- 使用kubeadm方式搭建K8S集群
- 使用二進制方式搭建K8S集群
- Kubeadm和二進制方式對比
- Kubernetes集群管理工具kubectl
- Kubernetes集群YAML文件詳解
- Kubernetes核心技術Pod
- Kubernetes核心技術Controller
- Kubernetes核心技術Service
- Kubernetes控制器Controller詳解
- Kubernetes配置管理
- Kubernetes集群安全機制
- Kubernetes核心技術Ingress
- Kubernetes核心技術Helm
- Kubernetes持久化存儲
- Kubernetes集群資源監控
- Kubernetes搭建高可用集群
- Kubernetes容器交付介紹
- 使用kubeadm-ha腳本一鍵安裝K8S
- Kubernetes可視化界面kubesphere
- Kubernetes配置默認存儲類
- 使用Rancher搭建Kubernetes集群
- Kubernetes中的CRI