CKA认证考题
1.RBAC 4%
Context
为部署管道创建一个新的ClusterRole并将其绑定到范围内特定的namespace的特定ServiceAccount
Task
创建一个名为deployment-clusterrole且仅允许创建以下资源类型的新ClusterRule
Deployment
StatefulSet
DaemonSet
在现有的namespace app-team1中创建一个名为cicd-token的新ServiceAccount
限于namespace app-team1,将新的ClusterRole deployment-clusterrole绑定到新的ServiceAccount cicd-
token
解题思路:
#第一步:命令补全
source < (kubectl completion bash)
#第二步:创建ClusterRole(通过kubectl create clusterrule -h)
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
#第三步:创建ServiceAccount
kubectl create serviceaccount cicd-token -napp-team1
#第四步:将ClusterRole和ServiceAccount进行绑定(指定ns就创建rolebinding,不指定ns就创建clusterrolebinding)
kubectl create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -napp-team1
2.驱逐节点 4%
Task
将名为ek8s-node-1的节点设置为不可用,并重新调度在其上运行的所有Pod。
解题思路:
#第一步:驱逐node上所有pod,node状态变为noschedule
Kubectl drain ek8s-node-1 --ignore-daemonsets --force
3.集群升级 7%
Task
现有的Kubernetes集群正在运行版本1.18.8.仅将主节点上的所有Kubernetes控制平面和节点组件升级到版本
1.19.0
另外,在主节点上升级Kubelet和Kubectl
确定在升级之前drain主节点,并在升级后uncordon主节点。请不要升级工作节点,etcd,container管理器,
CNI插件,DNS服务或任何其他插件。
解题思路:
#第一步:连接到master节点
ssh k8s-master
#第二步:使用root用户驱逐节点
su root
Kubectl drain k8s-master
#第三步:安装1.19版本
apt-cache show kubeadm|grep 1.19.0
apt-get install kubeadm=1.19.0-00
#第四步:使用Kubeadm升级K8s
kubeadm upgrade apply 1.19.0 --etcd-upgrade=false
#第五步:升级kubelet
apt-get install kubectl=1.19.0-00
#第六步:恢复master节点
kubectl uncordon k8s-master
4.ETCD备份恢复 7%
Task
首先,为运行在https://127.0.0.2379上的现有etcd实例创建快照并将快照保到/var/lib/backup/etcd-snapshot.db
然后还原位于 /var/lib/bakup/etcd-snapshot-previous.db
提供了以下TLS证书与密钥,以通过etcdctl连接到服务器
CA证书:/opt/KUIN00601/ca.crt
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key
解题思路:
#第一步:指定etcdctl版本
export ETCDCTL_API=3
#第二步:给etcd做快照
etcdctl --endpoints=https://127.0.0.2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot save /var/lib/backup/etcd-snapshot.db
#第三步:查看快照是否创建成功
etcdctl --endpoints=https://127.0.0.2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot status /var/lib/backup/etcd-snapshot.db -wtable
#第四步:恢复快照
etcdctl snapshot restore /var/lib/bakup/etcd-snapshot-previous.db
#第五步:查看恢复快照状态
etcdctl snapshot status /var/lib/bakup/etcd-snapshot-previous.db -wtable
PS:做完题目之后退回work节点终端界面
5.网络策略 4%
Task
在已有的namespace foobar中创建一个名为allow-port-from-namespace的新NetworkPolicy,以允许
namespace corp-bar访问其Pods的端口9200
解题思路:
#第一步:从k8s官网拷贝yaml模板(粘贴注意格式:set paste)
vim NetworkPolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: foobar
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: corp-bar
ports:
- protocol: TCP
port: 9200
#第二步:创建NetworkPolicy
kubectl apply -f NetworkPolicy.yaml
6.SVC 4%
Task
重新配置现有的deployment front-end,并添加名为HTTP的端口规范,以暴露现有容器nginx的端口80/
tcp。
创建一个名为front-end-svc的新服务,以暴露容器端口HTTP。
配置新服务以通过调度它们的节点上的NodePort暴露各个Pod
解题思路:
#第一步:修改deployment的yaml
添加以下一行:spec.template.spec.containers
name: nginx
ports:
- containerPort: 80
name: http
#第二步:创建svc
kubectl create svc front-end-svc nodeport --tcp=80:80
#第三步:检查svc和deployment的标签是否一致
kubectl get deployment front-end --show-labels
kubectl get svc front-end-svc --show-labels
#第四步:检查是否成功
kubectl get svc front-end-svc
curl $ClusterIP
curl $nodeIP+随机端口
PS:在检查时一定进入k8s集群中,考试中不能跨集群curl,ssh到任何一个work节点再curl
7.Ingress 7%
Task
创建一个名为nginx的Ingress并遵守以下规则
Name:pong
Namespace:ing-internal
Exposing service hello on path /hello 使用端口5678
验证
curl -KL <INTERNAL_IP>/hello
解题思路:
#第一步:在k8s官网拷贝ingress模板
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
#第二步:创建ingress
kubectl apply -f ingress.yaml
#第三步:验证
kubectl get ingress pong -n ing-internal -o yaml(查看INTERNAL_IP)
curl -KL <INTERNAL_IP>/hello
#返回hello证明成功
8.扩容 4%
Task
将deployment web-server扩容到4个pods
解题思路:
kubectl get deployment -A
kubectl scale --replicas=4 deployment web-server
kubectl get pod
9.通过node标签调度pod 4%
Task
按以下规则调度pod:
name:ngux-kusc00401
image:nginx
Node selector:disk=ssd
解题思路:
#第一步:查看当前集群所有node的标签
kubectl get node --show-labels
#第二步:创建pod
kubectl run --generator=run-pod/v1 ngux-kusc00401 --image=nginx --dry-run -o yaml>nginx1.yaml (V1.17.0)
kubectl run ngux-kusc00401 --image=nginx --dry-run=client -o yaml>nginx1.yaml (V1.20.0以上)
#第三步:编辑yaml
vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ngux-kusc00401
name: ngux-kusc00401
spec:
containers:
- image: nginx
name: ngux-kusc00401
resources: {}
#添加一行:
nodeSelector:
disk: ssd
dnsPolicy: ClusterFirst
restartPolicy: Always
#第四步:执行yaml并检查是否running
kubectl apply -f nginx.yaml
10.节点数量 4%
Task
检查并查看有多少个节点准备就绪(不包括已获得Noschedule的节点)并将其写
入/opt/KUSC00402/kusc00402.txt
解题思路:
#第一步:查看当前集群中的Node有没有污点
kubectl describe node|grep Taint
#第二步:将结果输入到文件中
echo 2>/opt/KUSC00402/kusc00402.txt
11.创建多容器pod 4%
Task
创建一个名为kucc8的pod,并且使用以下镜像(可能指定了1至4个镜像)
nginx+redis+memcached+consul
解题思路:
#第一步:创建yaml模板文件
kubectl run kucc8 --image=nginx --dry-run=client -o yaml>kucc8.yaml
#第二步:编辑yaml文件
vim kucc8.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: kucc8
name: kucc8
spec:
containers:
- image: nginx
name: nginx
#添加以下内容:
- image: redis
name: redis
- image: memcached
name: memcached
- image: consul
name: consul
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
#第四步:查看结果
kubectl apply -f kucc8.yaml
12.pv 4%
Task
创建一个名为app-config的的pv,1Gi大小,权限为ReadOnlyMany便用hostPath类型挂载本地位置
为/srv/app-config
解题思路:
#第一步:从官网复制模板
vim app-config.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadOnlyMany
hostPath:
path: "/srv/app-config"
#第二步:创建pv并检查
kubectl apply -f app-config.yaml
kubectl get pv
13.pvc 7%
Task
创建一个pvc满足以下要求:
Name:pv-volume
Class:csi-hostpath-sc
Capcity: 10Mi
创建一个pod并挂载PVC:
name:test
image.:nginx
Mount path:/usr/share/nginx/html
编辑pod volume权限为ReadWriteOnce
最后,使用kubectl edit或者kubectl patch将pvc大小改为70Mi
解题思路:
#创建pvc
vim pv-volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
kubectl apply -f vim pv-volume.yaml
#创建pod
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
volumes:
- name: pv-volume
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-volume
kubectl apply -f nginx.yaml
#修改PVC大小
kubectl edit pv-volume --record
14.输出日志 5%
Task
监控bar的日志
并将error字段内容输出到 /opt/KUTR00101/bar
解题思路:
kubectl logs bar |grep error >>/opt/KUTR00101/bar
15.sidecar 13%
Task
在pod big-corp-app中增加一个busybox的sidecar,新的sidecar容器使用以下命令:
/bin/sh -c tail -n+1-f /var/log/big-corp-app.log
挂载一个卷的名字叫logs并确保/var/log/big-corp-app.log文件在sidecar中可达
不要修改已经存在的容器
不要修改日志路径与文件
解题思路:
#编辑yaml文件
kubectl get pod big-corp-app -o yaml>new.yaml
vim new.yaml
#找对位置分别添加以下内容:
volumeMounts:
- name: logs
mountPath: /var/log
- name: busybox
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/big-corp-app.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
kubectl delete -f new.yaml
kubectl apply -f new.yaml
#检查pod状态和日志
kubectl exec big-corp-app -c busybox -- tail -f /var/log/big-corp-app.log
16.top 5%
Task
从pod标签为name=cpu-loader中找到CPU负载最大的pod名称,并输出到
/opt/KUTR00401/KUTR00401.txt(该文件已经存在)
解题思路:
kubectl top pod -A -l name=cpu-loader --sort-by='cpu'
echo ${pod_name}>>/opt/KUTR00401/KUTR00401.txt
17.kubelet 13%
Task
名为wk8s-node-0的工作节点状态为NotReady,找到并解决此问题
解题思路:
ssh wk8s-node-0
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet
exit
18. pod 的滚动更新与回滚
Task
将 deployment 的 image 更新为 v2 版本.
验证是否更新完成.
回滚到 v1 版本.
解题思路:
题目yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
# 更新镜像版本 : kubectl set image
kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
# 查看更新过程
kubectl rollout status deployment myapp
# 版本回滚
kubectl rollout undo deployment myapp