Pod与controllers的关系
•controllers:在集群上管理和运行容器的对象
•通过label-selector相关联
•Pod通过控制器实现应用的运维,如伸缩,升级等
控制器又称工作负载是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。
控制器有多种类型:
Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
Job:只要完成就立即退出,不需要重启或重建。
Cronjob:周期性任务控制,不需要持续后台运行,
StatefulSet:管理有状态应用
ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
Deployment
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。
只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。也可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
典型的用例如下:
(1)使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。 (2)然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。 (3)如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。 (4)扩容Deployment以满足更高的负载。 (5)暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。 (6)根据Deployment 的状态判断上线是否hang住了。 (7)清除旧的不必要的 ReplicaSet。
创建deployment
[root@k8s-master1 demo]# vim deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14 ports: - containerPort: 80 [root@k8s-master1 demo]# kubectl create -f deploy-demo.yaml deployment.apps/nginx-deployment created
查看Deployment已经创建了3个 replica ,刚创建的Replica Set将保证总是有3个副本的 pod 存在
[root@k8s-master1 demo]# kubectl get deploy,rs,pod -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.extensions/nginx-deployment 3/3 3 3 8s nginx nginx:1.14 app=nginx NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset.extensions/nginx-deployment-75465b4f74 3 3 3 8s nginx nginx:1.14 app=nginx,pod-template-hash=75465b4f74 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx-deployment-75465b4f74-7qsh7 1/1 Running 0 8s 172.17.73.3 192.168.0.126pod/nginx-deployment-75465b4f74-9p9kl 1/1 Running 0 8s 172.17.73.4 192.168.0.126 pod/nginx-deployment-75465b4f74-r9snc 1/1 Running 0 8s 172.17.32.2 192.168.0.125
ReplicaSet 的名字总是
。
[root@k8s-master1 demo]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-75465b4f74-7qsh7 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74 nginx-deployment-75465b4f74-9p9kl 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74 nginx-deployment-75465b4f74-r9snc 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74
DaemonSet
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
使用 DaemonSet 的一些典型用法:
- 运行集群存储 daemon,例如在每个 Node 上运行 ,应用场景:Agent。
- 在每个 Node 上运行日志收集 daemon,例如
fluentd
、logstash
。 - 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、
collectd
、Datadog 代理、New Relic 代理,或 Gangliagmond
。
DaemonSet示例
创建redis-filebeat的yaml文件
[root@k8s-master1 demo]# vim ds-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: default spec: replicas: 1 selector: matchLabels: app: redis role: logstor template: metadata: labels: app: redis role: logstor spec: containers: - name: redis image: redis:4.0-alpine ports: - name: redis containerPort: 6379 --- apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-ds namespace: default spec: selector: matchLabels: app: filebeat release: stable template: metadata: labels: app: filebeat release: stable spec: containers: - name: filebeat image: ikubernetes/filebeat:5.6.5-alpine env: - name: REDIS_HOST value: redis.default.svc.cluster.local - name: REDIS_LOG_LEVEL value: info
创建pod
[root@k8s-master1 demo]# kubectl apply -f ds-demo.yaml deployment.apps/redis created daemonset.apps/filebeat-ds created
暴露端口
[root@k8s-master1 demo]# kubectl expose deployment redis --port=6379 service/redis exposed [root@k8s-master1 demo]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.0.0.1443/TCP 5d19h service/redis ClusterIP 10.0.0.150 6379/TCP 19s
查看pod ,DaemonSet在每个node上运行一个filebeat的pod
[root@k8s-master1 demo]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES filebeat-ds-dndjq 1/1 Running 0 17m 172.17.32.3 192.168.0.125filebeat-ds-k6d6b 1/1 Running 0 17m 172.17.73.3 192.168.0.126 redis-85b846ff9c-wlxcg 1/1 Running 0 17m 172.17.32.2 192.168.0.125