作业完成后,将结果截图提交到腾讯文档:https://docs.qq.com/sheet/DQ1NmcllQdURSSHFu

1、k8s核心概念和集群搭建

1. 使用kubeadm搭建一个K8s集群

https://www.yuque.com/docs/share/205e49ce-3aac-46fb-8af3-9a100e45a7ab?#

2、新建命名空间,在该命名空间中创建一个pod

  • 命名空间名称:aliang-cka
  • pod名称:pod-01
  • 镜像:nginx
  1. kubectl create namespace aliang-cka
  2. kubectl run pod-01 --image=nginx --namespace=aliang-cka

习题 - 图1

3. 创建一个deployment并暴露Service

  • 名称:web
  • 镜像:nginx
  1. kubectl create deployment web --image=nginx
  2. kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

习题 - 图2

4. 列出命名空间下指定标签pod

  • 命名空间名称:kube-system
  • 标签:k8s-app=kube-dns
  1. kubectl get pod -n kube-system -l k8s-app=kube-dns --show-lables

习题 - 图3

4、K8s监控与日志

1. 查看pod日志,并将日志中Error的行记录到指定文件

  • pod名称:web
  • 文件:/opt/web
  1. kubectl get pod | grep web | awk '{print $1}' | xargs kubectl logs | grep -i error | tee /opt/web

习题 - 图4

2. 查看指定标签使用cpu最高的pod,并记录到到指定文件

  • 标签:app=web
  • 文件:/opt/cpu
  1. kubectl top pod --all-namespaces --sort-by=cpu --use-protocol-buffers --no-headers=true | head -1 | awk '{print $2}' | tee /opt/cpu

习题 - 图5

3. Pod里创建一个边车容器读取业务容器日志

  1. kubectl run read-log --image=busybox --command -o yaml --dry-run=client -- tail -f /opt/access.log > pod-read-log.yaml
  2. vi pod-read-log.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. run: read-log
  8. name: read-log
  9. spec:
  10. containers:
  11. - image: nginx
  12. name: nginx
  13. volumeMounts:
  14. - name: logs
  15. mountPath: /var/log/nginx
  16. - image: busybox
  17. name: busybox
  18. args: [/bin/sh, -c, 'tail -f /opt/access.log']
  19. volumeMounts:
  20. - name: logs
  21. mountPath: /opt
  22. volumes:
  23. - name: logs
  24. emptyDir: {}
  1. kubectl apply -f pod-read-log.yaml
  2. kubectl get all

习题 - 图6

习题 - 图7

5-1、应用程序生命周期管理-deployment

1. 创建一个deployment 副本数 3,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本

  • 名称:nginx
  • 镜像版本:1.16
  • 更新镜像版本:1.17
  1. # 创建一个deployment副本3
  2. kubectl create deployment nginx --image=nginx:1.16 --replicas=3
  3. # 版本升级(或者导出yaml修改镜像和kubectl edit编辑后重新应用)
  4. kubectl set image deployment/nginx nginx=nginx:1.17
  5. # - nginx=nginx:1.17
  6. # 容器名 = 镜像
  7. #回滚
  8. kubectl rollout undo deployment/nginx
  • —record 记录历史版本号,在之后的操作中会非常有用(只能用于yaml文件创建时或者set版本升级时使用)

<font style="background-color:#FADB14;">kubectl create -f nginx-deploy.yaml --record</font>

kubectl set image deploy/nginx web=nginx:1.18 --record

习题 - 图8

2. 给web deployment扩容副本数为3

  1. # 使用第一章的第三题
  2. kubectl create deployment web --image=nginx
  3. # 扩容deployment
  4. kubectl scale deployment/web --replicas=3

习题 - 图9

3. 把deployment输出json文件,再删除创建的deployment

  1. kubectl get deployment/web -o yaml | tee deployment-web.yaml
  2. kubectl delete -f deployment-web.yaml

习题 - 图10

4. 生成一个deployment yaml文件保存到/opt/deploy.yaml

  • 名称:web
  • 标签:app_env_stage=dev
  1. kubectl create deployment web --image=nginx:1.16 -o yaml --dry-run=client | tee /opt/deploy.yaml
  2. # vi打开文件,修改标签
  3. # 应用
  4. kubectl apply -f /opt/deploy.yaml

习题 - 图11

习题 - 图12

5. 【自定义】金丝雀发布:一小部分用户请求到新版本应用

  • Deployment:web-rollout
  • 升级之前的镜像:geray/nginx:v1.18.0
  • 副本数:4
  • 升级之后的镜像:geray/nginx:v1.17.10
  1. kubectl create deployment web-rollout --image=geray/nginx:v1.18.0 --replicas=4 -o yaml --dry-run=client > web-rollout-deploy.yaml
  2. kubectl apply -f web-rollout-deploy.yaml --record
  3. # 减速滚动升级
  4. kubectl patch deployment web-rollout -p '{"spec": {"minReadySeconds": 10}}'
  5. kubectl set image deployment web-rollout nginx=geray/nginx:v1.17.10 --record
  6. kubectl rollout pause deploy web-rollout
  7. kubectl rollout resume deploy web-rollout
  8. kubectl rollout history deploy web-rollout
  9. kubectl expose deployment web-rollout --type=NodePort --port=80 --target-port=80
  10. kubectl port-forward deployment web-rollout 80 80

5-2、K8s管理应用程序生命周期-pod

1. 创建一个pod,其中运行着nginx、redis、memcached、consul 4个容器

  1. docker pull nginx
  2. docker pull redis
  3. docker pull memcached
  4. docker pull consul
  5. kubectl run pod-demo --image=nginx -o yaml --dry-run=client > pod-demo.yaml
  6. vi pod-demo.yaml
  7. apiVersion: v1
  8. kind: Pod
  9. metadata:
  10. labels:
  11. run: pod-demo
  12. name: pod-demo
  13. spec:
  14. containers:
  15. - image: nginx
  16. name: nginx
  17. - image: redis
  18. name: redis
  19. - image: memcached
  20. name: memcached
  21. - image: consul
  22. name: consul
  23. kubectl apply -f pod-demo.yaml
  24. kubectl get all -l run=pod-demo

习题 - 图13

2. 在节点上配置kubelet托管启动一个pod

  • 节点:k8s-node1
  • pod名称:web
  • 镜像:nginx
  1. kubectl run web --image=nginx -o yaml --dry-run=client > pod-web-k8s-node1.yaml
  2. #将该yaml文件传输到k8s-node1节点的/etc/kubernetes/manifests/目录下
  3. scp pod-web-k8s-node1.yaml root@k8s-node1:/etc/kubernetes/manifests/
  4. kubectl get all -l run=web

习题 - 图14

3. 检查容器中文件是否创建,如果没有被检测到pod重启

  • 文件路径:/tmp/test.sock
  1. kubectl run pod-liveness --image=busybox -o yaml --dry-run=client > pod-liveness.yaml
  2. vi pod-liveness.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. run: pod-liveness
  8. name: pod-liveness
  9. spec:
  10. containers:
  11. - image: busybox
  12. name: pod-liveness
  13. args:
  14. - /bin/sh
  15. - -c
  16. - touch /tmp/test.sock; sleep 30; rm -rf /tmp/test.sock; sleep 600
  17. livenessProbe:
  18. exec:
  19. command:
  20. - cat
  21. - /tmp/test.sock
  22. initialDelaySeconds: 5
  23. periodSeconds: 5
  • <font style="color:rgb(34, 34, 34);">periodSeconds</font> 字段指定了 kubelet 应该每 5 秒执行一次存活探测
  • <font style="color:rgb(34, 34, 34);">initialDelaySeconds</font> 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒
  • cat<font style="color:rgb(34, 34, 34);"> </font>/tmp/test.sock kubelet 在容器内执行命令来进行探测,如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的
  1. kubectl apply -f pod-liveness.yaml
  2. kubectl get all

习题 - 图15

习题 - 图16

6、k8s调度

1、创建一个pod,分配到指定标签node上

• pod名称:web

• 镜像:nginx

• node标签:disk=ssd

  1. kubectl label node k8s-node1 disk=ssd
  2. # kubectl run web --image=nginx --labels="disk=ssd" 错误,这里是给pod打标签
  3. kubectl run web --image=nginx --overrides='{"spec": {"nodeSelector": {"disk": "ssd"}}}'

习题 - 图17

2、确保在每个节点上运行一个pod

• pod名称:nginx

• 镜像:nginx

  1. kubectl create deployment nginx --image=nginx -o yaml --dry-run=client > pod-daemonSet.yaml
  2. sed -i "s/Deployment/DaemonSet/#" pod-daemonSet.yaml
  3. #sed '1c apiVersion: apps/v1' pod-daemonSet.yaml
  4. #sed -i "s#v1#apps/v1#g" pod-daemonSet.yaml
  5. # sed '/dnsPolicy/'d pod-daemonSet.yaml
  6. kubectl apply -f pod-daemonSet.yaml

习题 - 图18

3、查看集群中状态为ready的node数量,并将结果写到指定文件

  1. kubectl get node | grep Ready | grep -v NotReady | wc -l

习题 - 图19