作业完成后,将结果截图提交到腾讯文档: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-cka
kubectl run pod-01 --image=nginx --namespace=aliang-cka
3. 创建一个deployment并暴露Service
- 名称:web
- 镜像:nginx
kubectl create deployment web --image=nginx
kubectl 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.yaml
vi pod-read-log.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: read-log
name: read-log
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: logs
mountPath: /var/log/nginx
- image: busybox
name: busybox
args: [/bin/sh, -c, 'tail -f /opt/access.log']
volumeMounts:
- name: logs
mountPath: /opt
volumes:
- name: logs
emptyDir: {}
kubectl apply -f pod-read-log.yaml
kubectl get all
5-1、应用程序生命周期管理-deployment
1. 创建一个deployment 副本数 3,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本
- 名称:nginx
- 镜像版本:1.16
- 更新镜像版本:1.17
# 创建一个deployment副本3
kubectl 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
# 扩容deployment
kubectl scale deployment/web --replicas=3
3. 把deployment输出json文件,再删除创建的deployment
kubectl get deployment/web -o yaml | tee deployment-web.yaml
kubectl 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.yaml
kubectl 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 --record
kubectl rollout pause deploy web-rollout
kubectl rollout resume deploy web-rollout
kubectl rollout history deploy web-rollout
kubectl expose deployment web-rollout --type=NodePort --port=80 --target-port=80
kubectl port-forward deployment web-rollout 80 80
5-2、K8s管理应用程序生命周期-pod
1. 创建一个pod,其中运行着nginx、redis、memcached、consul 4个容器
docker pull nginx
docker pull redis
docker pull memcached
docker pull consul
kubectl run pod-demo --image=nginx -o yaml --dry-run=client > pod-demo.yaml
vi pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod-demo
name: pod-demo
spec:
containers:
- image: nginx
name: nginx
- image: redis
name: redis
- image: memcached
name: memcached
- image: consul
name: consul
kubectl apply -f pod-demo.yaml
kubectl 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.yaml
vi pod-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod-liveness
name: pod-liveness
spec:
containers:
- image: busybox
name: pod-liveness
args:
- /bin/sh
- -c
- touch /tmp/test.sock; sleep 30; rm -rf /tmp/test.sock; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/test.sock
initialDelaySeconds: 5
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 就会认为这个容器是健康存活的
kubectl apply -f pod-liveness.yaml
kubectl 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.yaml
sed -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.yaml
kubectl apply -f pod-daemonSet.yaml
3、查看集群中状态为ready的node数量,并将结果写到指定文件
kubectl get node | grep Ready | grep -v NotReady | wc -l