作业完成后,将结果截图提交到腾讯文档: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
kubectl create namespace aliang-ckakubectl run pod-01 --image=nginx --namespace=aliang-cka

3. 创建一个deployment并暴露Service
- 名称:web
- 镜像:nginx
kubectl create deployment web --image=nginxkubectl expose deployment web --port=80 --target-port=80 --type=NodePort

4. 列出命名空间下指定标签pod
- 命名空间名称:kube-system
- 标签:k8s-app=kube-dns
kubectl get pod -n kube-system -l k8s-app=kube-dns --show-lables

4、K8s监控与日志
1. 查看pod日志,并将日志中Error的行记录到指定文件
- pod名称:web
- 文件:/opt/web
kubectl get pod | grep web | awk '{print $1}' | xargs kubectl logs | grep -i error | tee /opt/web

2. 查看指定标签使用cpu最高的pod,并记录到到指定文件
- 标签:app=web
- 文件:/opt/cpu
kubectl top pod --all-namespaces --sort-by=cpu --use-protocol-buffers --no-headers=true | head -1 | awk '{print $2}' | tee /opt/cpu

3. Pod里创建一个边车容器读取业务容器日志
kubectl run read-log --image=busybox --command -o yaml --dry-run=client -- tail -f /opt/access.log > pod-read-log.yamlvi pod-read-log.yamlapiVersion: v1kind: Podmetadata:labels:run: read-logname: read-logspec:containers:- image: nginxname: nginxvolumeMounts:- name: logsmountPath: /var/log/nginx- image: busyboxname: busyboxargs: [/bin/sh, -c, 'tail -f /opt/access.log']volumeMounts:- name: logsmountPath: /optvolumes:- name: logsemptyDir: {}
kubectl apply -f pod-read-log.yamlkubectl get all


5-1、应用程序生命周期管理-deployment
1. 创建一个deployment 副本数 3,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本
- 名称:nginx
- 镜像版本:1.16
- 更新镜像版本:1.17
# 创建一个deployment副本3kubectl create deployment nginx --image=nginx:1.16 --replicas=3# 版本升级(或者导出yaml修改镜像和kubectl edit编辑后重新应用)kubectl set image deployment/nginx nginx=nginx:1.17# - nginx=nginx:1.17# 容器名 = 镜像#回滚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

2. 给web deployment扩容副本数为3
# 使用第一章的第三题kubectl create deployment web --image=nginx# 扩容deploymentkubectl scale deployment/web --replicas=3

3. 把deployment输出json文件,再删除创建的deployment
kubectl get deployment/web -o yaml | tee deployment-web.yamlkubectl delete -f deployment-web.yaml

4. 生成一个deployment yaml文件保存到/opt/deploy.yaml
- 名称:web
- 标签:app_env_stage=dev
kubectl create deployment web --image=nginx:1.16 -o yaml --dry-run=client | tee /opt/deploy.yaml# vi打开文件,修改标签# 应用kubectl apply -f /opt/deploy.yaml


5. 【自定义】金丝雀发布:一小部分用户请求到新版本应用
- Deployment:web-rollout
- 升级之前的镜像:geray/nginx:v1.18.0
- 副本数:4
- 升级之后的镜像:geray/nginx:v1.17.10
kubectl create deployment web-rollout --image=geray/nginx:v1.18.0 --replicas=4 -o yaml --dry-run=client > web-rollout-deploy.yamlkubectl apply -f web-rollout-deploy.yaml --record# 减速滚动升级kubectl patch deployment web-rollout -p '{"spec": {"minReadySeconds": 10}}'kubectl set image deployment web-rollout nginx=geray/nginx:v1.17.10 --recordkubectl rollout pause deploy web-rolloutkubectl rollout resume deploy web-rolloutkubectl rollout history deploy web-rolloutkubectl expose deployment web-rollout --type=NodePort --port=80 --target-port=80kubectl port-forward deployment web-rollout 80 80
5-2、K8s管理应用程序生命周期-pod
1. 创建一个pod,其中运行着nginx、redis、memcached、consul 4个容器
docker pull nginxdocker pull redisdocker pull memcacheddocker pull consulkubectl run pod-demo --image=nginx -o yaml --dry-run=client > pod-demo.yamlvi pod-demo.yamlapiVersion: v1kind: Podmetadata:labels:run: pod-demoname: pod-demospec:containers:- image: nginxname: nginx- image: redisname: redis- image: memcachedname: memcached- image: consulname: consulkubectl apply -f pod-demo.yamlkubectl get all -l run=pod-demo

2. 在节点上配置kubelet托管启动一个pod
- 节点:k8s-node1
- pod名称:web
- 镜像:nginx
kubectl run web --image=nginx -o yaml --dry-run=client > pod-web-k8s-node1.yaml#将该yaml文件传输到k8s-node1节点的/etc/kubernetes/manifests/目录下scp pod-web-k8s-node1.yaml root@k8s-node1:/etc/kubernetes/manifests/kubectl get all -l run=web

3. 检查容器中文件是否创建,如果没有被检测到pod重启
- 文件路径:/tmp/test.sock
kubectl run pod-liveness --image=busybox -o yaml --dry-run=client > pod-liveness.yamlvi pod-liveness.yamlapiVersion: v1kind: Podmetadata:labels:run: pod-livenessname: pod-livenessspec:containers:- image: busyboxname: pod-livenessargs:- /bin/sh- -c- touch /tmp/test.sock; sleep 30; rm -rf /tmp/test.sock; sleep 600livenessProbe:exec:command:- cat- /tmp/test.sockinitialDelaySeconds: 5periodSeconds: 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.sockkubelet 在容器内执行命令来进行探测,如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的
kubectl apply -f pod-liveness.yamlkubectl get all


6、k8s调度
1、创建一个pod,分配到指定标签node上
• pod名称:web
• 镜像:nginx
• node标签:disk=ssd
kubectl label node k8s-node1 disk=ssd# kubectl run web --image=nginx --labels="disk=ssd" 错误,这里是给pod打标签kubectl run web --image=nginx --overrides='{"spec": {"nodeSelector": {"disk": "ssd"}}}'

2、确保在每个节点上运行一个pod
• pod名称:nginx
• 镜像:nginx
kubectl create deployment nginx --image=nginx -o yaml --dry-run=client > pod-daemonSet.yamlsed -i "s/Deployment/DaemonSet/#" pod-daemonSet.yaml#sed '1c apiVersion: apps/v1' pod-daemonSet.yaml#sed -i "s#v1#apps/v1#g" pod-daemonSet.yaml# sed '/dnsPolicy/'d pod-daemonSet.yamlkubectl apply -f pod-daemonSet.yaml

3、查看集群中状态为ready的node数量,并将结果写到指定文件
kubectl get node | grep Ready | grep -v NotReady | wc -l

