细节
升级版本放到倒数第二做
etcd备份题放到最后做
第九题, 命令行启动pod导出yml ,不用查看官网
kubectl run nginx --image=nginx --dry-run=client -o yml > 8.yml
第十三题
kubectl edit pvc pv-volume --record 这种方法也是可以的。。。。
设置自动补全
登陆管理节点
kubectl --help | grep bash,此步是为了找关键词completion
sudo vim /etc/profile
添加source <(kubectl completion bash)
file
5.保存退出,source /etc/profile
题目一. RBAC
Task
创建一个名为deployment-clusterrole 且允许创建以下资源类型的新ClusterRole:
Deployment,StatefulSet,DaemonSet
在现有的namespace app-team1中创建一个名为cicd-token的新ServiceAccount
限于namespace app-team1,将新的ClusterRole deployment-clusterrole绑定到新的ServiceAccount cicd-token
# kubectl config use-context k8s #切换集群
参考答案:
没必要参考网址,使用-h 帮助更方便。
kubectl create clusterrole -h
kubectl create serviceaccount -h
kubectl create rolebinding -h
# kubectl config use-context k8s #切换集群
# kubectl create rolebinding -h
# kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets #注意:要写小写,每个需要添加一个s
# kubectl create serviceaccount -h
# kubectl create serviceaccount cicd-token -n app-team1
# kubectl create clusterrole -h
# kubectl create rolebinding cicd-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1
# 注意cicd-binding (这个名字可以任意,叫abc也行。)
删除
删除使用delete即可,例如,删除前面创建的rolebinding和clusterrole
kubectl delete rolebinding cicd-binding -n app-team1
kubectl delete clusterrole deployment-clusterrole
查看
kubectl describe clusterrole deployment-clusterrole
kubectl describe rolebinding -n app-team1
kubectl get serviceaccout -n 命名空间
题目二. Top
Task
通过pod label name=cpu-utilizer,找到运行时占用大量cpu的pod,
并将占用cpu最高的pod名称写入文件/opt/KUTR00401/KUTR00401.txt(已存在)
# kubectl config use-context k8s #切换集群
参考答案:
# kubectl config use-context k8s #切换集群
# kubectl top pod -h
# kubectl top pod -l name=cpu-utilizer --sort-by='cpu' -A
# echo <podname> >/opt/KUTR00401/KUTR00401.txt #注意:这里由于翻译问题可能文件名字不存在,可以先进去/opt下,确认这个文件具体目录在写入进去,别新建文件目录,否则没分。
题目三. Networkpolicy
Task
在现有的namespace my-app中创建一个名为allow-port-from-namespace的新NetworkPolicy
确保新的NetworkPolicy允许namespace my-app中的Pods来连接到namespace big-corp中的端口8080
进一步确保新的NetworkPolicy:
不允许对没有在监听端口8080的pods的访问
不允许不来自namespace my-app中的pods的访问
双重否定就是肯定,所以最后两句话的意思就是:
仅允许端口为 8080 的 pod 访问。
仅允许 my-app命名空间中的 pod 访问。
# kubectl config use-context hk8s 切换集群
参考答案:
官网链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
官网->概念->服务->网络策略
或 在搜索写入 network policy
# kubectl config use-context hk8s
#kubectl get namespaces --show-labels 查看命名空间
# kubectl label namespace big-corp name=big-corp #将命名空间标签
#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用
# vim 03.yaml
内容参考下方
# kubectl apply -f networkpolicy.yaml
# kubectl get networkpolicy -nmy-app #查看状态。如果脚本报错,可能是命名空间标记没标注导致脚本报错。
题目四: Service
Task
请重新配置现有的部署front-end 以及添加名为http的端口规范来公开现有容器nginx的端口80/tcp
创建一个名为front-end-svc的新服务,以公开容器端口http
配置此服务,以通过在排定的节点上的NodePort来公开各个Pods
# kubectl config use-context k8s
参考答案
官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
文档主页-->概念-->工作负载-->工作负载资源-->deployments
或搜索 deployment
# kubectl config use-context k8s
# kubectl get svc # 查看服务有没有启动,考试不需要
# kubectl edit deployment front-end # 注意,已经存在pods,修改即可,改动如下:
在name和resources中间插入,然后保存:wq
# kubectl expose -h
# kubectl expose deployment front-end --port=80 --target-port=80 --type=NodePort --name=front-end-svc
#说明,deployment 接的是pod名字,外部端口,容器端口,type别漏了,--name=svc名字
# kubectl get deployment front-end -owide #查看配置
# kubectl get svc #查看服务
# curl svc-ip:端口 #验证是否访问到nginx
题目五. Ingress
Task
如下创建一个新的nginx ingress资源:
名称:pong
Namespace: ing-internal
使用服务端口5678在路径/hello上公开服务hello
可以使用以下命令检查服务hello的可用性,该命令应返回hello:
curl -kL <INTERNAL_IP>/hello
# kubectl config use-context k8s 切换集群
参考答案
官网地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource
文档路径:概念 --> 服务,负载均衡和联网 --> Ingress-->第一个示例
或搜索ingress
# kubectl config use-context k8s
# vim ingress.yml
# kubectl apply -f 05.yaml
# curl -kL ip/hello
3、验证
kubectl get ingress -ning-internal
curl -kL internal_IP/hello
题目六. 副本扩容
Task
将deployment从loadbalancer扩展至5 pods
# kubectl config use-context k8s 切换集群
参考答案:
# kubectl config use-context k8s
#kubectl scale deployment -h 查看帮助
# kubectl get deployment
# kubectl scale deployment loadbalancer --replicas=5 #记住scale既可以
3、验证
kubectl get po
kubectl get deployment
题目七. 分配Pod
Task
按如下要求调度一个pod
名称:nginx-kusc00401
Image: nginx
Node selector: disk=ssd
# kubectl config use-context k8s 切换集群
参考答案:
官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/
文档主页-->任务-->配置pods和容器-->将 Pod 分配给节点
或搜索pod
# kubectl config use-context k8s
# kubectl get node --show-labels 查看标签
# kubectl label node k8s-node1 disk=ssd 没有就打标签
# kubectl apply -f 07.yaml
# kubectl get pods nginx-kusc004001 -owide
题目八: 统计污点
Task
检查有多少worker nodes已准备就绪(不包括被打上Taint:NoSchedule的节点),
并将数量写入到/opt/KUSC00402/kusc00402.txt
# kubectl config use-context k8s 切换集群
参考答案:
kubectl -hD
#如果实在记不住命令,可以手动往题目文件里面写入2 即可
[root@kubernetes-master ~]#kubectl describe nodes |grep Taint|grep -cv NoSchedule
2
# kubectl config use-context k8s
方法一:
# kubectl describe node | grep -i Taints | grep -vci NoSchedule > /opt/KUSC00402/kusc00402.txt
# grep -i 忽略大小写(防止大小写错) -c统计 -v取反
方法二:
# kubectl describe node | grep Taints | grep -i NoSchedule | wc -l #统计污点和不允许调度
# kubectl get node | grep -w Ready | wc -l #统计启动状态
# 指令2-指令1数字 echo 数量 >/opt/KUSC00402/kusc00402.txt
方法三:
# kubectl describe nodes $(kubectl get node|grep Ready|awk '{print $1}')|grep Taints|grep -vc NoSchedule
题目九:多容器运行一个Pod
Task
创建一个名为kucc4的pod,在pod里面分别为以下每个images单独运行一个app container
(可能会有1-4个images):nginx +redis+memcached
# kubectl config use-context k8s
参考答案:
官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
文档主页-->概念-->工作负载-->pod
或搜索pods
# kubectl config use-context k8s
# vim 09.yaml
# kubectl apply -f 09.yaml
3、验证
kuebctl get po
题目十. PV
Task
创建名为app-data的persistent volume,容量为2Gi,
访问模式为ReadWriteOnce,volume类型hostPath,位于/srv/app-data
# kubectl config use-context hk8s
参考答案:
官方地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
文档主页 --> 任务 --> 配置pods和容器-->配置 Pod 以使用 PersistentVolume 作为存储
可以直接搜索pvc选择第三个
# kubectl config use-context hk8s
# vim 10.yaml
# kubectl apply -f 10.yaml
# kubectl get pv
题目十一. PVC
Task
创建一个新的PersistentVolumeClaim:
名称:pv-volume
Class: csi-hostpath-sc
容量:10Mi
创建一个新的Pod,此Pod将作为volume挂载到PersistentVolumeClaim
名称: web-server
image: nginx
挂在路径:/usr/share/nginx/html
配置新的pod,以对volume具有ReadWriteOnce权限
最后,使用kubectl edit或kubectl patch将PersistentVolumeClaim的容量扩展为70Mi,并记录此更改
# kubectl config use-context ok8s
参考答案:
官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
文档主页 --> 任务 --> 配置pods和容器-->配置 Pod 以使用 PersistentVolume 作为存储-->创建 PersistentVolumeClaim
步骤,创建pvc,创建pod,edit修改大小
# kubectl config use-context ok8s
# kubectl apply -f pvc.yaml
# kubectl get pvc #注意,这里因为没有csi这个类,所以状态处于pending是正常的。考试会有csi这个类,csi这个类需要安装对应插件才能使用。
# kubectl edit pvc pv-volume --save-config #我们修改会保存不了,因为上面pvc,pending状态,记住在那里修改即可。或--save-config也可以用--record替换。
题目十二. Logs
Task
监控pod bar的日志并:
提取与错误file-not-found相对应的日志行,将这些日志写入/opt/KUTR00101/bar
# kubectl config use-context k8s
参考答案:
# kubectl config use-context k8s
# kubectl logs -h
# kubectl logs pod/bar | grep file-not-found >/opt/KUTR00101/bar #注意pod/bar格式。可以先logs看有没有信息在输出,注意权限问题,必要加sudo
# cat /opt/KUTR00101/bar #验证
题目十三. Sidecar边车(遇到可以先做后面,我考试第5题出现)
Task
使用busybox Image来将名为sidecar的sidecar容器添加到现有的pod legacy-app中。
新的sidecar容器必须运行以上命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用安装在/var/log的Volume,使日志文件legacy-app.log可用于sidecar容器。
(注:除了添加所需的volume mount以外,请勿更改现有容器的规格。)
解题
# kubectl config use-context k8s
参考答案:
官网地址:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
文档-->概念-->集群管理-->日志架构
或 搜索栏输入side car 官网搜索logging
# kubectl config use-context k8s
# kubectl get po leagcy-app -oyaml > 13.yaml #导出旧pod修改,注意因为要求不对原有pod修改,只能新增辅助sidecar,另外要注意备份
# cp 13.yaml 13.bak.yaml #备份
# kubectl delet pod legacy-app #删除旧pod
# kubectl apply -f 13.yaml #重新部署
# kubectl exec legacy-app -c legacy-app -- tail -f /var/log/legacy-app.log #验证
# kubectl exec legacy-app -c sidecar -- tail -f /var/log/legacy-app.log #验证是否使用同一个log
第一步
第二步
验证
题目十四. 升级(升级需要时间,建议最后做,我考试第2题出现)
Task
设置配置环境:
kubectl config use-context mk8s
现有的Kubernetes集群正在运行版本1.20.0,仅将主节点上的所有Kubernetes控制平面和节点组件
升级到版本1.20.1 确保在升级之前drain主节点,并在升级后uncordon主节点
可使用以下命令通过ssh连接到主节点:
ssh mk8s-master-0
可使用以下命令在该主节点上获取更高权限:
sudo -i
另外,在主节点上升级kubelet和kubectl。(不需要升级etcd)
kubectl config use-context mk8s
参考答案:
官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
文档主页-->任务-->管理集群-->用 kubeadm 进行管理-->升级 kubeadm 集群
或搜索kubeadm upgrade
1、切换环境
kubectl config use-context mk8s
2、配置
#升级kueadm
kubectl cordon mk8s-master-0
kubectl drain mk8s-master-0 --ignore=daemonsets #驱逐pod
ssh mk8s-master-0 #远程到master节点
sudo -i #提权
apt install kubeadm=1.20.1-00 -y
kubeadm upgrade plan
#这里可以先查下的:apt-cache show|grep kubeadm
#kubeadm upgrade apply install v1.20.1 #并且要加上--ectd-ugrade=false。。。。。。题目要求不升级 etcd; 注意下这2个版本号写法的区别。。。。
kubeadm upgrade apply v1.20.1 --etcd-upgrade=false
#升级kubelt
apt install kubelet=1.20.1-00 kubectl=1.20.1-00 -y
systemctl restart kubelet #这里要重启下kubelt的,切记。。。
Exit #退出root账户
Exit #退出ssh登陆的master节点
kubectl uncordon mk8s-master-0
3、验证
kubectl get node -owide
kubectl --version
kubelet --version
题目十五. Etcd备份
Task
首先,为运行在https://127.0.0.1:2379上的现有etcd实例创建快照并将快照保存到/data/backup/etcd-snapshot.db
为给定实例创建快照预计能在几秒钟内完成。如果该操作似乎挂起,则命令可能有问题。用ctrl+c来取消操作,然后重试。
然后还原位于/data/backup/etcd-snapshot-previous.db的现有先前快照。
提供了以下TLS证书和密钥,以通过etcdctl连接到服务器。
CA证书:/opt/KUIN00601/ca.crt
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key
参考答案:
官网地址:https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
文档主页-->任务-->管理集群-->为Kubernetes运行etcd集群
或搜索etcd
1、确定当前环境
kubectl get node
开始做题
ETCDCTL_API=3 -H #查看帮助
mkdir /data/backup/etcd-snapshot.db #备份目录自己创建,考试按照考试改
2、配置
#备份
ETCDCTL_API=3 etcdctl snapshot save /data/backup/etcd-snapshot.db --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key
#还原
sudo -i
systemctl stop etcd
systemctl cat etcd #确认下数据目录,注意这里是systemctl cat etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak #备份设置,注意这里是default.etcd
sudo ETCDCTL_API=3 etcdctl restore /data/backup/etcd-snapshot-previous.db --data-dir=/var/lib/etcd/default.etcd
chown -R etcd:etcd /var/lib/etcd #注意,不要忘记了。。。。
syetmctl start etcd
注:执行备份命令如果提示没证书文件,exit 退回上一步操作
题目十六. Node 状态排错(送分题)
Task
名为wk8s-node-0的Kubernetes worker node处于NotReady状态。调查发生这种情况的原因,
并采取相应措施将node恢复为Ready状态,确保所做的任何更改永久有效
可使用以下命令通过ssh连接到故障node:
ssh wk8s-node-0
可使用以下命令在该node上获取更高权限:
sudo -i
kubectl config use-context wk8s #考试时切到这道题的集群后,那个 node 就是异常的
参考答案:
1、切换环境
kubectl config use-context wk8s #考试时切到这道题的集群后,那个 node 就是异常的。 真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。
# ssh wk8k-node-0
# sudo -i
# kubectl descibe node wk8s-node-0
# systemctl status kubelet
# systemctl enable kubelet --now # 这题就是这么简单,也可以先start 在enable
# systemctl status kubelet
# exit # 退出root
# exit # 退出节点
# journalctl -u kubelet # 如果没有起来,查看原因
3、验证
kubectl get node
#jounarlctl -u kubelet 查看kubelet日志
题目十七. Node驱逐Pod
Task
将名为ek8s-node-1的node设置为不可用,并重新调度该node上所有运行的pods
kubectl config use-context ek8s #切换集群
参考答案:
1、切换环境
kubectl config use-context ek8s
2、配置
#kubectl coredon ek8s-node-1 #设置为不可调度
kubectl drain ek8s-node-1 --ignore-daemonsets #设置次节点为不可调度,并且排空次节点
#如果上面命令报错就加上一个 --delete-local-data --force
3、验证
kubectl get node