k8s的控制器类型Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为 Deployment:适合无状态的服务部署 StatefullSet:适合有状态的服务部署 DaemonSet:一次部署,所有的node节点都会部署,例如一些典型的应用场景: 运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph 在每个Node上运行日志收集 daemon,例如 fluentd、 logstash 在每个Node上运行监控 daemon,例如 Prometheus Node Exporter Job:一次性的执行任务 Cronjob:周期性的执行任务
总体来说,K8S有五种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用
pod与控制器之间的关系controllers:在集群上管理和运行容器的对象通过label-selector相关联 Pod通过控制器实现应用的运维,如伸缩,升级等 
Deployment(无状态化应用)应用场景:web服务 Deployment中文意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是一种通过yml文件的声明,在Deployment 文件里可以定义Pod数量、更新方式、使用的镜像,资源限制等。无状态应用都用Deployment来创建 通过Deployment对象,你可以轻松的做到以下事情: - 创建ReplicaSet和Pod
- 滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
- 平滑地扩容和缩容
- 暂停和继续Deployment
Deployment创建[root@master shuai]# vim nginx-delpoy.yamlapiVersion: apps/v1kind: Deployment '定义是Deployment'metadata: name: nginx-deployment labels: app: nginxspec: replicas: 3 '副本数量为3' selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.4 ports: - containerPort: 80'创建资源'[root@master shuai]# kubectl apply -f nginx-delpoy.yaml deployment.apps/nginx-deployment created//Replicaset 是控制版本,副本数,回滚就是通过此来实现'//查看所有资源'[root@master shuai]# kubectl get allNAME READY STATUS RESTARTS AGEpod/nginx-deployment-d55b94fd-cndf2 1/1 Running 0 3m31spod/nginx-deployment-d55b94fd-ghlwk 1/1 Running 0 3m31spod/nginx-deployment-d55b94fd-tm4sw 1/1 Running 0 3m31spod/pod-example 1/1 Running 0 10hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 3d6hNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEdeployment.apps/nginx-deployment 3 3 3 3 3m31sNAME DESIRED CURRENT READY AGEreplicaset.apps/nginx-deployment-d55b94fd 3 3 3 3m31s查看控制器信息kubectl deit deployment/nginx-deployment.....省略信息.....strategy: rollingUpdate: '版本更新为滚动更新机制' maxSurge: 25% '最大更新副本数是25%,最多扩容125%' '为了保持副本数量,增加的百分比同时要销毁多少' maxUnavailable: 25% '最大删除副本是25%,最多缩容到75%' type: RollingUpdate...省略信息....'执行kubectl describe deploy nginx-deployment 也可以查看'....省略信息....RollingUpdateStrategy: 25% max unavailable, 25% max surge查看历史版本[root@master shuai]# kubectl rollout history deploy/nginx-deploymentdeployment.extensions/nginx-deployment REVISION CHANGE-CAUSE1 <none> '//这边只有一个,证明还没有滚动更新'
状态与无状态化对特点无状态服务的特点: 1)deployment 认为所有的pod都是一样的 2)不用考虑顺序的要求 3)不用考虑在哪个node节点上运行 4)可以随意扩容和缩容
有状态服务的特点: 1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper 2)实例之间不对等的关系,以及依靠外部存储的应用。
Deployment的更新如果想要让 nginx pod 使用 nginx:1.9.1 的镜像来代替原来的 nginx的镜像,运行以下命令[root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1deployment.apps/nginx-deployment image updated或者我们可以使用 edit 命令来编辑 Deployment,将image从nginx改写成 nginx:1.9.1kubectl edit deployment/nginx-deployment查看更新进度[root@master ~]# kubectl rollout status deployment/nginx-deploymentWaiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...deployment "nginx-deployment" successfully rolled out Deployment更新时会创建一个新的ReplicaSet,然后将新的ReplicaSet中的Pod慢慢扩容到指定的副本数,将旧的ReplicaSet慢慢缩容到0。因此,更新时总能够确保旧的服务不会停止,这就是滚动更新。
Deployment的回滚当我们像上文一样更新了Deployment之后,我们发现nginx:1.9.1的镜像不是很稳定,因此想要修改回nginx:1.7.9的版本,此时我们不需要手动更改Deployment文件,而是利用Deployment的回滚功能。 使用rollout history命令查看Deployment的版本(revision): [root@master ~]# kubectl rollout history deployment/nginx-deploymentdeployment.apps/nginx-deployment REVISION CHANGE-CAUSE1 kubectl create --filename=deploy.yml --record=true2 kubectl create --filename=deploy.yml --record=true 因为我们创建 Deployment 的时候使用了 下载地址: Linux系统配置(服务控制)详细介绍 Linux设备之网络驱动介绍 |