1.RBAC 4%
Task
创建一个名为deployment-clusterrole
且仅允许创建
以下资源类型的新ClusterRole
:
Deployment
StatefulSet
DaemonSet
在现有的namespace app-team1
中创建一个名为cicd-token
的新ServiceAccount
限于namespace app-team1
,将新的ClusterRole deployment-clusterrole绑定
到新的ServiceAccount cicd-token
Answer
# 创建clusterrole
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
# 创建serviceaccount
kubectl create serviceaccount cicd-token -n app-team1
# 创建rolebinding
kubectl -n app-team1 create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
# 查看rolebinding
kubectl describe rolebinding cicd-token-binding -n app-team1
知识点
1、CluserRole、ServiceAccount、RoleBinding
2.kubectl create clusterrole
3.kubectl create serviceaccount
4.kubectl create rolebinding
2.驱逐节点 4%
Task
将名为ek8s-node-1
的节点设置为不可用,并重新调度在其上运行的所有pod
Answer
kubectl drain ek8s-node-1 -- ingore-daemonsets --force
知识点
1.kubectl cordon
2.kubectl drain
3.kubectl delete
4.kubectl uncordon
3. 集群升级 7%
Task
现有的Kubernetes集群正在运行版本1.18.8.仅将主节点上的所有Kubernetes控制平面和节点组件升级到版本1.19.0
另外,在主节点上升级Kubelet和Kubectl
确定在升级之前drain主节点,便在升级后uncordon主节点。请不要升级工作节点、etcd、container管理器、cni插件、dns服务或者任何其他插件。
Answer
注意:需要ssh到master节点上执行,即在k8s集群内操作
# ssh到master节点
ssh master-1
# 切换到root
sudo -i
# ubantu环境补充kubectl命令
source <(kubectl completion bash)
#
kubectl drain master-1 -- ingore-daemonsets
#
apt-cache show kubeadm | grep 1.19.0
#
apt-get install kubeadm=1.19.0-00
#
kubeadm --version
#
kubeadm upgrade apply 1.19.0 --etcd-upgrade=false
#
apt-get install kubelet=1.19.0-00
#
kubelet --version
# 会看到两个版本,客户端版本和服务器版本都是1.19.0才是成功
kubectl --version
# 把master恢复调度,由“Ready,SchedulingDisabled”变成“Ready”
kubectl uncordon master-1
# 回到student视图下
exit
exit
知识点
kubectl upgrade
4.ETCD备份恢复 7%
Task
首先,为运行在https://127.0.0.1:2379
上的现有etcd实例创建快照并将快照保存到/var/lib/backup/etcd-snapshot.db
然后还原位于/var/lib/bakup/etcd-snapshot-previous.db
提供了以下TLS证书与密钥,以通过etcdctl连接到服务器
CA证书:/opt/KUIN00601/ca.cert
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key
Answer
注意:需要ssh到master节点上执行,即在k8s集群内操作
# ssh到master节点
ssh master-1
# 必须指定etcdctl的版本是3
export ETCDCTL_API=3
# 创建etcd快照
ectdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.cert" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot save /var/lib/backup/etcd-snapshot.db
# 查看保存快照的状态
ectdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.cert" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot status /var/lib/backup/etcd-snapshot.db -wtable
# 恢复etcd快照
etcdctl snapshot restore /var/lib/bakup/etcd-snapshot-previous.db
# 查看恢复快照的状态
etcdctl snapshot status /var/lib/bakup/etcd-snapshot-previous.db -wtable
# 回到student视图下
exit
exit
知识点
1.必须指定etcdctl的版本是3
2.kubectl snapshot save
3.kubectl snapshotrestore
4.kubectl snapshotstatus
5.网络策略 4%
Task
在已有的namespace foobar
中创建一个名为allow-port-from-namespace
的新NetworkPolicy
,以允许namespace corp-bar
访问其Pods的端口9200
Answer
从官方文档粘贴networkpolicy的样例到本地yaml文件中,再根据考试内容修改。
粘贴时候注意格式,在vim
编辑器中,先用:set paste
,然后再粘贴。
vi nw.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
kubectl apply -f nw.yaml
kubectl get neworkpolicies -n foobar allow-port-from-namespace
知识点
k8s的networkpolicy
6.SVC 4%
Task
重新配置现有的deployment front-end,并添加名为HTTP的端口规范,以暴露现有容器nginx的端口80/tcp。
创建一个名为front-end-svc的新服务,以暴露容器端口HTTP。
配置新服务以通过调度它们的节点上的NodePort暴露各个Pod。
Answer
# 修改deployment
kubectl edit deployments front-end
在template.spec.containers的name下面增加ports
name: nginx
ports:
- containerPort: 80
name: http
# 创建svc
kubectl create svc nodeport front-end-svc --tcp=80:80
# 测试(不通的话可能depoyment和svc标签不一致),建议在集群内节点执行
curl
# 查看标签
kubectl get svc front-end-svc --show-labels
或者最直接方式
kubectl expose deployment front-end --port=80 --target-port=80 --protocol=TCP --type=NodePort --name=front-end-svc
知识点
1.kubectl create svc
2.kubectl expose
7.Ingress 7%
Task
创建一个名为nginx的Ingress并遵守以下规则
Name:pong
Namespace: ing-internal
Exposing service hello on path /hello 使用端口5678
验证
curl -kL
Answer
从官网粘贴ingress的实例,并进行修改。
vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
kubectl apply -f ingress.yaml
kubectl get ingress pong -n ing-internal
知识点
ingress
8.扩容 4%
Task
将deployment web-service
扩容到4个pods
Answer
kubectl scale deployment web-service --replicas=4
知识点
kubectl scale
9.通过node标签调度pod 4%
Task
按以下规则调度pod:
name:nginx-kusc00401
image:nginx
Node selector:disk=ssd
Answer
kubectl run nginx-kusc00401 --image=nginx --dry-run=client -o yaml > 9.yaml
vi 9.yaml
增加NodeSelector
containers:
- image: nginx
name:
resources: {}
nodeSelector:
disk: ssd
...
kubectl apply -f 9.yaml
知识点
1.kubectr run
2.标签选择器(节点标签选择器)
10.节点数量 4%
Task
检查并查看有多少个节点准备就绪(不包括已获得Noschedule的节点)并将其写入 /opt/KUSC00402/kusc00402.txt
Answer
kubectl get node | grep Taint
echo 2 > /opt/KUSC00402/kusc00402.txt
知识点
11.创建多容器pod 4%
Task
创建一个名为kucc8
的pod,并且使用以下镜像(可能指定了1至4个镜像)
nginx+redis+memcached+consul
Answer
kubectl run kucc8 --image=nginx --dry-run=client -o yaml > 11.yaml
vi 11.yaml
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
- name: consul
image: consul
kubectl apply -f 11.yaml
kubectl get pod
知识点
1个pod启多个不同镜像容器
12.pv 4%
Task
创建一个名为app-confi
g的pv
,1Gi
大小,权限为ReadOnlyMany
使用hostPath
类型挂载到本地位置为/srv/app-config
Answer
从官网粘贴pv的yaml创建示例,并进行修改。
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
kubectl apply -f pv.yaml
kubectl get pv
知识点
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 vulume权限为ReadWriteOnce
最后,使用kubectl edit 或者kubectl patch讲pvc大小改为70Mi
Answer
从官网粘贴pvc的yaml创建示例,并进行修改。
vi pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
kubectl apply -f pvc.yaml
# 查看pvc状态,应该是Bound???
kubectl get pvc
vi pod-pvc.yaml
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 pod-pvc.yaml
kubectl get pod
kubectl get pvc
# 英文要求注意加上--record,可以在history看到
kubectl edit pvc pv-volume --record
知识点
PVC
Pod挂载PVC
14.输出日志 5%
Task
监控bar的日志
并将error字段内容输出到/opt/KUTR00101/bar
Answer
pod为bar的日志
kubectl logs bar | grep error >> /opt/KUTR00101/bar
知识点
kubectl logs
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中可达
不要修改已经存在的容器
不要修改日志路径与文件
Answer
kubectl get pod big-corp-app -o yaml > 15.yaml
vi 15.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 15.yaml
kubectl apply -f 15.yaml
# 验证新加的容器
kubectl logs big-corp-app busy-box
kubectl exec big-corp-app -c busybox -- tail -f /var/log/big-corp-app.log
# 验证原来的容器(考试中的)
kubectl exec big-corp-app -c count -- tail -f /var/log/big-corp-app.log
知识点
使用 sidecar 容器运行日志代理
16.top 13%
Task
从pod标签
为name=cpu-loader
中找到CPU负载最大
的pod名称
,并输出到/opt/KUTR00401/KUTR00401.txt
(该文件已经存在)
此题中文翻译有问题,文件名中文是3个连续0,英文是2个连续0
Answer
kubectl top pod -A -l name=cpu-loader --sort-by='cpu'
echo >> /opt/KUTR00401/KUTR00401.txt
知识点
17.kubelet 13%
Task
名为wk8s-node-0的工作节点状态为NotReady,找到并解决此问题
Answer
需要ssh到wk8s-node-0上执行命令
# 查看kubelet状态
systemctl status kubelet
# 启动kubelet
systemctl start kubelet
# 使kubelet服务开机开启
systemctl enable kubelet
# 查看kubelet状态
system status kubelet
# 验证node节点状态是Ready
kubectl get nodes
知识点
其它
1.考试环境ubantu,因此需要先进行命令补全
source <(kubectl completion bash)
原视频如下:
1.Certified Kubernetes Administrator CKA 2020年12月题库讲解(上)
2.Certified Kubernetes Administrator CKA 2020年12月题库讲解(下)