控制器: k8s中内建了很多controller控制器,相当于一个状态机,用来控制Pod的具体状态和行为。
Pod 的分类
1)自主式Pod : Pod退出, 此类型Pod不会被创建。
2)控制器Pod : 在控制器的生命周期始终维持Pod的副本数量. (就算Pod死亡, 也会自动创建维持Pod的数量)
命令式编程:侧重于如何实现程序,就像我们刚接触编程的时候,需要把程序的实现过程按照逻辑结果一步一步写下来。
声明式编程:侧重于定义想要什么,然后告诉计算机/引擎去帮你实现。
申明式编程 (Deployment) apply(优) create
命令式 (rs) create(优) apply
ReplicationController和ReplicaSet
ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代,而异常多出来的容器也会自动回收。
在新版本的k8s中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationContriller没有本质的不同,只是名字一样,并且replicaSet支持集合式的selector。
例子:
[root@k8smaster k8s]# more rs.yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: rs-test
spec:
replicas: 3
selector:
matchLabels:
tier: mytest
template:
metadata:
labels:
tier: mytest
spec:
containers:
- name: nginx
image: 192.168.23.100:5000/nginx:v1
ports:
- containerPort: 80
[root@k8smaster k8s]#
[root@k8smaster k8s]# kubectl create -f rs.yaml
replicaset.extensions/rs-test created
[root@k8smaster k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rs-test-277jh 1/1 Running 0 30s 10.244.2.8 k8snode02 <none> <none>
rs-test-8sw48 1/1 Running 0 30s 10.244.1.9 k8snode01 <none> <none>
rs-test-dfhsn 1/1 Running 0 30s 10.244.2.9 k8snode02 <none> <none>
[root@k8smaster k8s]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
rs-test-4k2f4 1/1 Running 0 6m54s tier=mytest
rs-test-m6sjs 1/1 Running 0 6m54s tier=mytest
rs-test-sqcwg 1/1 Running 0 6m54s tier=mytest
[root@k8smaster k8s]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-test 3 3 3 41s
Deployment
为Pod和ReplicaSet提供一个声明式方法,用来代替ReplicationController来方便管理应用,典型的场景有:
1)定义Deployment来创建Pod和ReplicaSet
2)滚动升级和回滚应用
3)扩容和缩容
4)暂停和继续Deploment
例子:
[root@k8smaster k8s]# more deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deployment-test
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 192.168.23.100:5000/nginx:v1
ports:
- containerPort: 80
[root@k8smaster k8s]#
[root@k8smaster k8s]# kubectl apply -f deployment.yaml
deployment.extensions/deployment-test created
[root@k8smaster k8s]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployment-test-745d95487d-dchkr 1/1 Running 0 40s
deployment-test-745d95487d-jzn4h 1/1 Running 0 40s
deployment-test-745d95487d-mkwgm 1/1 Running 0 40s
[root@k8smaster k8s]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-test-745d95487d 3 3 3 43s
[root@k8smaster k8s]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-test 3/3 3 3 50s
[root@k8smaster k8s]#
DaemonSet
确保全部(一些)Node上运行一个Pod副本. 当有Node加入集群,会为他们新增一个Pod,当有Node从集群移除时,pod也会被回收,删除DaemonSet将会删除它创建的Pod.
使用场景:
1)运行集群的存储daemon
2)每个Node的日志收集, fluentd ,logtash
3)每个Node的监控程序
Job
负责批量任务,仅执行一次任务,保证批处理任务一个或多个Pod成功结束
CronJob
定时调度某个时间执行一次或循环多次执行
StatefulSet
作为Controller为Pod提供唯一的标识 , 保证部署和scale的顺序.
StatefulSet用来解决有状态服务的问题, 场景如下:
1)稳定的持久化存储, 即Pod重新调度后能访问持久化数据,基于PCV实现,
2)稳定的网络标识, 即Pod重新调度后PodName和HostName不变, 基于Headless Services(即没有Cluster IP的Service) 来实现.
3)有序部署和有序扩展, 0-> N 下一个执行基于前一个已经Running或Ready, 基于InitC实现
4)有序删除N->0
Horizontal Pod Autosacling
应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的pod个数自动调整?这就有赖于Horizontal pod Autoscaling,使pod水平缩放。