赞
踩
趁着11月黑五5折活动,报了个CKA&CKS,现已通过CKA。
考前准备
注意事项:
1. 12月份考试的时候kubectl已经可以Tab补全了,不需要背指令source <(kubectl completion bash).
2. 指令多用-h查询,答案不唯一,指令或yaml解出来都可以。
3. 题目中蓝色字在考试都会有所变动(我考试只变了1,2题参数,其他没变)。
4. 考试只允许访问官网查询,不能使用收藏网页,考试都是使用官网浏览器,浏览器会要求你关闭远程工具,虚拟机vm等进程(要我关闭进程显卡控制台???)
5. 注意切换集群。
6. 自己写了个模拟试题和检测脚本,会写在下一帖子。
[node]$ kubectl config use-context k8s
创建一个名为deployment-clusterrole的clusterrole,该clusterrole只允许创建deployment、daemonset、statefulset的create操作。
在名字为 app-team1的namespace下创建一个名为cicd-token的serviceAccount。
限于namespace app-team1,将新的clusterrole deployment-clusterrole绑定到新的serviceAccount cicd-token。
- # 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也行。)
- 查看
- kubectl describe clusterrole deployment-clusterrole
- kubectl describe rolebinding -n app-team1
[node]$ kubectl config use-context k8s
通过pod label name=cpu-utilizer 直到运行占用大量cpu的pod,将pod名写入文件
/opt/KUTR00401/KUTR00401.txt
- # 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下,确认这个文件具体目录在写入进去,别新建文件目录,否则没分。
[node]$ kubectl config use-context hk8s
在namespace my-app中创建一个allow-port-from-namespace的新networkpolicy,确保新的NetwoekPolicy允许namespace big-corp中的Pods连接到namespace my-app中的Pod的端口8080。
进一步确认Networkolicy:
不允许对没有监听 8080 的Pods访问
不允许不来自namespace my-app 的Pods访问
- 官网链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
- 官网->概念->服务->网络策略
- 或 在搜索写入 network policy
-
- # kubectl config use-context hk8s
- # kubectl label namespace big-corp name=big-corp #将命名空间标签
- #如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用
- # vim 03.yaml
- 内容参考下方
- # kubectl apply -f networkpolicy.yaml
- # kubectl get networkpolicy -nmy-app #查看状态。如果脚本报错,可能是命名空间标记没标注导致脚本报错。
[node]$ kubectl config use-context k8s
重新配置现有的front-end以及添加http的端口规范来公开现有的容器nginx的端口80/tcp
创建一个名叫front-end-svc服务,公开容器端口http。使用NodePort来公开各个Pods。
- 官网地址: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
[node]$ kubectl config use-context k8s
创建一个新的nginx Ingress资源:
名称: pong
Namespace: ing-internal
使用服务端口 5678 在路径 /hello上公开服务 hello
可以使用curl -kl <IP> /hello
- 官网地址: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
[node]$ kubectl config use-context k8s
将deployment 从 loadbalancer 扩展至 5 pods
- # kubectl config use-context k8s
- # kubectl get deployment
- # kubectl scale deployment loadbalancer --replicas=5 #记住scale既可以
- # kubectl get deployment
按照要求调度一个Pod:
名称: nginux-kusc00401
Image: nginx
Node selector: disk=ssd
- 官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/
- 文档主页-->任务-->配置pods和容器-->将 Pod 分配给节点
- 或搜索pod
- # kubectl config use-context k8s
- # kubectl apply -f 07.yaml
- # kubectl get pods nginx-kusc004001 -owide
[node]$ kubectl config use-context k8s
统计有多少个worker nodes 以准备就绪(不包括被打上Taint:NoSchedule的节点),并将数量写入到/opt/KUSC00402/kusc00402.txt
- # 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
[node]$ kubectl config use-context k8s
创建一个名叫kucc4的pod,在pod里面分别为每个images单独运行一个app container
Nginx+redis+memcached
- 官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
- 文档主页-->概念-->工作负载-->pod
- 或搜索pods
- # kubectl config use-context k8s
- # vim 09.yaml
- # kubectl apply -f 09.yaml
[node]$ kubectl config use-context hk8s
创建名叫app-data 的pv,容量为2Gi,访问模式为ReadWriteOnce。 Volume类型为hostPath,位于/srv/app-data
- 官方地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
- 文档主页 --> 任务 --> 配置pods和容器-->配置 Pod 以使用 PersistentVolume 作为存储
- # kubectl config use-context hk8s
- # vim 10.yaml
- # kubectl apply -f 10.yaml
- # kubectl get pv
[node]$ kubectl config use-context ok8s
创建一个新的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将pvc容量扩展到70Mi,并记录更改。
- 官网地址: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替换。
[node]$ kubectl config use-context k8s
监控 pod bar的日志并:提取与错误 file-not-found 相对应的日志行,将这些日志写入到 /opt/KUTR00101/bar
- # 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 #验证
[node]$ kubectl config use-context k8s
现有一个Pod legacy-app 内置日志,使用busybox Image添加一个 sidecar 容器添加到现有Pod legacy-app中新sidecar容器必须运行一下指令
/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。
并且这个 sidecar 和原有的镜像挂载一个名为 logs 的 volume,挂载的目录为/var/log/
除了添加volume mount 外,请不要更改现有容器的规格。
- 官网地址:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
- 文档-->概念-->集群管理-->日志架构
- 或 搜索栏输入side car
- # 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
在这个位置插入内容
在末尾volume添加2句
[node]$ kubectl config use-context mk8s
- 官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
- 文档主页-->任务-->管理集群-->用 kubeadm 进行管理-->升级 kubeadm 集群
- 或搜索kubeadm update
- 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
备份文件名:/data/backup/etcd-snapshot.db
还原文件名:/data/backup/etcd-snapshot-previous.db
- 官网地址:https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
- 文档主页-->任务-->管理集群-->为Kubernetes运行etcd集群
- 或搜索etcd
- 1、确定当前环境
- kubectl get node
- 2、配置
- #备份
- ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
- --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
- snapshot save /data/backup/etcd-snapshot.db
- #还原
- 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 退回上一步操作
- # ssh wk8k-node-0
- # sudo -i
- # kubectl descibe node wk8s-node-0
- # systemctl enable kubelet --now # 这题就是这么简单,也可以先start 在enable
- # systemctl status kubelet
- # exit # 退出root
- # exit # 退出节点
- # journalctl -u kubelet # 如果没有起来,查看原因
[node]$ kubectl config use-context ek8s
将名叫ek8s-node-1的node设置为不可用,并重新调度该node上的所有pods。
- 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
特别感谢前辈CKA的帖子:一念一生~one的博客_CSDN博客-k8s,Linux,git领域博主
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。