Deploy 控制器
# 清理 Pod ,使用控制器创建[root@master ~]# kubectl delete pod --all# 资源对象模板[root@master ~]# kubectl create deployment myweb --image=myos:httpd --dry-run=client -o yaml[root@master ~]# vim mydeploy.yaml---kind: Deployment # 资源对象类型apiVersion: apps/v1 # 版本metadata: # 元数据 name: myweb # 名称spec: # 详细定义 replicas: 2 # 副本数量 selector: # 定义标签选择器 matchLabels: # 支持 matchExpressions 表达式语法 app: httpd # 通过标签来确定那个 Pod 由它来管理 template: # 定义用来创建 Pod 的模板,以下为 Pod 定义 metadata: labels: app: httpd spec: restartPolicy: Always containers: - name: webserver image: myos:httpd imagePullPolicy: Always
[root@master ~]# kubectl apply -f mydeploy.yaml deployment.apps/myweb created[root@master ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGEmyweb 2/2 2 2 68s[root@master ~]# kubectl get replicasets NAME DESIRED CURRENT READY AGEmyweb-64b544dcbc 2 2 2 73s[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyweb-64b544dcbc-5mhqn 1/1 Running 0 76smyweb-64b544dcbc-nt6tz 1/1 Running 0 76s
ClusterIP 服务
# 创建服务访问集群[root@master ~]# vim websvc.yaml---kind: ServiceapiVersion: v1metadata: name: websvcspec: type: ClusterIP clusterIP: 10.245.1.80 selector: app: httpd ports: - protocol: TCP port: 80 targetPort: 80
[root@master ~]# kubectl apply -f websvc.yaml service/websvc created[root@master ~]# curl -m 3 http://10.245.1.80Welcome to The Apache.
Pod 维护管理
# 自维护自治理[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyweb-64b544dcbc-5mhqn 1/1 Running 0 4m16smyweb-64b544dcbc-nt6tz 1/1 Running 0 4m16s
# Pod 被删除后,Deploy 会自动创建新的 Pod 来维护集群的完整性[root@master ~]# kubectl delete pod myweb-64b544dcbc-5mhqn pod "myweb-64b544dcbc-5mhqn" deleted[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyweb-64b544dcbc-g8l9p 1/1 Running 0 3smyweb-64b544dcbc-nt6tz 1/1 Running 0 4m25s
集群扩缩容
# 设置 1 Pod 集群[root@master ~]# kubectl scale deployment myweb --replicas=1deployment.apps/myweb scaled[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyweb-64b544dcbc-nt6tz 1/1 Running 0 5m46s# 设置 3 Pod 集群[root@master ~]# kubectl scale deployment myweb --replicas=3deployment.apps/myweb scaled[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyweb-64b544dcbc-5sf5z 1/1 Running 0 3smyweb-64b544dcbc-6r6dw 1/1 Running 0 3smyweb-64b544dcbc-nt6tz 1/1 Running 0 5m56s
历史版本信息
# 查看历史版本[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION CHANGE-CAUSE1 <none>
# 添加注释信息[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="httpd.v1"deployment.apps/myweb annotated[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION CHANGE-CAUSE1 httpd.v1
滚动更新
# 修改镜像,滚动更新集群[root@master ~]# kubectl set image deployment myweb webserver=myos:nginxdeployment.apps/myweb image updated # 给新版本添加注释信息[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="nginx.v1"deployment.apps/myweb annotated# 查看历史版本信息[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION CHANGE-CAUSE1 httpd.v12 nginx.v1
# 访问验证服务[root@master ~]# curl -m 3 http://10.245.1.80Nginx is running !
版本回滚
# 历史版本与回滚[root@master ~]# kubectl rollout undo deployment myweb --to-revision 1deployment.apps/myweb rolled back[root@master ~]# curl -m 3 http://10.245.1.80Welcome to The Apache.
[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION CHANGE-CAUSE2 nginx.v13 httpd.v1
# 删除控制器方法1[root@master ~]# kubectl delete deployments myweb deployment.apps "myweb" deleted# 删除控制器方法2[root@master ~]# kubectl delete -f mydeploy.yamldeployment.apps "myweb" deleted
DaemonSet
资源对象案例
[root@master ~]# cp -a mydeploy.yaml myds.yaml[root@master ~]# vim myds.yaml---kind: DaemonSet # 资源对象类型apiVersion: apps/v1metadata: name: myds # 控制器名称spec: # replicas: 2 # 删除副本参数 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: restartPolicy: Always containers: - name: webserver image: myos:httpd imagePullPolicy: Always
[root@master ~]# kubectl apply -f myds.yaml daemonset.apps/myds created[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS IP NODEmyds-msrcx 1/1 Running 0 10.244.1.11 node-0001myds-lwq8l 1/1 Running 0 10.244.2.17 node-0002myds-4wt72 1/1 Running 0 10.244.3.14 node-0003myds-6k82t 1/1 Running 0 10.244.4.15 node-0004myds-9c6wc 1/1 Running 0 10.244.5.19 node-0005
污点干扰
# 设置污点,重建 daemonset[root@master ~]# kubectl taint node node-0001 k=v:NoSchedulenode/node-0001 tainted[root@master ~]# kubectl delete -f myds.yaml daemonset.apps "myds" deleted[root@master ~]# kubectl apply -f myds.yaml daemonset.apps/myds created# 有污点不会部署,特殊需求可以设置容忍策略[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyds-pkdn9 1/1 Running 0 2smyds-pkp6b 1/1 Running 0 2smyds-j84cw 1/1 Running 0 2smyds-5c69p 1/1 Running 0 2s# 删除污点后会立即部署[root@master ~]# kubectl taint node node-0001 k=v:NoSchedule-node/node-0001 untainted[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyds-2c86p 1/1 Running 0 1smyds-pkdn9 1/1 Running 0 9smyds-pkp6b 1/1 Running 0 9smyds-j84cw 1/1 Running 0 9smyds-5c69p 1/1 Running 0 9s
# 删除控制器[root@master ~]# kubectl delete -f myds.yaml daemonset.apps "myds" deleted
Job/CronJob
Job 控制器
# 资源对象模板[root@master ~]# kubectl create job myjob --image=myos:8.5 --dry-run=client -o yaml -- sleep 3[root@master ~]# vim myjob.yaml ---kind: JobapiVersion: batch/v1metadata: name: myjobspec: template: # 以下定义 Pod 模板 spec: restartPolicy: OnFailure containers: - name: myjob image: myos:8.5 command: ["/bin/bash"] args: - -c - | sleep 3 exit $((RANDOM%2))
[root@master ~]# kubectl apply -f myjob.yaml job.batch/myjob created
# 失败了会重启[root@master ~]# kubectl get pods -l job-name=myjob -wNAME READY STATUS RESTARTS AGEmyjob--1-lrtbk 1/1 Running 0 2smyjob--1-lrtbk 0/1 Error 0 4smyjob--1-lrtbk 1/1 Running 1 (1s ago) 5smyjob--1-lrtbk 0/1 Completed 1 9s
[root@master ~]# kubectl get jobs.batch NAME COMPLETIONS DURATION AGEmyjob 1/1 8s 12s
# 删除Job控制器[root@master ~]# kubectl delete -f myjob.yaml job.batch "myjob" deleted
资源对象案例
# 资源对象模板[root@master ~]# kubectl create cronjob mycj --image=myos:8.5 --schedule='* * * * *' --dry-run=client -o yaml -- sleep 3[root@master ~]# vim mycj.yaml---kind: CronJobapiVersion: batch/v1metadata: name: mycjspec: schedule: "* * * * 1-5" jobTemplate: # 以下定义 Job 模板 spec: template: spec: restartPolicy: OnFailure containers: - name: myjob image: myos:8.5 command: ["/bin/bash"] args: - -c - | sleep 3 exit $((RANDOM%2))
[root@master ~]# kubectl apply -f mycj.yaml cronjob.batch/mycj created[root@master ~]# kubectl get cronjobs NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGEmycj */1 * * * 1-5 False 0 <none> 4s
# 按照时间周期,每分钟触发一个任务[root@master ~]# kubectl get jobs -wNAME READY STATUS RESTARTSmycj-27808172--1-w6sbx 0/1 Pending 0mycj-27808172--1-w6sbx 0/1 ContainerCreating 0mycj-27808172--1-w6sbx 1/1 Running 0mycj-27808172--1-w6sbx 0/1 Completed 1
# 保留三次结果,多余的会被删除[root@master ~]# kubectl get jobs NAME COMPLETIONS DURATION AGEmycj-27605367 1/1 31s 3m30smycj-27605368 1/1 31s 2m30smycj-27605369 1/1 31s 90smycj-27605370 0/1 30s 30s[root@master ~]# kubectl get jobs NAME COMPLETIONS DURATION AGEmycj-27605368 1/1 31s 2m33smycj-27605369 1/1 31s 93smycj-27605370 1/1 31s 33s
# 删除CJ控制器[root@master ~]# kubectl delete -f mycj.yaml cronjob.batch "mycj" deleted
StatefulSet
headless 服务
# 配置 headless 服务[root@master ~]# cp websvc.yaml mysvc2.yaml [root@master ~]# vim mysvc2.yaml ---kind: ServiceapiVersion: v1metadata: name: mysvc2 # 服务名称spec: type: ClusterIP clusterIP: None # 设置 IP 为 None selector: app: httpd ports: - protocol: TCP port: 80 targetPort: 80
[root@master ~]# kubectl apply -f mysvc2.yaml service/mysvc2 created[root@master ~]# kubectl get service mysvc2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmysvc2 ClusterIP None <none> 80/TCP 61s
资源对象文件
[root@master ~]# cp -a mydeploy.yaml mysts.yaml[root@master ~]# vim mysts.yaml---kind: StatefulSet # 资源对象类型apiVersion: apps/v1metadata: name: mysts # 控制器名称spec: serviceName: mysvc2 # 新增 headless 服务名称 replicas: 3 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: restartPolicy: Always containers: - name: webserver image: myos:httpd imagePullPolicy: Always [root@master ~]# kubectl apply -f mysts.yaml statefulset.apps/mysts created
[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmysts-0 1/1 Running 0 3smysts-1 1/1 Running 0 2smysts-2 1/1 Running 0 1s
[root@master ~]# host mysts-0.mysvc2.default.svc.cluster.local 10.245.0.10Using domain server:Name: 10.245.0.10Address: 10.245.0.10#53Aliases:
mysts-0.mysvc2.default.svc.cluster.local has address 10.244.1.81
[root@master ~]# host mysvc2.default.svc.cluster.local 10.245.0.10Using domain server:Name: 10.245.0.10Address: 10.245.0.10#53Aliases:
mysvc2.default.svc.cluster.local has address 10.244.3.82mysvc2.default.svc.cluster.local has address 10.244.2.83mysvc2.default.svc.cluster.local has address 10.244.1.81
# 删除sts控制器[root@master ~]# kubectl delete -f mysts.yaml -f mysvc2.yamlstatefulset.apps "mysts" deletedservice "mysvc2" deleted
弹性云服务
创建后端服务
# 为 Deploy 模板添加资源配额[root@master ~]# vim mydeploy.yaml ---kind: DeploymentapiVersion: apps/v1metadata: name: mywebspec: replicas: 1 # 修改副本数量 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: restartPolicy: Always containers: - name: webserver image: myos:httpd imagePullPolicy: Always resources: # 为该资源设置配额 requests: # HPA 控制器会根据配额使用情况伸缩集群 cpu: 200m # CPU 配额
[root@master ~]# vim websvc.yaml---kind: ServiceapiVersion: v1metadata: name: websvcspec: type: ClusterIP clusterIP: 10.245.1.80 selector: app: httpd ports: - protocol: TCP port: 80 targetPort: 80
[root@master ~]# kubectl apply -f mydeploy.yaml -f websvc.yamldeployment.apps/myweb createdservice/websvc created
# 验证服务[root@master ~]# kubectl top podsNAME CPU(cores) MEMORY(bytes) myweb-c8c66f894-2cfjv 1m 17Mi [root@master ~]# curl -s http://10.245.1.80Welcome to The Apache.
创建 HPA 控制器
[root@master ~]# vim myhpa.yaml ---kind: HorizontalPodAutoscalerapiVersion: autoscaling/v1metadata: name: mywebspec: minReplicas: 1 maxReplicas: 5 targetCPUUtilizationPercentage: 50 scaleTargetRef: kind: Deployment apiVersion: apps/v1 name: myweb
[root@master ~]# kubectl apply -f myhpa.yaml horizontalpodautoscaler.autoscaling/myweb created
# 刚刚创建 unknown 是正常现象,最多等待 60s 就可以正常获取数据[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling NAME REFERENCE TARGETS MINPODS MAXPODS REPLICASmyweb Deployment/myweb <unknown>/50% 1 5 0
[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling NAME REFERENCE TARGETS MINPODS MAXPODS REPLICASmyweb Deployment/myweb 0%/50% 1 5 1
验证测试
# 终端 1 访问提高负载[root@master ~]# while sleep 1;do curl -s "http://10.245.1.80/info.php?id=100000" -o /dev/nulldone# 终端 2 监控 HPA 变化[root@master ~]# kubectl get hpa -wNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEmyweb Deployment/myweb 0%/50% 1 3 1 8m21smyweb Deployment/myweb 49%/50% 1 3 1 9mmyweb Deployment/myweb 56%/50% 1 3 1 9m15smyweb Deployment/myweb 56%/50% 1 3 2 9m30smyweb Deployment/myweb 37%/50% 1 3 2 9m45smyweb Deployment/myweb 32%/50% 1 3 2 10mmyweb Deployment/myweb 41%/50% 1 3 2 11mmyweb Deployment/myweb 48%/50% 1 3 2 11mmyweb Deployment/myweb 51%/50% 1 3 2 11mmyweb Deployment/myweb 59%/50% 1 3 2 11mmyweb Deployment/myweb 58%/50% 1 3 3 12mmyweb Deployment/myweb 42%/50% 1 3 3 12mmyweb Deployment/myweb 34%/50% 1 3 3 12m
# 如果 300s 内平均负载小于标准值,就会自动缩减集群规模[root@master ~]# kubectl get hpa -wNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEmyweb Deployment/myweb 38%/50% 1 3 3 19mmyweb Deployment/myweb 21%/50% 1 3 3 20mmyweb Deployment/myweb 17%/50% 1 3 3 21mmyweb Deployment/myweb 7%/50% 1 3 3 22mmyweb Deployment/myweb 0%/50% 1 3 3 23mmyweb Deployment/myweb 0%/50% 1 3 2 25mmyweb Deployment/myweb 0%/50% 1 3 1 28m
拓展提高项目
项目
WEB集群项目:
使用 Nginx 搭建 web 集群,动态页面由 PHP 和 Tomcat 集群解析
使用 NFS 存放网页
将访问日志存放在计算节点的 /var/weblog 目录下
弹性部署 PHP、Tomcat 集群服务