Top

NSD CLOUD DAY08

  1. 案例1:创建DaemonSet资源文件
  2. 驱逐容器案例
  3. 案例2:job和cronjob控制器的创建资源文件
  4. 案例3:编写service资源文件(一)
  5. 案例4:编写service资源文件(二)
  6. 案例5:对外发布服务

1 案例1:创建DaemonSet资源文件

1.1 问题

本案例要求创建DaemonSet资源文件,具体要求如下:

  1. 设置污点策略

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建daemonset资源(在master主机操作)

1)查看、学习daemonset资源文件(仅查看即可)。

资源文件在云盘第四阶段kubernetes/v1.17.6/config/目录下。

  1. [root@master ~]# vim mynginx.yaml
  2. ---
  3. kind: DaemonSet
  4. apiVersion: apps/v1
  5. metadata:
  6. name: mynginx
  7. spec:
  8. selector:
  9. matchLabels:
  10. myapp: nginx
  11. template:
  12. metadata:
  13. labels:
  14. myapp: nginx
  15. spec:
  16. containers:
  17. - name: nginxcluster
  18. image: 192.168.1.100:5000/myos:nginx
  19. stdin: false
  20. tty: false
  21. ports:
  22. - protocol: TCP
  23. containerPort: 80
  24. restartPolicy: Always
  25.  
  26. [root@master ~]# kubectl apply -f mynginx.yaml
  27. daemonset.apps/mynginx created
  28. [root@master ~]# kubectl get pod -o wide
  29. NAME READY STATUS RESTARTS AGE IP NODE
  30. mynginx-77jtf 1/1 Running 0 6s 10.244.3.9 node-0001
  31. mynginx-cwdzt 1/1 Running 0 6s 10.244.1.9 node-0003
  32. mynginx-z2kl6 1/1 Running 0 6s 10.244.2.10 node-0002
  33. [root@master ~]#

步骤二:设置污点策略(在master主机操作)

1)查看污点标签

污点标签包括:

  1. [root@master ~]# kubectl describe node master
  2. ... ...
  3. Taints: node-role.kubernetes.io/master:NoSchedule
  4. ... ...

2)设置、删除污点标签

注意:可以自定义添加修改标签

注意:不要修改所有系统默认自带的标签

  1. [root@master ~]# kubectl taint node node-0001 key=value:NoSchedule
  2. # 给node-0001节点设置污点标签,设置NoSchedule标签
  3.  
  4. [root@master ~]# kubectl taint node node-0001 key-
  5. # 删除node-0001的污点标签

步骤二:设置污点策略(在master主机操作)

nodeSelector是节点选择约束的最简单推荐形式。

我们可以给节点打上标签,根据标签来选择需要的节点

  1. 查看标签的命令:
  2. [root@master ~]# kubectl get node --show-labels
  3. 设置标签的命令
  4. [root@master ~]# kubectl label nodes <node-name> <label-key>=<label-value>
  5. 删除标签的命令
  6. [root@master ~]# kubectl label nodes <node-name> <label-key>-

污点案例:

  1. [root@master ~]# kubectl delete -f mynginx.yaml
  2. daemonset.apps "mynginx" deleted
  3. [root@master ~]# kubectl describe nodes |grep -P "^Taints"
  4. Taints: node-role.kubernetes.io/master:NoSchedule
  5. Taints: <none>
  6. Taints: <none>
  7. Taints: <none>
  8. [root@master ~]# kubectl taint node node-0001 k1=v1:NoSchedule
  9. node/node-0001 tainted
  10. [root@master ~]# kubectl apply -f mynginx.yaml
  11. daemonset.apps/mynginx created
  12. [root@master ~]# kubectl get pods
  13. NAME READY STATUS RESTARTS AGE
  14. mynginx-f2rxh 1/1 Running 0 4s
  15. mynginx-n7xsw 1/1 Running 0 4s
  16. [root@master ~]# kubectl taint node node-0001 k1-
  17. node/node-0001 untainted
  18. [root@master ~]# kubectl get pods
  19. NAME READY STATUS RESTARTS AGE
  20. mynginx-f2rxh 1/1 Running 0 105s
  21. mynginx-hp6f2 1/1 Running 0 2s
  22. mynginx-n7xsw 1/1 Running 0 105s
  23. [root@master ~]#

2 驱逐容器案例

  1. [root@master ~]# kubectl apply -f myapache.yaml
  2. deployment.apps/myapache created
  3. [root@master ~]# kubectl scale deployment myapache --replicas=3
  4. deployment.apps/myapache scaled
  5. [root@master ~]# kubectl get pod -o wide
  6. NAME READY STATUS RESTARTS AGE IP NODE
  7. myapache-7d689bf8f-xq7l6 1/1 Running 0 2m23s 10.244.3.11 node-0001
  8. myapache-7d689bf8f-b4d5f 1/1 Running 0 9s 10.244.2.14 node-0002
  9. myapache-7d689bf8f-mzcgw 1/1 Running 0 9s 10.244.1.13 node-0003
  10. mynginx-hp6f2 1/1 Running 0 5m25s 10.244.3.10 node-0001
  11. mynginx-f2rxh 1/1 Running 0 7m8s 10.244.2.11 node-0002
  12. mynginx-4f7tl 1/1 Running 0 20s 10.244.1.12 node-0003
  13. [root@master ~]# kubectl taint node node-0003 k1=v1:NoExecute
  14. node/node-0003 tainted
  15. [root@master ~]# kubectl get pod -o wide
  16. NAME READY STATUS RESTARTS AGE IP NODE
  17. myapache-7d689bf8f-xq7l6 1/1 Running 0 2m23s 10.244.3.11 node-0001
  18. myapache-7d689bf8f-b4d5f 1/1 Running 0 9s 10.244.2.14 node-0002
  19. myapache-7d689bf8f-mzcgw 1/1 Running 0 9s 10.244.2.15 node-0002
  20. mynginx-hp6f2 1/1 Running 0 5m25s 10.244.3.10 node-0001
  21. mynginx-f2rxh 1/1 Running 0 7m8s 10.244.2.11 node-0002
  22. [root@master ~]# kubectl taint node node-0003 k1-
  23. node/node-0003 untainted
  24. [root@master ~]# kubectl get pod -o wide
  25. NAME READY STATUS RESTARTS AGE IP NODE
  26. myapache-7d689bf8f-xq7l6 1/1 Running 0 2m23s 10.244.3.11 node-0001
  27. myapache-7d689bf8f-b4d5f 1/1 Running 0 9s 10.244.2.14 node-0002
  28. myapache-7d689bf8f-mzcgw 1/1 Running 0 9s 10.244.2.15 node-0002
  29. mynginx-hp6f2 1/1 Running 0 5m25s 10.244.3.10 node-0001
  30. mynginx-f2rxh 1/1 Running 0 7m8s 10.244.2.11 node-0002
  31. mynginx-9s9z4 1/1 Running 0 34s 10.244.1.14 node-0003
  32. [root@master ~]#

3 案例2:job和cronjob控制器的创建资源文件

3.1 问题

本案例练习书写job和cronjob控制器的资源文件。

  1. 熟悉job控制器的资源文件
  2. 熟悉cronjob控制器的资源文件

3.2 步骤

实现此案例需要按照如下步骤进行。

注意:资源文件在云盘第四阶段kubernetes/v1.17.6/config/目录下。

各位同学需要提前将该目录下的素材下载到master主机。

步骤一:创建job计划任务控制器(在master主机操作)

job任务是单任务

  1. [root@master ~]# vim myjob.yaml
  2. ---
  3. apiVersion: batch/v1
  4. kind: Job
  5. metadata:
  6. name: pi
  7. spec:
  8. template:
  9. spec:
  10. containers:
  11. - name: pi
  12. image: 192.168.1.100:5000/myos:v1804
  13. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  14. restartPolicy: OnFailure
  15. [root@master config]# kubectl apply -f myjob.yaml
  16. job.batch/pi created
  17. [root@master config]# kubectl get job
  18. NAME COMPLETIONS DURATION AGE
  19. pi 1/1 2s 7s
  20. [root@master config]# kubectl get pod
  21. NAME READY STATUS RESTARTS AGE
  22. pi-gvfwj 0/1 Completed 0 15s
  23. # 查看终端结果
  24. [root@master config]# kubectl logs pi-gvfwj

步骤二:创建cronjob计划任务控制器(在master主机操作)

cronjob任务的本质是多次创建job(周期性计划任务)

  1. [root@master ~]# vim mycronjob.yaml
  2. ---
  3. apiVersion: batch/v1beta1
  4. kind: CronJob
  5. metadata:
  6. name: cronjob-pi
  7. spec:
  8. schedule: "*/1 * * * *"
  9. jobTemplate:
  10. spec:
  11. template:
  12. spec:
  13. containers:
  14. - name: pi
  15. image: 192.168.1.100:5000/myos:v1804
  16. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  17. restartPolicy: OnFailure
  18. [root@master ~]# kubectl apply -f mycronjob.yaml
  19. cronjob.batch/cronjob-pi created
  20. [root@master ~]# kubectl get cronjobs.batch
  21. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  22. cronjob-pi */1 * * * * False 0 <none> 10s
  23. [root@master ~]# kubectl get pod
  24. NAME READY STATUS RESTARTS AGE
  25. cronjob-pi-1595410620-vvztx 0/1 Completed 0 62s

提示:需要等待 1 分钟才能看到变化。

4 案例3:编写service资源文件(一)

4.1 问题

本案例要求学习service资源文件,具体要求如下:

  1. 创建service服务,访问后端apache
  2. 测试负载均衡
  3. Headless 服务

4.2 方案

注意事项:

今日课程所用到的案例需要依赖前面docker课程中制作的镜像,必须将前面课程中的镜像全部导入到私有仓库(192.168.1.100服务器),镜像列表如下:

busybox:latest

myos:v1804

myos:httpd

myos:php-fpm

myos:nginx

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建service资源(在master主机操作)

1)创建2副本的Web服务容器

资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/apache-example.yaml,各位同学需要提前下载至自己的master主机。

使用资源文件创建一个多部分的容器环境,默认多副本会自动分配到不同的主机上运行。

2)删除一个pod,观察变化

当发现某一个pod不能使用的时候RS会在其他机器上在创建一个相同的pod,及其对应的容器。

  1. [root@master ~]# kubectl apply -f myapache.yaml
  2. deployment.apps/myapache created
  3. [root@master ~]# kubectl scale deployment myapache --replicas=2
  4. deployment.apps/myapache scaled
  5. [root@master ~]# kubectl get pod -o wide
  6. NAME READY STATUS RESTARTS AGE IP NODE
  7. myapache-7d689bf8f-c268l 1/1 Running 0 13s 10.244.2.16 node-0002
  8. myapache-7d689bf8f-4z225 1/1 Running 0 5s 10.244.1.15 node-0003
  9. [root@master ~]# kubectl delete pod myapache-7d689bf8f-4z225
  10. pod "myapache-7d689bf8f-4z225" deleted
  11. [root@master ~]# kubectl get pod -o wide
  12. NAME READY STATUS RESTARTS AGE IP NODE
  13. myapache-7d689bf8f-c268l 1/1 Running 0 38s 10.244.2.16 node-0002
  14. myapache-7d689bf8f-mccqv 1/1 Running 0 13s 10.244.3.12 node-0001
  15. [root@master ~]#

3)service

因为容器随时都也被重建,其IP地址也跟着随机变化,我们如何访问容器呢?

service就是解决这一个问题的方法,service会创建一个cluster ip,service总能找到对应的 pod,且 cluster ip保持不变,如果有pod对应多个容器,service 会自动在多个容器间实现负载均衡。

创建service的资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/service-example.yaml,各位同学提前下载该资源文件。

  1. [root@master ~]# vim clusterip.yaml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. name: myapache
  7. spec:
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 80
  12. selector:
  13. myapp: httpd # 标签必须与 deploy 资源文件中一致
  14. type: ClusterIP
  15. [root@master config]# kubectl apply -f clusterip.yaml
  16. service/myapache created
  17. [root@master config]# kubectl get service
  18. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  19. kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 22h
  20. myapache ClusterIP 10.254.235.248 <none> 80/TCP 4s

4)验证效果

Service提供的集群IP,仅可以在集群内可以直接访问服务,但集群外无法访问服务。

下面测试访问使用的集群IP是随机的,不能照抄!!!

  1. [root@master ~]# kubectl apply -f mypod.yaml
  2. pod/mypod created
  3. [root@master ~]# kubectl exec -it mypod -- /bin/bash
  4. [root@mypod /]# curl http://10.254.235.248/info.php
  5. <pre>
  6. Array
  7. (
  8. [REMOTE_ADDR] => 10.244.1.16
  9. [REQUEST_METHOD] => GET
  10. [HTTP_USER_AGENT] => curl/7.29.0
  11. [REQUEST_URI] => /info.php
  12. )
  13. php_host: myapache-7d689bf8f-mccqv
  14. 1229
  15. [root@mypod /]# curl http://10.254.235.248/info.php
  16. <pre>
  17. Array
  18. (
  19. [REMOTE_ADDR] => 10.244.1.16
  20. [REQUEST_METHOD] => GET
  21. [HTTP_USER_AGENT] => curl/7.29.0
  22. [REQUEST_URI] => /info.php
  23. )
  24. php_host: myapache-7d689bf8f-c268l
  25. 1229
  26. [root@mypod /]#
  27. # 在master上执行扩容节点
  28. [root@master ~]# kubectl scale deployment myapache --replicas=3
  29. # 服务本质是LVS规则
  30. [root@master ~]# ipvsadm -L -n
  31. TCP 10.254.235.248:80 rr
  32. -> 10.244.1.17:80 Masq 1 0 0
  33. -> 10.244.2.16:80 Masq 1 0 0
  34. -> 10.244.3.12:80 Masq 1 0 0
  35. -----------------------------------------------------------------------------------------
  36. # 在pod里访问
  37. [root@pod-example /]# curl http://10.254.78.148/info.php
  38. ... ...
  39. php_host:     myapache-7d689bf8f-lpt89
  40. ... ...
  41. php_host:     myapache-7d689bf8f-mccqv
  42. ... ...
  43. php_host:     myapache-7d689bf8f-c268l

步骤二:使用nodeport发布服务(在master主机操作)

  1. [root@master ~]# vim mynodeport.yaml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. name: mynodeport
  7. spec:
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 80
  12. selector:
  13. myapp: httpd
  14. type: NodePort # 指定服务类型
  15. [root@master ~]# kubectl apply -f mynodeport.yaml
  16. [root@master ~]# kubectl get service
  17. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  18. mynodeport NodePort 10.254.105.233 <none> 80:31410/TCP 4s
  19. #---------------------------所有node节点31410端口均可访问-----------------------------------
  20. # 在跳板机上访问服务
  21. [root@ecs-proxy ~]# curl http://192.168.1.31:31410/info.php
  22. [root@ecs-proxy ~]# curl http://192.168.1.32:31410/info.php
  23. [root@ecs-proxy ~]# curl http://192.168.1.33:31410/info.php

5 案例4:编写service资源文件(二)

5.1 问题

本案例要求创建 headless 服务,具体要求如下:

  1. 创建headless服务,并从集群外部测试访问效果

5.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建nodeport服务(在master主机操作)

  1. [root@master ~]# vim myheadless.yaml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. name: myheadless
  7. spec:
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 80
  12. selector:
  13. myapp: httpd
  14. type: ClusterIP
  15. clusterIP: None # 新添加
  16. [root@master ~]# kubectl apply -f myheadless.yaml
  17. service/myheadless created
  18. [root@master ~]# kubectl get service
  19. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  20. kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 22h
  21. myapache ClusterIP 10.254.235.248 <none> 80/TCP 7m52s
  22. myheadless ClusterIP None <none> 80/TCP 3s
  23. #-----------------------------------进入pod查看解析结果------------------------------------
  24. [root@master ~]# kubectl exec -it pod-example -- /bin/bash
  25. [root@mypod /]# yum install -y bind-utils
  26. [root@mypod /]# host myheadless.default.svc.cluster.local
  27. myheadless.default.svc.cluster.local has address 10.244.3.12
  28. myheadless.default.svc.cluster.local has address 10.244.1.17
  29. myheadless.default.svc.cluster.local has address 10.244.2.16

6 案例5:对外发布服务

6.1 问题

本案例主要练习ingress控制器,分别实现以下目标:

  1. 安装配置ingress控制器
  2. 通过ingress向外发布服务

6.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:安装ingress控制器(在master主机操作操作)

ingress控制器对应的镜像文件已经共享在云盘第四阶段kubernetes/v1.17.6/ingress/ingress-nginx.tar.gz。各位同学需要提前下载。

1) 首先需要将ingress镜像上传至私有镜像仓库(192.168.1.100服务器)

  1. [root@master ~]# docker load -i ingress-nginx.tar.gz
  2. [root@master ~]# docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller 192.168.1.100:5000/nginx-ingress-controller:0.30.0
  3. [root@master ~]# docker push 192.168.1.100:5000/nginx-ingress-controller:0.30.0

2) 验证仓库

  1. [root@master ~]#curl http://192.168.1.100:5000/v2/nginx-ingress-controller/tags/list
  2. {"name":"nginx-ingress-controller","tags":["0.30.0"]}
  3.  
  4. [root@master ~]# kubectl apply -f httpd-example-v1.yaml
  5. deployment.apps/web-example configured

3) 创建ingress资源

资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/ingress/目录下,各位同学需要自行下载该资源文件,并需要修改该文件才可以使用。

修改资源文件mandatory.yaml,指定启动ingress容器时应该从私有仓库下载镜像,而默认指定的是官网。

  1. [root@master ~]# vim ingress/mandatory.yaml #修改镜像文件image的路径
  2. 221: image: 192.168.1.100:5000/nginx-ingress-controller:0.30.0
  3.  
  4. [root@master ~]# kubectl create -f ingress/mandatory.yaml #创建资源
  5. namespace/ingress-nginx created
  6.  
  7. [root@master ~]# kubectl -n ingress-nginx get pod #查看资源
  8. NAME         READY     STATUS RESTARTS AGE
  9. nginx-ingress-controller-fc6766d7-xtsp2     1/1     Running 0     50m

步骤二:通过ingress对外发布容器服务(在master主机操作操作)

1)创建资源,通过ingress映射内部服务

  1. [root@master ~]# vim ingress-example.yaml
  2. ---
  3. apiVersion: extensions/v1beta1
  4. kind: Ingress                            # 资源对象类型
  5. metadata:
  6. name: my-app                        # ingress 资源名称
  7. annotations:
  8. kubernetes.io/ingress.class: "nginx"
  9. spec:
  10. backend:                            # 后端服务
  11. serviceName: apache-service        # service 名称,需要查看之前实验创建的名称
  12. servicePort: 80                    # 服务端口号,是服务的 Port
  13.  
  14. #注意:这里的apache-service是前面实验创建的service的名称
  15. #前面service创建的集群IP只能在内部访问,现在通过inpress映射service
  16. #用户访问ingress生成的IP就会自动映射到service的集群IP,集群IP再映射到容器IP
  17.  
  18. [root@master ~]# kubectl apply -f ingress-example.yaml

2)验证效果

  1. [root@master ~]# kubectl get ingress #查看ingress资源,查看inpressIP地址
  2. NAME HOSTS     ADDRESS         PORTS     AGE
  3. my-app         *            192.168.1.31 80            16s
  4. ------------------------------------------------------------------------------
  5.  
  6. [root@localhost ~]# curl http://192.168.1.31 #现在,任意主机都可以访问服务
  7. <pre>
  8. Array
  9. (
  10. [REMOTE_ADDR] => 10.244.6.1
  11. [REQUEST_METHOD] => GET
  12. [HTTP_USER_AGENT] => curl/7.29.0
  13. [REQUEST_URI] => /
  14. )
  15. php_host:     apache-example-9d8577cf-lw74h