Top

NSD CLOUD DAY07

  1. 案例1:kubectl基本命令
  2. 案例2:资源对象文件
  3. 案例3:集群扩容更新与回滚
  4. 多标签节点匹配

1 案例1:kubectl基本命令

1.1 问题

本案例要求学习使用kubectl基本命令来管理kubernetes,具体要求如下:

  1. 查询 节点 信息(node)
  2. 启动容器(run)
  3. 查询资源信息(deployment)
  4. 查询容器信息(pod)
  5. 进入容器(exec,attach)
  6. 删除资源(delete)

1.2 方案

Kubectl是用于控制Kubernetes集群的命令行工具。

Kubectl的语法格式如下:

kubectl [command] [TYPE] [NAME] [flags]

command: 子命令,如 create,get,describe,delete

type: 资源类型,可以表示为单数,复数或缩写形式

name: 资源的名称,如果省略,则显示所有资源信息

flags: 指定可选标志,或附加的参数

1.3 步骤

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

步骤一:kubectl命令练习(在master主机操作)

1)run创建容器资源。

语法格式:kubectl run 资源名称 -i -t --image=私有仓库镜像名称:标签

  1. [root@master ~]# kubectl run haha -i -t --image=192.168.1.100:5000/myos:v1804
  2. kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
  3. If you don't see a command prompt, try pressing enter.
  4.  
  5. [root@haha-8bbd48d7b-wcnkd /]# #注意:这里已经进入了容器
  6. [root@haha-8bbd48d7b-wcnkd /]# ifconfig
  7. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  8. inet 10.244.7.2 netmask 255.255.255.0 broadcast 0.0.0.0

2)get查询资源

语法格式:

kubectl get node 查询节点状态

kubectl get deployment 查询资源名称

kubectl get pod 查询pod容器资源

kubectl get pod -o wide 查询主机信息

kubectl get pod -o yaml 显示资源文件Yaml格式

  1. [root@master ~]# kubectl get nodes
  2. NAME     STATUS     ROLES     AGE     VERSION
  3. master         Ready     master     12h     v1.17.6
  4. node-0001         Ready    <none>     16h     v1.17.6
  5. node-0002     Ready     <none>     16h     v1.17.6
  6. node-0003     Ready     <none>     16h     v1.17.6
  7.  
  8. [root@master ~]# kubectl get deployment.apps
  9. NAME         READY     UP-TO-DATE AVAILABLE AGE
  10. haha         1/1     1      1      10m
  11.  
  12. [root@master ~]# kubectl get pod
  13. NAME    READY    STATUS    RESTARTS      AGE
  14. haha-xxxx    1/1    Running     1 14m
  15.  
  16. [root@master ~]# kubectl get pod -o wide
  17. NAME    READY    STATUS    RESTARTS     AGE    IP     NODE ... ...
  18. haha-xxxx    1/1    Running     1 14m    10.244.7.4     node-0003 ... ...

3)exec进入一个正在运行的容器中

语法格式:

kubectl exec -it 容器id 执行的命令

  1. [root@kube-master ~]# kubectl get pod
  2. NAME READY     STATUS    RESTARTS     AGE
  3. haha-8bbd48d7b-wcnkd     1/1     Running     0     31m
  4. #查看一个容器资源的名称
  5.  
  6. [root@kube-master ~]# kubectl exec -it haha-8bbd48d7b-wcnkd /bin/bash
  7. # 进入该容器中
  8. [root@haha-8bbd48d7b-wcnkd /]#

4)查看资源的详细信息(主要用于排错)

语法格式:

kubectl describe 资源类型 资源名称

  1. [root@kube-master ~]# kubectl describe deployment haha
  2. # 查看deployment资源的详细信息
  3. Name: haha
  4. Namespace:     default
  5. CreationTimestamp:    Wed, 04 Mar 2020 15:50:24 +0800
  6. ... ...
  7.  
  8. [root@kube-master ~]# kubectl describe pod haha-8bbd48d7b-wcnkd
  9. # 查看容器的详细信息
  10. Name:     haha-8bbd48d7b-wcnkd
  11. Namespace:      default
  12. Node:     kube-node1/192.168.1.11
  13. Start Time:     Wed, 04 Mar 2020 15:50:24 +0800
  14. Labels:     pod-template-hash=466804836
  15. ... ...

5)查看 console 终端的输出信息

  1. [root@kube-master ~]# kubectl attach haha-8bbd48d7b-wcnkd -c haha -i -t
  2. If you don't see a command prompt, try pressing enter.
  3. # 先通过attach进入一个容器
  4.  
  5. [root@haha-8bbd48d7b-wcnkd /]# echo hello world #在容器中echo输出信息
  6. hello world
  7. [root@haha-8bbd48d7b-wcnkd /]# Ctrl-p + Ctrl-q #按快捷键退出
  8. [root@kube-master ~]#
  9.  
  10. [root@kube-master ~]# kubectl logs haha-8bbd48d7b-wcnkd
  11. [root@haha-8bbd48d7b-wcnkd /]# echo hello world
  12. hello world

6)delete删除资源

语法格式:

kubectl delete 资源类型 资源名称

  1. [root@kube-master ~]# kubectl delete pod haha-xxxxxxxx
  2. pod "haha-8bbd48d7b-wcnkd" deleted
  3. # 删除pod,注意:这里的pod名称不能照抄!!!!
  4.  
  5. [root@kube-master ~]# kubectl get pod -o wide # 容器被删除后会自动重建
  6. NAME READY STATUS RESTARTS AGE IP      NODE
  7. haha-xxxxxxxx 1/1 Running 0     3s     10.254.9.2 kube-node2
  8. haha-xxxxxxxx 1/1 Terminating 2     1h     10.254.39.2 kube-node1
  9.  
  10. [root@kube-master ~]# kubectl get deployment #查看deployment资源
  11. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  12. haha 1 1 1 1 1h
  13.  
  14. [root@kube-master ~]# kubectl delete deployment haha
  15. deployment.extensions "haha" deleted
  16. # 删除deployment资源,容器彻底消失

2 案例2:资源对象文件

2.1 问题

本案例要求熟悉资源文件的语法,具体要求如下:

  1. 写一个 deployment 的资源文件
  2. 启动一个基本系统(myos.yaml)
  3. 启动一个 apache 服务(myweb.yaml)
  4. 熟悉 kubectl 查询资源信息(deployment)
  5. 熟悉 kubectl 查询容器信息(pod)
  6. 熟悉 kubectl 进入容器(exec,attach)
  7. 熟悉 kubectl 删除资源(delete)

2.2 步骤

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

步骤一:查看现有资源的资源对象文件(在master主机操作)

语法格式:

kubectl get 资源对象 资源名称 -o 格式(json|yaml)

  1. [root@kube-master ~]# kubectl get deployment apache -o yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Deployment
  4. metadata:
  5. annotations:
  6. ... ...
  7. # 导出deployment资源的资源对象文件,depoyment资源的名称为apache,导出yaml格式

步骤二:编写资源对象文件(在master主机操作)

注意:所有资源文件都在云盘第四阶段kubernetes/v1.17.6/config/目录有案例!!!

1)Pod资源文件

  1. [root@master ~]# vim mypod.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mypod
  7. spec:
  8. containers:
  9. - name: mylinux
  10. image: 192.168.1.100:5000/myos:v1804
  11. stdin: true
  12. tty: true
  13.     
  14. [root@master ~]# kubectl apply -f mypod.yaml
  15. pod/mypod created
  16. [root@master ~]# kubectl get pod
  17. NAME READY STATUS RESTARTS AGE
  18. mypod 1/1 Running 0 13s
  19. [root@master ~]# kubectl delete -f mypod.yaml
  20. pod "mypod" deleted
  21. [root@master ~]#

2)Deployment资源文件

  1. [root@master ~]# vim myapache.yaml
  2. ---
  3. kind: Deployment
  4. apiVersion: apps/v1
  5. metadata:
  6. name: myapache
  7. spec:
  8. selector:
  9. matchLabels:
  10. myapp: httpd
  11. replicas: 1
  12. template:
  13. metadata:
  14. labels:
  15. myapp: httpd
  16. spec:
  17. containers:
  18. - name: webcluster
  19. image: 192.168.1.100:5000/myos:httpd
  20. stdin: false
  21. tty: false
  22. ports:
  23. - protocol: TCP
  24. containerPort: 80
  25. restartPolicy: Always
  26.  
  27. [root@master ~]# kubectl apply -f myapache.yaml
  28. deployment.apps/myapache created
  29. [root@master ~]# kubectl get deployments.apps
  30. NAME READY UP-TO-DATE AVAILABLE AGE
  31. myapache 1/1 1 1 19s
  32. [root@master ~]# kubectl get pod
  33. NAME READY STATUS RESTARTS AGE
  34. myapache-69b494dc5c-bff95 1/1 Running 0 28s
  35. [root@master ~]#

3)备注

为了建立控制器和 pod 间的关联,kubernetes 先给每个 pod 打上一个标签(Label),然后再给相应的位置定义标签选择器(Label Selector),引用这些标签,资源文件的效果如下:

  1. ... ...        
  2. selector:      #声明标签选择器
  3. app: nginx     #为服务的后端选择标签
  4. ... ...
  5. metadata:
  6. labels:     #声明标签
  7. app: nginx     #定义标签名字(上下标签必须一致)
  8. ... ...

4)如何使用资源文件

使用资源文件管理对象,语法格式:kubectl (apply|create|delete) -f 资源文件

3 案例3:集群扩容更新与回滚

3.1 问题

本案例主要练习集群扩容更新与回滚,分别实现以下目标:

  1. 创建一个 myweb.yml 使用 apache 启动
  2. 练习集群扩容
  3. 更新:
  4. 从 Apache 滚动更新到 nginx服务
  5. 回滚 nginx 到 apache 服务
  6. 验证

3.2 步骤

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

步骤一:创建一个单节点的Web容器(在master主机操作操作)

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

各位同学需要提前下载素材文件并传到master主机。

  1. [root@master ~]# kubectl get deployments.apps
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. myapache 1/1 1 1 113s
  4. [root@master ~]# kubectl scale deployment myapache --replicas=3
  5. deployment.apps/myapache scaled
  6. [root@master ~]# kubectl get deployments.apps
  7. NAME READY UP-TO-DATE AVAILABLE AGE
  8. myapache 3/3 3 3 2m12s
  9. [root@master ~]#

步骤二:集群扩容(在master主机操作操作)

我们可以使用命令行调整容器副本数量,也可以通过修改资源文件、更新资源的方式调整容器副本数量。

  1. [root@master ~]# kubectl scale deployment.apps httpd-example --replicas=3

步骤三:集群更新与回滚

各位同学需要提前下载素材文件并传到master主机。

  1. [root@master config]# kubectl rollout history deployment myapache
  2. deployment.apps/myapache
  3. REVISION CHANGE-CAUSE
  4. 1 <none>
  5. [root@master ~]# curl http://10.244.3.5
  6. this is apache
  7. [root@master ~]# kubectl edit deployments.apps myapache
  8. deployment.apps/myapache edited
  9. [root@master ~]# curl http://10.244.2.6
  10. this is nginx
  11. [root@master ~]# kubectl rollout history deployment myapache
  12. deployment.apps/myapache
  13. REVISION CHANGE-CAUSE
  14. 1 <none>
  15. 2 <none>
  16. [root@master ~]# kubectl rollout undo deployment myapache --to-revision=1
  17. deployment.apps/myapache rolled back
  18. [root@master ~]# curl http://10.244.3.6
  19. this is apache
  20. [root@master ~]#

步骤三:节点标签选择器

  1. [root@master ~]# vim myapache.yaml
  2. ---
  3. kind: Deployment
  4. apiVersion: apps/v1
  5. metadata:
  6. name: myapache
  7. spec:
  8. selector:
  9. matchLabels:
  10. myapp: httpd
  11. replicas: 1
  12. template:
  13. metadata:
  14. labels:
  15. myapp: httpd
  16. spec:
  17. nodeName: node-0001 # 新增一行
  18. containers:
  19. - name: webcluster
  20. image: 192.168.1.100:5000/myos:httpd
  21. stdin: false
  22. tty: false
  23. ports:
  24. - protocol: TCP
  25. containerPort: 80
  26. restartPolicy: Always
  27.  
  28. [root@master ~]# kubectl delete -f myapache.yaml
  29. deployment.apps "myapache" deleted
  30. [root@master ~]# kubectl apply -f myapache.yaml
  31. deployment.apps/myapache created
  32. [root@master ~]# kubectl get pods -o wide
  33. NAME READY STATUS RESTARTS AGE IP NODE
  34. myapache-xxx 1/1 Running 0 3m49s 10.244.3.9 node-0001

4 多标签节点匹配

  1. [root@master ~]# kubectl delete -f myapache.yaml
  2. deployment.apps "myapache" deleted
  3. [root@master ~]# kubectl get nodes --show-labels
  4. NAME STATUS ROLES AGE VERSION LABELS
  5. master Ready master 10h v1.17.6 kubernetes.io/hostname=master ... ...
  6. node-0001 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0001 ... ...
  7. node-0002 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0002 ... ...
  8. node-0003 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0003 ... ...
  9. [root@master ~]# kubectl label nodes node-0002 node-0003 disktype=ssd
  10. node/node-0002 labeled
  11. node/node-0003 labeled
  12. [root@master ~]# kubectl get nodes --show-labels
  13. NAME STATUS ROLES AGE VERSION LABELS
  14. master Ready master 10h v1.17.6 kubernetes.io/hostname=master ... ...
  15. node-0001 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0001 ... ...
  16. node-0002 Ready <none> 10h v1.17.6 disktype=ssd ... ...
  17. node-0003 Ready <none> 10h v1.17.6 disktype=ssd ... ...
  18. [root@master ~]# vim myapache.yaml
  19. ---
  20. kind: Deployment
  21. apiVersion: apps/v1
  22. metadata:
  23. name: myapache
  24. spec:
  25. selector:
  26. matchLabels:
  27. myapp: httpd
  28. replicas: 1
  29. template:
  30. metadata:
  31. labels:
  32. myapp: httpd
  33. spec:
  34. nodeSelector:     # 新添加
  35. disktype: ssd # 新添加
  36. containers:
  37. - name: webcluster
  38. image: 192.168.1.100:5000/myos:httpd
  39. stdin: false
  40. tty: false
  41. ports:
  42. - protocol: TCP
  43. containerPort: 80
  44. restartPolicy: Always
  45.  
  46. [root@master ~]# kubectl scale deployment myapache --replicas=3
  47. deployment.apps/myapache scaled
  48. [root@master ~]# kubectl get pod -o wide
  49. NAME        READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
  50. myapache-xxx 1/1 Running 0 9s 10.244.1.7 node-0003 <none>
  51. myapache-xxx 1/1 Running 0 9s 10.244.2.8 node-0002 <none>
  52. myapache-xxx 1/1 Running 0 21s 10.244.2.7 node-0002 <none>
  53. [root@master ~]# kubectl delete -f myapache.yaml
  54. deployment.apps "myapache" deleted
  55. [root@master ~]# kubectl label nodes node-0002 node-0003 disktype-
  56. node/node-0002 labeled
  57. node/node-0003 labeled
  58. [root@master ~]# kubectl get nodes --show-labels
  59. NAME STATUS ROLES AGE VERSION LABELS
  60. master Ready master 10h v1.17.6 kubernetes.io/hostname=master ... ...
  61. node-0001 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0001 ... ...
  62. node-0002 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0002 ... ...
  63. node-0003 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0003 ... ...
  64. [root@master ~]#