上海网站开发建设,最简单的网站代码,东莞做网站公司首选,wordpress eaccelerator一 控制器
控制器是 k8s内置的管理工具。可以帮助用户实现 Pod的自动部署、自维护、扩容、滚动更新等功能的自动化程序。
为什么要使用控制器?
有大量的 Pod需要维护管理需要维护 Pod的健康状态控制器可以像机器人一样可以替用户完成维护管理的工作
二 Deployment
1 概…一 控制器
控制器是 k8s内置的管理工具。可以帮助用户实现 Pod的自动部署、自维护、扩容、滚动更新等功能的自动化程序。
为什么要使用控制器?
有大量的 Pod需要维护管理需要维护 Pod的健康状态控制器可以像机器人一样可以替用户完成维护管理的工作
二 Deployment
1 概述
最常用的无状态服务控制器由 Deploymen、ReplicaSet、Pod 组成、支持集群扩容缩容滚动、更新、自动维护 Pod 可用性及·副本量等功能
ReplicaSet 和 Pod 由 Deployment 自动管理用户无需干预
2 Deploy 图例 3 Deploy 资源文件
# 清理 Pod 使用控制器创建
[rootmaster ~]# kubectl delete pod --all
# 资源对象模板
[rootmaster ~]# kubectl create deployment myweb --imagemyos:httpd --dry-runclient -o yaml
[rootmaster ~]# vim mydeploy.yaml
---
kind: Deployment # 资源对象类型
apiVersion: apps/v1 # 版本
metadata: # 元数据name: myweb # 名称
spec: # 详细定义replicas: 2 # 副本数量selector: # 定义标签选择器matchLabels: # 支持 matchExpressions 表达式语法app: httpd # 通过标签来确定那个 Pod 由它来管理template: # 定义用来创建 Pod 的模板,以下为 Pod 定义metadata: # Pod元数据labels: # 名称由控制器生成app: httpd # 这里只能定义标签spec: # Pod的详细定义restartPolicy: Always # 重启策略containers: # 容器定义- name: apache # 容器名称image: myos:httpd # 创建容器使用的镜像imagePullPolicy: Always # 镜像下载策略# 创建 Deployment
[rootmaster ~]# kubectl apply -f mydeploy.yaml
deployment.apps/myweb created
[rootmaster ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
myweb 2/2 2 2 68s
[rootmaster ~]# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
myweb-64b544dcbc 2 2 2 73s
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-64b544dcbc-5mhqn 1/1 Running 0 76s
myweb-64b544dcbc-nt6tz 1/1 Running 0 76s
4 ClusterIP 服务
如何访问 Deployment 资源?
Deployment 管理多个 Pod可以使用服务对其资源进行访问
# 创建服务访问集群
[rootmaster ~]# vim websvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: websvc
spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: httpdports:- protocol: TCPport: 80targetPort: 80[rootmaster ~]# kubectl apply -f websvc.yaml
service/websvc created
[rootmaster ~]# curl -m 3 http://10.245.1.80
Welcome to The Apache. 5 Pod维护管理
# 自维护自治理
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-64b544dcbc-5mhqn 1/1 Running 0 4m16s
myweb-64b544dcbc-nt6tz 1/1 Running 0 4m16s# Pod 被删除后Deploy 会自动创建新的 Pod 来维护集群的完整性
[rootmaster ~]# kubectl delete pod myweb-64b544dcbc-5mhqn
pod myweb-64b544dcbc-5mhqn deleted
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-64b544dcbc-g8l9p 1/1 Running 0 3s
myweb-64b544dcbc-nt6tz 1/1 Running 0 4m25s
6 集群扩缩容
# 设置 1 Pod 集群
[rootmaster ~]# kubectl scale deployment myweb --replicas1
deployment.apps/myweb scaled
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-64b544dcbc-nt6tz 1/1 Running 0 5m46s
# 设置 3 Pod 集群
[rootmaster ~]# kubectl scale deployment myweb --replicas3
deployment.apps/myweb scaled
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-64b544dcbc-5sf5z 1/1 Running 0 3s
myweb-64b544dcbc-6r6dw 1/1 Running 0 3s
myweb-64b544dcbc-nt6tz 1/1 Running 0 5m56s
7 历史版本信息
# 查看历史版本
[rootmaster ~]# kubectl rollout history deployment myweb
deployment.apps/myweb
REVISION CHANGE-CAUSE
1 none# 添加注释信息
[rootmaster ~]# kubectl annotate deployments myweb kubernetes.io/change-causehttpd.v1
deployment.apps/myweb annotated
[rootmaster ~]# kubectl rollout history deployment myweb
deployment.apps/myweb
REVISION CHANGE-CAUSE
1 httpd.v1
8 滚动更新
# 修改镜像滚动更新集群
[rootmaster ~]# kubectl set image deployment myweb apachemyos:nginx
deployment.apps/myweb image updated
# 给新版本添加注释信息
[rootmaster ~]# kubectl annotate deployments myweb kubernetes.io/change-causenginx.v1
deployment.apps/myweb annotated
# 查看历史版本信息
[rootmaster ~]# kubectl rollout history deployment myweb
deployment.apps/myweb
REVISION CHANGE-CAUSE
1 httpd.v1
2 nginx.v1# 访问验证服务
[rootmaster ~]# curl -m 3 http://10.245.1.80
Nginx is running !
9 版本回滚
# 历史版本与回滚
[rootmaster ~]# kubectl rollout undo deployment myweb --to-revision 1
deployment.apps/myweb rolled back
[rootmaster ~]# curl -m 3 http://10.245.1.80
Welcome to The Apache.[rootmaster ~]# kubectl rollout history deployment myweb
deployment.apps/myweb
REVISION CHANGE-CAUSE
2 nginx.v1
3 httpd.v1# 删除控制器方法1
[rootmaster ~]# kubectl delete deployments myweb
deployment.apps myweb deleted
# 删除控制器方法2
[rootmaster ~]# kubectl delete -f mydeploy.yaml
deployment.apps myweb deleted
三 DaemonSet
1 概述
无法自定义副本数量所创建的 Pod与 node 节点绑定每个node 上都会运行一个 Pod当有新 Node 加入集群时会为他新增 Pod 副本当 Node 从集群移除时这些 Pod 也会被回收典型应用kube-proxy
2 DS图例 3 资源对象案例
[rootmaster ~]# cp -a mydeploy.yaml myds.yaml
[rootmaster ~]# vim myds.yaml
---
kind: DaemonSet # 资源对象类型
apiVersion: apps/v1
metadata:name: myds # 控制器名称
spec:# replicas: 2 # 删除副本参数selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:restartPolicy: Alwayscontainers:- name: apacheimage: myos:httpdimagePullPolicy: Always# 创建 DaemonSet 资源对象与 node 绑定每节点都创建容器
[rootmaster ~]# kubectl apply -f myds.yaml
daemonset.apps/myds created
[rootmaster ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myds-msrcx 1/1 Running 0 31s 10.244.1.11 node-0001
myds-lwq8l 1/1 Running 0 31s 10.244.2.17 node-0002
myds-4wt72 1/1 Running 0 31s 10.244.3.14 node-0003
myds-6k82t 1/1 Running 0 31s 10.244.4.15 node-0004
myds-9c6wc 1/1 Running 0 31s 10.244.5.19 node-0005
4 污点干扰
# 设置污点重建 daemonset
[rootmaster ~]# kubectl taint node node-0001 kv:NoSchedule
node/node-0001 tainted
[rootmaster ~]# kubectl delete -f myds.yaml
daemonset.apps myds deleted
[rootmaster ~]# kubectl apply -f myds.yaml
daemonset.apps/myds created
# 有污点不会部署特殊需求可以设置容忍策略
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myds-pkdn9 1/1 Running 0 2s
myds-pkp6b 1/1 Running 0 2s
myds-j84cw 1/1 Running 0 2s
myds-5c69p 1/1 Running 0 2s
# 删除污点后会立即部署
[rootmaster ~]# kubectl taint node node-0001 kv:NoSchedule-
node/node-0001 untainted
[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myds-2c86p 1/1 Running 0 1s
myds-pkdn9 1/1 Running 0 9s
myds-pkp6b 1/1 Running 0 9s
myds-j84cw 1/1 Running 0 9s
myds-5c69p 1/1 Running 0 9s# 删除控制器
[rootmaster ~]# kubectl delete -f myds.yaml
daemonset.apps myds deleted
四 Job/CronJob
1 概述
Job 是一个单任务控制器负责执行一次任务保证任务在一个或多个Pod上执行成功
CronJob 像是Job的升级版他是基于时间管理的 Job 控制器
2 Job图例 3 Job 控制器
# 资源对象模板
[rootmaster ~]# kubectl create job myjob --imagemyos:8.5 --dry-runclient -o yaml -- sleep 3
[rootmaster ~]# vim myjob.yaml
---
kind: Job
apiVersion: batch/v1
metadata:name: myjob # 资源对象名称
spec: # job 的详细定义template: # 以下定义 Pod 模板spec: # pod的详细定义restartPolicy: OnFailure # 只支持[OnFailure,Never]containers: # 容器定义- name: myjob # 容器名称image: myos:8.5 # 创建容器使用的镜像command: [/bin/bash] # 自定义任务可以使用脚本args:- -c- |sleep 3exit $((RANDOM%2))# restartPolicy 会判断 exit 状态码
# 状态码为 0 表示正常其他都表示失败[rootmaster ~]# kubectl apply -f myjob.yaml
job.batch/myjob created# 失败了会重启
[rootmaster ~]# kubectl get pods -l job-namemyjob -w
NAME READY STATUS RESTARTS AGE
myjob--1-lrtbk 1/1 Running 0 2s
myjob--1-lrtbk 0/1 Error 0 4s
myjob--1-lrtbk 1/1 Running 1 (1s ago) 5s
myjob--1-lrtbk 0/1 Completed 1 9s[rootmaster ~]# kubectl get jobs.batch
NAME COMPLETIONS DURATION AGE
myjob 1/1 8s 12s# 删除Job控制器
[rootmaster ~]# kubectl delete -f myjob.yaml
job.batch myjob deleted
4 CJ图例 资源对象案例
# 资源对象模板
[rootmaster ~]# kubectl create cronjob mycj --imagemyos:8.5 --schedule* * * * * --dry-runclient -o yaml -- sleep 3
[rootmaster ~]# vim mycj.yaml
---
kind: CronJob
apiVersion: batch/v1
metadata:name: mycj # 资源名称
spec: # cronjob 的详细定义schedule: * * * * 1-5 # 时间周期[分、时、日、月、周]jobTemplate: # 以下定义 Job 模板spec: # Job的详细定义template: # 创建pod的模板spec: # Pod的详细定义restartPolicy: OnFailure# 只支持[OnFailure,Never]containers: # 容器定义- name: myjob # 容器名称image: myos:8.5 # 创建容器使用的镜像command: [/bin/bash]# 自定义任务args:- -c- |sleep 3 # 脚本exit $((RANDOM%2)) # 退出状态码失败后会重新运行[rootmaster ~]# kubectl apply -f mycj.yaml
cronjob.batch/mycj created# cronjob 会按照时间周期运行
[rootmaster ~]# kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
mycj */1 * * * 1-5 False 0 none 4s# 按照时间周期每分钟触发一个任务
[rootmaster ~]# kubectl get jobs -w
NAME READY STATUS RESTARTS AGE
mycj-27808172--1-w6sbx 0/1 Pending 0 0s
mycj-27808172--1-w6sbx 0/1 ContainerCreating 0 0s
mycj-27808172--1-w6sbx 1/1 Running 0 1s
mycj-27808172--1-w6sbx 0/1 Completed 1 4s# 保留三次结果多余的会被删除
[rootmaster ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
mycj-27605367 1/1 31s 3m30s
mycj-27605368 1/1 31s 2m30s
mycj-27605369 1/1 31s 90s
mycj-27605370 0/1 30s 30s
[rootmaster ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
mycj-27605368 1/1 31s 2m33s
mycj-27605369 1/1 31s 93s
mycj-27605370 1/1 31s 33s# 删除CJ控制器
[rootmaster ~]# kubectl delete -f mycj.yaml
cronjob.batch mycj deleted 五 StatefulSet
1 概述
StatefulSet旨在与有状态的应用及分布式系统一起使用涉及了 Headless 服务、存储卷、DNS 等相关知识点是一个宽泛而复杂的话题
2 STS图例 3 headless服务
在配置 StatefulSets 的时候首先要定义一个 Headless 的服务。
在创建 Pod的时候会自动把 Pod名称 注册为域名
# 配置 headless 服务
[rootmaster ~]# cp websvc.yaml mysvc2.yaml
[rootmaster ~]# vim mysvc2.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc2 # 服务名称
spec:type: ClusterIPclusterIP: None # 设置 IP 为 Noneselector:app: httpdports:- protocol: TCPport: 80targetPort: 80[rootmaster ~]# kubectl apply -f mysvc2.yaml
service/mysvc2 created
[rootmaster ~]# kubectl get service mysvc2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysvc2 ClusterIP None none 80/TCP 61s
4 创建 StatefulSets 资源对象文件
[rootmaster ~]# cp -a mydeploy.yaml mysts.yaml
[rootmaster ~]# vim mysts.yaml
---
kind: StatefulSet # 资源对象类型
apiVersion: apps/v1
metadata:name: mysts # 控制器名称
spec:serviceName: mysvc2 # 新增 headless 服务名称replicas: 2selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:restartPolicy: Alwayscontainers:- name: apacheimage: myos:httpdimagePullPolicy: Always[rootmaster ~]# kubectl apply -f mysts.yaml
statefulset.apps/mysts created[rootmaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysts-0 1/1 Running 0 2s
mysts-1 1/1 Running 0 1s# Pod 名称自动注册 DNS 服务
[rootmaster ~]# host mysts-0.mysvc2.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: mysts-0.mysvc2.default.svc.cluster.local has address 10.244.1.81[rootmaster ~]# host mysvc2.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: mysvc2.default.svc.cluster.local has address 10.244.2.83
mysvc2.default.svc.cluster.local has address 10.244.1.81# 删除sts控制器
[rootmaster ~]# kubectl delete -f mysts.yaml -f mysvc2.yaml
statefulset.apps mysts deleted
service mysvc2 deleted
六 HPA控制器
1 HorizontalPodAutoscaling概述
HorizontalPodAutoscaling 简称 HPA可以在 Kubernetes集群中基于CPU利用率或其他应程序提供的度量指标实现水平自动伸缩的功能自动缩放POD的数量
控制器会周期性的获取平均利用率
与目标值相比较后来调整副本数量
2 HPA图例 3 创建后端服务
# 为 Deploy 模板添加资源配额
[rootmaster ~]# vim mydeploy.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:name: myweb
spec:replicas: 1 # 修改副本数量selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:restartPolicy: Alwayscontainers:- name: apacheimage: myos:httpdimagePullPolicy: Alwaysresources: # 为该资源设置配额requests: # HPA 控制器会根据配额使用情况伸缩集群cpu: 200m # CPU 配额[rootmaster ~]# vim websvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: websvc
spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: httpdports:- protocol: TCPport: 80targetPort: 80[rootmaster ~]# kubectl apply -f mydeploy.yaml -f websvc.yaml
deployment.apps/myweb created
service/websvc created# 验证服务
[rootmaster ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
myweb-c8c66f894-2cfjv 1m 17Mi
[rootmaster ~]# curl -s http://10.245.1.80
Welcome to The Apache.
4 创建HPA控制器
[rootmaster ~]# vim myhpa.yaml
---
kind: HorizontalPodAutoscaler # 资源对象类型
apiVersion: autoscaling/v1 # 版本
metadata: # 元数据name: myweb # 资源对象名称
spec: # 详细定义minReplicas: 1 # 最少保留的副本数量maxReplicas: 5 # 最大创建的副本数量targetCPUUtilizationPercentage: 50 # 警戒值以百分比计算scaleTargetRef: # 监控的资源对象kind: Deployment # 资源对象类型apiVersion: apps/v1 # 版本name: myweb # 资源对象名称# 创建弹性集群
[rootmaster ~]# kubectl apply -f myhpa.yaml
horizontalpodautoscaler.autoscaling/myweb created# 刚刚创建 unknown 是正常现象最多等待 60s 就可以正常获取数据
[rootmaster ~]# kubectl get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myweb Deployment/myweb unknown/50% 1 5 0 4s# 最多等待 60s 即可正常获取资源状态
[rootmaster ~]# kubectl get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myweb Deployment/myweb 0%/50% 1 5 1 71s
5 验证测试
持续访问 Web服务增加CPU负载在超过警戒值之后会触发扩容操作等待几秒之后发现副本数量增加了。
停止访问让CPU空闲为了防止集群性能抖动副本不会立即释放必须300秒内的平均负载小于警戒值才开始释放副本当副本达到最小值时候停止释放
测试时可以通过访问php 脚本增加CPU的负载
# 终端 1 访问提高负载
[rootmaster ~]# while sleep 1;docurl -s http://10.245.1.80/info.php?id100000 -o /dev/null
done
# 终端 2 监控 HPA 变化
[rootmaster ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myweb Deployment/myweb 0%/50% 1 3 1 8m21s
myweb Deployment/myweb 49%/50% 1 3 1 9m
myweb Deployment/myweb 56%/50% 1 3 1 9m15s
myweb Deployment/myweb 56%/50% 1 3 2 9m30s
myweb Deployment/myweb 37%/50% 1 3 2 9m45s
myweb Deployment/myweb 32%/50% 1 3 2 10m
myweb Deployment/myweb 41%/50% 1 3 2 11m
myweb Deployment/myweb 48%/50% 1 3 2 11m
myweb Deployment/myweb 51%/50% 1 3 2 11m
myweb Deployment/myweb 59%/50% 1 3 2 11m
myweb Deployment/myweb 58%/50% 1 3 3 12m
myweb Deployment/myweb 42%/50% 1 3 3 12m
myweb Deployment/myweb 34%/50% 1 3 3 12m# 如果 300s 内平均负载小于标准值就会自动缩减集群规模
[rootmaster ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myweb Deployment/myweb 38%/50% 1 3 3 19m
myweb Deployment/myweb 21%/50% 1 3 3 20m
myweb Deployment/myweb 17%/50% 1 3 3 21m
myweb Deployment/myweb 7%/50% 1 3 3 22m
myweb Deployment/myweb 0%/50% 1 3 3 23m
myweb Deployment/myweb 0%/50% 1 3 2 25m
myweb Deployment/myweb 0%/50% 1 3 1 28m