所有命令都验证过,有更好的方式,欢迎留言~~~
CKA 习题和真题汇总
- CKA考试经验:报考和考纲
- CKA :2019年12月英文原题和分值
- CKA考试习题:K8S基础概念--API 对象
- CKA考试习题:调度管理- nodeAffinity、podAffinity、Taints
- CKA考试习题:K8S日志、监控与应用管理
- CKA考试习题:网络管理-Pod网络、Ingress、DNS
- CKA考试习题:存储管理-普通卷、PV、PVC
- CKA考试习题:安全管理--Network Policy、serviceaccount、clusterrole
- CKA考试习题:k8s故障排查
- CKA真题:题目和解析-1
- CKA真题:题目和解析-2
- CKA真题:题目和解析-3
- CKA真题:题目和解析-4
- CKA真题:题目和解析-5
- CKA真题:题目和解析-6
- CKA真题:手动配置TLS BootStrap
更多CKA资料或交流:可加 wei xin :wyf19910905
答题技巧
- 避免手敲yaml,能不手敲yaml的,就别手敲,尽量从文档上复制,手敲的效率太低了,碰上终端响应慢,那是时间的杀手!!
使用命令补全: source <(kubectl completion bash)
使用别名 :
# vim ~/.bashrc # 添加 alias k='kubectl' alias kgp='kubectl get pods' alias kgs='kubectl get svc' # source ~/.bashrc
- 环境检查
集群版本:$ kubectl version
集群整体状态:
$ kubectl cluster-info
更多集群信息:
$ kubectl cluster-info dump
集群组件状态:
$ kubectl get componentstatus
集群主控节点判断(ROLES里是否有master信息):
$ kubectl get node
集群安装方式判断(kubeadm还是二进制)
$ 查看/etc/kubernetes/manifests 里有没有etcd、kube-apiserver.yaml、kube-controller-manager.yaml、schedule.yaml,如果有这4个文件,则是以kubeadm方式安装,实现方式为静态Pod方式实现
集群当前上下文:kubectl config current-context
集群上下文切换:kubectl config set-context gce --user=cluster-admin
- 尽量使用命令创建Pod、deployment、service
#创建Pod
kubectl run <podname> --image=<imagename> --generator=run-pod/v1 -n <namespace>
#创建Deployment
kubectl run <deploymentname> --image=<imagename> --generator=deployment/v1beta1 -n <namespace>
#暴露Service
kubectl expose deployment/<deploymentname> --type="NodePort" --port 8080 --name=<svcname>
- 搜索文档内容kubeclt结合grep或egrep
$ kubectl get nodes -o yaml | egrep '\sname:|cpu:|memory:' name: minikube cpu: "2" memory: 2417860Ki cpu: "2" memory: 2520260Ki
- 养成使用--dry-run、kubectl apply -f、kubectl delete -f的习惯,同时将答案和yaml写入到文件里,方便根据命令模板修改yaml,以及后面检查答案时重做题目。举个例子,使用run命令忘记增加namespace了
#初次生成 kubectl run <podname> --image=<imagename> --restart=Never --dry-run -o yaml > <题目名称>.yaml #应用yaml kubectl apply -f <题目名称>.yaml #审题错了,删除之前做的结果 kubectl delete -f <题目名称>.yaml #修改命令或修改yaml重新执行kubectl apply -f
- 见到不懂或忘记的命令参数,甭管什么kubectl,etcdctl的命令,盘他 -h,-h是万能的。里面有示例。(还有kubectl explain)
- 最后,考试环境中一定要留意k8s环境和尤其是主机名和用户名,默认可以使用ssh 进入 node, 进入node做完题目后记得退出(exit),不然节点内是无法ssh到下一个题目的node当中去的,节点内终端一般显示student@<worknodename>
考试注意:
注意:考试中一共有24题,
除“给出一个集群,把一个节点以TLS方式加入到集群(最长的那题)”以外(难度较大建议放弃), 其他23题全部按这个题型排列,一题一题做下去即可。
考试集群
注意切换集群上下文,每道题目都会给出提示
k8s集群:
k8s-master-0
k8s-node-0
k8s-node-1
wk8s集群:
wk8s-master-0
wk8s-node-0
wk8s-node-1
1、统计pod错误日志
Set configuration context $ kubectl config use-context k8s
Monitor the logs of Pod foobar and Extract log lines corresponding to error unable-to-access-website Write them to /opt/KULM00201/foobar
监控Pod名称为foobar 的日志,并提取与无法访问错误对应的日志行,将它们写入/opt/KULM00201/foobar
答:
kubectl logs foobar | grep 'unable-to-access-website' > /opt/KULM00201/foobar
扩展示例
1.1 监控 foobar Pod 的日志,提取 pod 相应的行'error'写入到/logs 文件中
kubectl logs foobar | grep error > /log
2、排序
Set configuration context $ kubectl config use-context k8s
List all PVs sorted by name,saving the full kubectl output to /opt/kUCC0010/my_volumes. Use kubectl‘s own functionally for sorting the output,and do not mainpulate it any further
列出所有按名称排序的pv,将完整的kubectl输出保存到a。使用kubectl函数对输出进行排序,并且不再进一步操作它。
答:
kubectl get pv --sort-by=.metadata.name > /opt/KUCC0010/my_volumes
3、Daemonset
Set configuration context $ kubectl config use-context k8s
- Ensure a single instance of Pod nginx is running on each node of the kubernetes cluster where nginx also represents the image name which has to be used.
- Do no override any taints currently in place.
- Use Daemonset to complete this task and use ds.kusc00201 as Daemonset name.
确保在kubernetes集群的每个节点上运行一个Pod nginx实例,其中nginx还表示必须使用的镜像名称。
不要覆盖任何当前存在的污点( 不要有tolerations)
使用Daemonset 完成此任务,并使用ds.kusc00201作为Daemonset名称
答:
如何调度 Daemon Pod
正常情况下,Pod 运行在哪个机器上是由 Kubernetes 调度器来选择的。然而,由 Daemon Controller 创建的 Pod 已经确定了在哪个机器上(Pod 创建时指定了
.spec.nodeName
),因此:
- DaemonSet Controller 并不关心一个节点的
unschedulable
字段。- DaemonSet Controller 可以创建 Pod,即使调度器还没有启动,这对集群启动是非常有帮助的。
Daemon Pod 关心 Taint 和 Toleration,它们会为没有指定
tolerationSeconds
的node.kubernetes.io/not-ready
和node.alpha.kubernetes.io/unreachable
的 Taint,创建具有NoExecute
的 Toleration。这确保了当 alpha 特性的
TaintBasedEvictions
被启用时,发生节点故障,比如网络分区,这时它们将不会被清除掉(当TaintBasedEvictions
特性没有启用,在这些场景下也不会被清除,但会因为 NodeController 的硬编码行为而被清除,而不会因为 Toleration 导致被清除)
方法1
vim.3daemonset.yaml
apiVersion: apps/v1 kind: DaemonSet metadata: name: ds.kusc00201 spec: selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - name: nginx image: nginx
kubectl apply -f 3daemonset.yaml
方法2
手写yaml太麻烦,由于damonSet的格式和Deployment格式差不多,可以先创建Deploy,再修改,这样速度会快一点
#先创建一个deployment的yaml模板 kubectl run nginx --image=nginx --dry-run -o yaml > 3.yaml #将yaml改成DaemonSet vi 3.yaml
#修改apiVersion和kind #apiVersion: extensions/v1beta1 #kind: Deployment apiVersion:apps/v1 kind: DaemonSet metadata: creationTimestamp: null labels: run: nginx name: nginx spec: #去掉replicas # replicas: 1 selector: matchLabels: run: nginx # 去掉strategy # strategy: {} template: metadata: creationTimestamp: null labels: run: nginx spec: containers: - image: nginx name: nginx resources: {} # 去掉status #status: {}
官网参考链接:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
4、init容器
Set configuration context $ kubectl config use-context k8s
Perform the following tasks Add an init container to lumpy-koala (which has been defined in spec file /opt/kucc00100/pod-sepc-KUCC00100.yaml)
The init container should create an empty file named /workdir/calm.txt。
If /workdir/calm.txt is not be detected,the Pod should exit.Once the spec file has been updated with the init container definition, the Pod should be created.
执行以下任务,
向lumpy—koala添加一个init容器(已在/opt/kucc00100/pod-spec-kucc00100.yaml中定义)
init容器应该创建一个名为/workdir/calm.txt的空文件
如果/workdir/calm.txt没有检测到,Pod应该退出
一旦使用init容器定义更新了 spec文件,就应该创建Pod
考点:init Container。要用到livenessProbes
答:
vim /opt/kucc00100/pod-spec-KUCC00100.yaml
在最后加上
initContainers: - name: init-c image: busybox command: ["/bin/sh", "-c", "touch /workdir/calm.txt"]
cat pod-sepc-KUCC00100.yaml
apiVersion: v1 kind: Pod metadata: name: lumpy-koala spec: volumes: - name: workdir emptyDir: {} containers: - name: checker image: nginx livenessProbe: exec: command: ["test","-e","/workdir/calm.txt"] volumeMounts: - name: workdir mountPath: /workdir initContainers: - name: init-busybox image: busybox command: ["/bin/sh", "-c", "touch /workdir/calm.txt"] volumeMounts: - name: workdir mountPath: /workdir
没有livenessProbe的写法
apiVersion: v1 kind: Pod metadata: name: kumpy-koala spec: volumes: - name: workdir emptyDir: {} containers: - name: checker image: alpine command: ["/bin/sh", "-c", "if [ -f /workdir/calm.txt ];then sleep 100000;else exit 1;fi"] volumeMounts: - name: workdir mountPath: /workdir initContainers: - name: busybox image: busybox command: ['/bin/sh', '-c', 'touch /workdir/calm.txt'] volumeMounts: - name: workdir mountPath: /workdir
kubectl apply -f /opt/kucc00100/pod-spec-KUCC00100.yaml
- sh -c 它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。
- test -e 该『文件名』是否存在?(常用)
官网参考链接:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/