pod控制器分類:
1、ReplicationController
2、ReplicaSet
3、Deployment
4、StatefulSet
5、DaemonSet
6、Job,Cronjob
7、HPA
pod控制器:一般包括3部分
1、標籤選擇器
2、期望的副本數(DaemonSet控制器不需要)
3、pod模板
deploy控制器構建於rs控制器之上,新特性包括:
1、事件和狀態查看
2、回滾
3、版本記錄
4、暫停和啓動
5、支持兩種自動更新方案
Recreate刪除重建
RollingUpdate回滾升級(默認方式)
創建deploy
$ kubectl run --help
$ kubectl run nginx --image=nginx --port=80 --replicas=2 #用命令直接創建
$ kubectl run nginx --image=nginx --port=80 --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
創建deploy控制器時會自動創建rs控制器,二者具有相同的標籤選擇器
$ kubectl get deploy
nginx 1/1 1 1 7s
$ kubectl get rs
修改pod副本數的方式
1、kubectl edit deploy nginx
2、kubectl scale deploy nginx --replicas=5
3、修改yaml文件
升級pod鏡像的方法:
1、直接修改yaml
2、kubectl edit deploy nginx
3、kubectl set image deploy/nginx nginx=nginx:1.9 --record #升級並記錄,可實現回滾,推薦使用該方法
滾動升級是deployment pod升級時的默認策略,也可以修改默認值
用命令kubectl edit deploy nginx可以查看默認值
replicas: 3
selector:
matchLabels:
run: nginx
minReadySeconds: 5 #默認看不到,需要手工添加
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
默認情況下,當6個pod副本需要升級時:Kubernetes 將終止1個實例(625%=1.5個實例,向下捨去=1),創建3個新實例(625%=1.5個實例,向上舍入=2,加1個實例來彌補1個終止實例=3個實例),此時總共運行8個副本。一旦新的pod就緒,它將從舊的副本集中終止另外2個實例,以便將部署恢復到所需的副本數,然後重複這個過程,直到部署完成爲止。
minReadySeconds:Kubernetes在等待設置的時間後才進行升級
maxSurge:升級過程中最多可以比原先設置多出的POD數量
maxUnavaible:升級過程中最多有多少個POD處於無法提供服務的狀態
滾動升級相關命令
$ kubectl set image deploy/nginx nginx=nginx:1.7.9 --record
$ kubectl set image deploy/nginx nginx=nginx --record
$ kubectl rollout status deploy nginx #查看升級狀態
$ kubectl rollout pause deployment nginx #升級暫停
$ kubectl rollout resume deployment nginx #恢復升級
$ kubectl describe deploy nginx #查看升級詳情
$ kubectl rollout history deploy/nginx #查看升級歷史
deployment.extensions/nginx
REVISION CHANGE-CAUSE
4 kubectl set image deploy/nginx nginx=nginx:1.7.9 --record=true
5 kubectl set image deploy/nginx nginx=nginx --record=true
$ kubectl rollout history deployment nginx --revision=5
$ kubectl rollout undo deployment/nginx --to-revision=4 #回滾到指定版本
$ kubectl rollout undo deployment nginx-deploy #回滾到前一個版本
顯式指定滾動升級參數
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
run: nginx
minReadySeconds: 5
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
DaemonSet用於在每個Kubernetes節點中將守護進程的副本作爲後臺進程運行,說白了就是在每個節點部署一個Pod副本,當節點加入到Kubernetes集羣中,Pod會被自動調度到該節點上運行。
每個節點有一個ds pod,新加入的節點也會自動生成一個ds pod
ds pod不受調度策略控制
使用DaemonSe場景:
1、集羣存儲守護程序,如glusterd、ceph要部署在每個節點上以提供持久性存儲;
2、節點監視守護進程,如Prometheus監控集羣,可以在每個節點上運行一個node-exporter進程來收集監控節點的信息;
3、日誌收集守護程序,如fluentd或logstash,在每個節點上運行以收集容器的日誌
示例:
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: nginx-ds
labels:
k8s-app: nginx
spec:
template:
metadata:
labels:
k8s-app: nginx
spec:
containers:
- image: nginx:1.7.9
name: nginx
ports:
- name: http
containerPort: 80
無狀態服務(Stateless Service):所有pod只需要共享一個持久存儲,並不需要每個pod一個持久存儲,並且多個實例對於同一個請求響應的結果是完全一致的
有狀態服務(Stateful Service):每個pod都需要一個獨立的持久存儲,對於這種類型的資源,我們一般是通過創建一個Headless Service類型的服務來暴露服務,將clusterIP設置爲None就是一個無頭的服務。
1、有狀態服務一般使用pvc模板和存儲類爲每個pod自動生成一對pv和pvc來實現持久化存儲。
2、也可以手動創建pv,然後和利用StatefulSet中的volumeClaimTemplates自動生成的pvc進行配對。
手動創建pv用於StatefulSet
1、創建兩個pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001 #第二個是pv002
labels:
release: stable
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: /tmp/data
2、先創建無頭服務
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
role: stateful
3、創建StatefulSet pod使用pv
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" #使用上面創建的無頭服務
replicas: 2
template:
metadata:
labels:
app: nginx
role: stateful
spec:
containers:
- name: nginx
image: cnych/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
volumeClaimTemplates會根據其對應的pv自動生成pvc並自動配對,數量由replicas: 2決定。
使用pvc模板和存儲類自動生成pv和pvc
1、創建存儲類
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
2、先創建無頭服務
apiVersion: v1
kind: Service
metadata:
name: nfs-web
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
role: stateful
3、使用存儲類創建StatefulSet pod
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nfs-web
spec:
serviceName: "nfs-web" #使用上面創建的無頭服務
replicas: 2
template:
metadata:
labels:
app: nfs-web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: course-nfs-storage
spec:
accessModes: [ "ReadWriteOnce" ]
#storageClassName: course-nfs-storage 使用存儲類
resources:
requests:
storage: 1Gi
會自動生成兩對pv和pvc