•controllers:在集群上管理和运行容器的对象 •通过label-selector相关联 •Pod通过控制器实现应用的运维,如伸缩,升级等
控制器又称工作负载是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。
Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。 DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务 Job:只要完成就立即退出,不需要重启或重建。 Cronjob:周期性任务控制,不需要持续后台运行, StatefulSet:管理有状态应用
ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
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.126 <none> <none>
pod/nginx-deployment-75465b4f74-9p9kl 1/1 Running 0 8s 172.17.73.4 192.168.0.126 <none> <none>
pod/nginx-deployment-75465b4f74-r9snc 1/1 Running 0 8s 172.17.32.2 192.168.0.125 <none> <none>
ReplicaSet 的名字总是<Deployment的名字>-<pod template的hash值>
。
[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 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
使用 DaemonSet 的一些典型用法:
fluentd
、logstash
。collectd
、Datadog 代理、New Relic 代理,或 Ganglia gmond
。创建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.1 <none> 443/TCP 5d19h
service/redis ClusterIP 10.0.0.150 <none> 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.125 <none> <none>
filebeat-ds-k6d6b 1/1 Running 0 17m 172.17.73.3 192.168.0.126 <none> <none>
redis-85b846ff9c-wlxcg 1/1 Running 0 17m 172.17.32.2 192.168.0.125 <none> <none>