啃k8s之五种控制器类型解析
一:k8s的五种控制器
1.1:k8s的控制器类型
-
Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为
- 1、deployment:适合无状态的服务部署
- 2、StatefulSet:适合有状态的服务部署
- 3、DaemonSet:在每一个node上运行一个pod,新加入的node也同样会自动运行一个pod。例如一些典型的应用场景:
- 运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
- 在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
- 在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
- 4、Job:一次性的执行任务
- 5、Cronjob:周期性的执行任务
-
pod与控制器之间的关系
- controllers:在集群上管理和运行容器的对象通过label-selector相关联
- 控制器又被称为工作负载,pod通过控制器实现应用的运维,比如伸缩、升级等
1.2:Deployment控制器
1、适合部署无状态的应用服务
2、用来管理pod和replicaset
3、具有上线部署、副本设定、滚动更新、回滚等功能
4、提供声明式更新,例如只更新一个新的Image
5、应用场景:web服务
1.2.1:测试deployment控制器
- 1、编写yaml文件,并创建nginx服务pod资源
'这边之前在yaml那篇博客中创建过,不在赘述'
[root@master test]# kubectl apply -f nginx-deployment.yaml 'Replicaset 是控制版本,副本数,回滚就是通过此来实现'
deployment.apps/nginx-deployment created
[root@master test]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx-deployment-78cdb5b557-9jplm 1/1 Running 0 6s
nginx-deployment-78cdb5b557-kwwgn 1/1 Running 0 6s
nginx-deployment-78cdb5b557-xlv97 1/1 Running 0 6s
pod-example 1/1 Running 0 122m
^C[root@master test]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-78cdb5b557-9jplm 1/1 Running 0 16s
pod/nginx-deployment-78cdb5b557-kwwgn 1/1 Running 0 16s
pod/nginx-deployment-78cdb5b557-xlv97 1/1 Running 0 16s
pod/pod-example 1/1 Running 0 122m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d12h
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3 3 3 3 16s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-78cdb5b557 3 3 3 16s
- 查看控制器参数:可以使用describe或者edit两种方式
[root@master test]# kubectl describe deploy nginx-deployment
'或者使用edit'
[root@master test]# kubectl edit deploy nginx-deployment
'两种方式都可以查看pod的更详细的信息,包括各种类型的名称、资源、事件等'
...省略内容
strategy:
rollingUpdate: '此段解释的是滚动更新机制'
maxSurge: 25% '25%指的是pod数量的百分比,最多可以扩容125%'
maxUnavailable: 25% '原来pod数量最大销毁数为25%'
type: RollingUpdate
...省略内容
- 查看控制器的历史版本,滚动更新以此为基础
[root@master test]# kubectl rollout history deploy/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 <none> '发现只有一个,说明没有开始滚动更新,否则会保持2个'
1.3:SatefulSet控制器
1、适合部署有状态应用
2、解决Pod的独立生命周期,保持Pod启动顺序和唯一性
3、稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
4、有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
5、有序,滚动更新
6、应用场景:数据库
1.3.1:有状态服务和有状态服务区别
-
无状态服务的特点:
1)deployment 认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容
-
有状态服务的特点:
1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。
1.3.2:常规的service服务和无头服务的区别
-
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
-
Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP,无头服务经常用于statefulset的有状态部署
1.3.3:创建无头服务的service资源和dns资源
- 由于有状态服务的pod的IP地址是动态的,所以使用无头服务的时候要绑定dns服务
1、创建pod
[root@master test]# kubectl apply -f nginx-test.yaml
deployment.apps/nginx-deployment created
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d55b94fd-8mhn6 1/1 Running 0 8s
nginx-deployment-d55b94fd-dqszl 1/1 Running 0 8s
nginx-deployment-d55b94fd-fflj4 1/1 Running 0 8s
2、创建service资源
[root@master test]# kubectl create -f nginx-service.yaml
service/nginx-service created
[root@master test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d12h
nginx-service NodePort 10.0.0.228 <none> 80:38475/TCP 6s
3、在node节点上操作,查看群集间通讯
[root@node1 ~]# systemctl restart flanneld.service
[root@node1 ~]# systemctl restart docker
[root@node1 ~]# curl 10.0.0.228
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this <