k8s命令实践 =============== 1. 列出环境内所有的pod, 并以 name字段排序(使用kubectl自带排序功能) 答 :: kubuctl get pods --all-namespaces --sort-by=.metadata.name 类似命令, 列出集群内所有的pv,并以 name字段排序 :: kubectl get pv --sort-by=.metadata.name 2. 列出指定pod的日志中状态为Error的行,并记录在指定的文件上 :: kubuctl logs mynode |grep Error > /tmp/aaa.log 3. 通过命令行,使用nginx镜像创建一个pod。Pod的名称为sdn-id。并导出其pod的yaml文件 使用nginx镜像创建一个pod :: kubectl run sdn-id --image nginx 导出yaml文件 :: kubectl get pod sdn-id -o yaml > sdn-id.yaml 4. 通过命令行,使用nginx镜像创建一个pod。Pod的名称为pod5, 并添加两个标签,分别为app=nginx, disk=ssd。 kubectl run pod5 --image nginx --labels app=nginx,disk=ssid 5. 创建一个pod名称为nginx,并将其调度到标签为 disk=ssd 的节点上 答:首先使用命令创建yaml文件模板 :: kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx_pod.yaml 然后进行修改,增加以下两行:: nodeSelector: disk: ssd 最后使用命令进行创建:: kubectl apply -f nginx_pod.yaml 6. 创建包含两个容器的pod, 镜像分别使用nginx和redis. :: kubectl apply -f mpod.yaml mpod.yaml文件内容如下 :: apiVersion: v1 kind: Pod metadata: name: ex6 spec: containers: -name: nginx image: nginx -name: redis image: redis 可以通过命令来查看 kubectl get pods。然后通过以下命令进入容器 :: kubectl exec ex6-qf2fq -c nginx -it -- /bin/bash 7. 在每一个节点部署nginx, 提示采用daemonset。 kubectl apply -f ds.yaml, yaml文件为 :: apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx namespace: default spec: selector: matchLabels: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx 8. 提供一个pod的yaml,要求添加Init Container,Init Container的作用是创建一个空文件/data/aa.conf, pod的Containers判断文件/data/aa.conf是否存在, 不存在则退出。 答: 需要两个容器共享存储,用到卷存储。yaml文件如下 :: apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox command: ['sh', '-c', 'if [ ! -f /data/aa.conf ]; then exit 0; fi; echo "sleep 3600"; sleep 3600'] volumeMounts: - mountPath: /data name: mydata initContainers: - name: init-myservice image: busybox command: ['sh', '-c', "touch /data/aa.conf"] volumeMounts: - mountPath: /data name: mydata volumes: - name: mydata emptyDir: {} 9. 创建nginx-app的deployment ,使用镜像为nginx:1.11.0, 升级镜像为1.11.3, 并记录升级, 再使用回滚, 将镜像回滚至nginx:1.11.0 :: # 创建nginx-app的deployment kubectl run nginx-app --image=nginx:1.11.0 --record # 升级镜像,nginx-app为container的名字 kubectl set image deployment nginx-app nginx-app=nginx:1.11.3 # 回滚 kubectl rollout undo deployment nginx-app 10. 通过命令创建一个deployment并暴露Service。要求使用nginx镜像,deployment拥有2个pod, deployment名称为bjbook。 提供创建命令、然后使用命令获取deployment 和service的yaml :: [root@zhang1 ]# kubectl create deployment bjbook --image nginx --replicas 2 --port 80 [root@zhang1 ]# kubectl get service bjbook -o yaml > /tmp/bjbook_service.yaml [root@zhang1 ]# kubectl get deployment bjbook -o yaml > /tmp/bjbook_deployment.yaml 使用命令查看pod :: [root@zhang1 ]# kubectl get pod NAME READY STATUS RESTARTS AGE bjbook-6756b67bc4-sk9zm 1/1 Running 0 6m4s bjbook-6756b67bc4-xdx77 1/1 Running 0 6m4s 11. 创建pod并调度到指定节点,使用nginx镜像。 指定使用node2 来创建, 在spec中指定nodeName为 node2 :: $ cat pod-nodename.yaml apiVersion: v1 kind: Pod metadata: name: bjbook spec: containers: - image: nginx name: mynginx restartPolicy: Always nodeName: node2 $ kubectl apply -f pod/pod-nodename.yaml 12. 创建和配置service, 名称为front-end-service。可以通过NodePort/ClusterIp访问 并路由到front-end的Pod上 答:: kubectl expose frond-end --name=front-end-service-1 --port=80 --type=NodePort 然后就可以访问目标pod的80端口,他会映射到一个随机端口上。 13. 创建一个Pod, 名称为 Jenkins, 镜像使用Jenkins, 命名空间为website-frontend。 答 :: kubectl create ns website-frontend cat jenkins-pod.yaml apiVersion: v1 kind: Pod metadata: name: Jenkins namespace: website-frontend spec: containers: - image: Jenkins name: Jenkins restartPolicy: Always kubectl apply -f jenkins-pod.yaml 14. 创建deployment的spec文件: 使用redis镜像,副本5个, label为app_stage=dev, deployment名称为bjbook,保存这个spec文件 到/opt/bjbook/deploy_spec.yaml。注意清除此任务生成的任何新的k8s对象。 答 :: apiVersion: v1 kind: deployment metadata: name: bjbook label: - app_stage: dev spec: replicas: 5 containers: - image: redis name: redis 保存到/opt/bjook/deploy_spec.yaml即可, 也可以采用:: kubectl apply -f --dry-run -o yaml > /opt/bjbook/deploy_spec.yaml 15. 创建一个secret,名称为supper-secret, 包含用户bob. 创建pod1挂载该secret, 路径为/secret. 创建pod2,使用环境变量引用该secret,环境变量名为ABC 答: todo * https://kubernetes.io/docs/concepts/configuration/secret/ 16. 在命名空间bob里面创建pv, 指定pv的名字为pv1, 挂载路径为/etc/config 答: todo https://kubernetes.io/docs/concepts/storage/persistent-volumes/ 17. 为给定的 deployment website扩容到6个。 答: kubectl scale deployment website --replicat=6 18. 查看给定集群ready的node个数 :: kubectl get nodes |wc -l 19. 找出指定ns中使用cpu最高的pod名字并写入到指定文件 :: todo 20. 备份etcd数据库 答: todo 21. 使某个节点a不能被调度,并且已调度的pod重新调度。 答: kubectl drain -ignore-daemonset --delete-local-data=true 如果需要删除节点,则再运行 kubectl delete node 22. 在k8s集群中创建kubelet直接管理的pod, 即创建静态pod. 答: 将创建pod的yaml文件放到/etc/kubernetes/manifests目录下,然后重启kubelet进程即可自动 加载该yaml文件。 创建的pod可以使用kubectl看到,但不能使用kubectl来管理。 23. cs kubectl get cs 难点:服务 参考 ------ * https://kubernetes.io/docs/reference/kubectl/cheatsheet/ * https://kubernetes.io/docs/concepts/configuration/secret/