一、pod控制器
controller用于控制pod
控制器主要分为:
ReplicationController(相当于ReplicaSet的老版本,现在建议使用
Deployments加ReplicaSet替代RC)
ReplicaSet 副本集,控制pod扩容,裁减
Deployments 控制pod升级,回退
StatefulSets 部署有状态的pod应用
DaemonSet 运行在所有集群节点(包括master), 比如使用
filebeat,node_exporter
Jobs 一次性
Cronjob 周期性
1.1 Deployment&ReplicaSet
1.1.1 Replicaset控制器的功能:
支持新的基于集合的selector(以前的rc里没有这种功能)
通过改变Pod副本数量实现Pod的扩容和缩容
1.1.2 Deployment控制器的功能:
Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
Deployment里包含并使用了ReplicaSet
1.1.3 YAML文件创建deployment
apiVersion: apps/v1 kind: Deployment metadata: name: nginx2 # deployment名 spec: replicas: 1 # 副本集,deployment里使用了 selector: matchLabels: app: nginx # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod template: # 代表pod的配置模板 metadata: labels: app: nginx # pod的标签 spec: containers: # 以下为pod里的容器定义 - name: nginx image: nginx:1.15-alpine imagePullPolicy: IfNotPresent ports: - containerPort: 80 kubectl apply -f nginx2-deployment.yml kubectl get deployment kubectl get pods
1.2 DaemonSet控制器
DaemonSet能够让所有(或者特定)的节点运行同一个pod
当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运 行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除
如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删 除。
如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么 DaemonSet将会重新创建一个新的副本在这台计算节点上
DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等
vim nginx-daemonset.yml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-daemonset spec: selector: matchLabels: name: nginx-test template: metadata: labels: name: nginx-test spec: tolerations: # tolerations代表容忍 - key: node-role.kubernetes.io/master # 能容忍的污点key effect: NoSchedule # kubectl explain pod.spec.tolerations查看(能容忍的污点effect) containers: - name: nginx image: nginx:1.15-alpine imagePullPolicy: IfNotPresent resources: # resources资源限制是为了防止master节点的资源被占太多(根据实际情况配置) limits: memory: 100Mi requests: memory: 100Mi
1.3 Job控制器
Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
1.3.1 创建一次性job
vim job.yml apiVersion: batch/v1 kind: Job metadata: name: pi # job名 spec: template: metadata: name: pi # pod名 spec: containers: - name: pi # 容器名 image: perl # 此镜像有800多M,可提前导入到所有节点,也可能指定导入到某一节点然后指定调度到此节点 imagePullPolicy: IfNotPresent command: ["perl", "-Mbignum=bpi", "-wle", "printbpi(2000)"] restartPolicy: Never # 执行完后不再重启 kubectl apply -f job.yml kubectl get jobs kubectl get pods kubectl logs pi-tjq9b
1.3.2 创建固定次数job
vim job2.yml apiVersion: batch/v1 kind: Job metadata: name: busybox-job spec: completions: 10 # 执行job的次数 parallelism: 1 # 执行job的并发数 template: metadata: name: busybox-job-pod spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ["echo", "hello"] restartPolicy: Never kubectl apply -f job2.yml kubectl get job
1.4 crontab控制器
类似于Linux系统的crontab,在指定的时间周期运行相关的任务
vim cronjob.yml apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob1 spec: schedule: "* * * * *" # 分时日月周 jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo hello kubernetes imagePullPolicy: IfNotPresent restartPolicy: OnFailure kubectl apply -f cronjob.yml kubectl get cronjob kubectl get pod
1.5 创建service
cat > nginx_service.yml <<eof apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: clusterIP: 10.2.11.22 # 这个ip可以不指定,让它自动分配,需要与集群分配的网络对应 type: ClusterIP # ClusterIP类型,也是默认类型 ports: # 指定service 端口及容器端口 - port: 80 # service ip中的端口 protocol: TCP targetPort: 80 # pod中的端口 selector: # 指定后端pod标签(不是deployment的标签) app: nginx # 可通过kubectl get pod -l app=nginx查看哪些pod在使用此标签
1.6 pod版本升级(滚动更新)
# 升级前查看版本 kubectl describe pod nginx1-7d9b8757cf-czcz4 |grep Image: # 升级前版本 Image: nginx:1.15-alpine kubectl exec nginx1-7d9b8757cf-czcz4 --nginx -v # 正式升级 kubectl set image deployment nginx1 nginx1=nginx:1.16-alpine --record # 升级为1.16版 kubectl set image -h # 查看帮助 kubectl rollout status deployment nginx1 # 滚努更新 # 查看版本 kubectl get pods kubectl describe pod nginx1-7ffc8cb4fb-tn4ls |grep Image: kubectl exec nginx1-7ffc8cb4fb-tn4ls --nginx -v
deployment nginx1 代表名为nginx1的deployment nginx1=nginx:1.16-alpine 前面的nginx1为容器名 --record 表示会记录
1.7 pod版本回滚
kubectl rollout history deployment nginx1 # 查看版本历史信息 kubectl rollout history deployment nginx1--revision=1 # 定义要回退的版本为1 kubectl rollout undo deployment nginx1 --to-revision=1 # 开始回退 deployment.extensions/nginx1 rolled back kubectl rollout history deployment nginx1 deployment.extensions/nginx1 # 查看有没回退 kubectl get pods kubectl describe pod nginx1-7d9b8757cf-m7rt4 |grep Image: kubectl exec nginx1-7d9b8757cf-m7rt4 --nginx -v
1.8 副本扩容
kubectl scale -h # 查看帮助 kubectl scale deployment nginx1 --replicas=10 -n kube-public # 扩容为10个副本,改小字则副本缩减 kubectl get pods -o wide