考前须知:
1、一共16题,100分66分及格,考试有两次机会
考试准备:
1、护照或或者包含英文名字证件
2、要选择工作日的早上或者晚上考试,千万不要选择周末去考,否则卡到怀疑人生,影响考试结果
3、提前1小时等待考试,关闭VM,webex、teams等服务就花了30分钟。
题目:
1、RBAC 4%
题目:
为部署管道创建一个新的ClusterRole并将其绑定特定的namespace的特定的ServiceAccount
Task
创建一个名为deployment-clusterrole且仅允许创建以下类型的新Clusrerrole
Deployment
Statefulset
Damonset
在现有的namespace app-team1中创建一 个名为cicd-token的新serviceaccount
限于namespace app-team1, 将新的Clusterrole deployment-clusterrole绑定到新的serviceaccount cicd-token
答题:
创建clusterrole
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,damemonsets
创建sa
kubectl -n app-team1 create serviceaccount cicd-token
创建rolebinding 【如果题目中没有指定名称空间,则创建的是 cluster-rolebonding,如果有namespace 则创建的是 rolebonding】
kubectl -n app-team1 create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1: cicd-token
检查:
$ kubectl auth can-i create deployment -n app-team1--as=system:serviceaccount: app-team1: cicd-token
YES
2、驱逐节点
将名为k8s-node-t 的节点设置为不可用,且重新调度到其他运行的所有pod
答题:
Kubectl drain slave1 --delete-emptydir-data --igon
ore-daemonsets --force
3、集群升级
现有的kubenets集群正在运行版本为1.18.8仅将主节点上的所有kubenets控制平台和节点组件升级版本至1.19.0
另外在主节点上升级kubectl的kubelet
确认在升级之前drain主节点,且在升级后uncorder主节点,请不要升级工作节点,etcd,constainer控制器,CNI组件,DNS服务或者其他任何组件
答题:
1、登陆root的 master
2、source <{}kubectl complction bash> \\这个考试环境不需要执行
3、kubectl drain master-1 --ingore-damensets 这个考试环境不需要--delete-emptydir-data
4、apt-cache show kubeadm | grep 1.19.0
5、apt-get install kubeadm=1.19.0-00
6、kubeadm version
7、kubeadm upgrade apply 1.19.0 --etcd-upgrade=false 并选择y
8、apt-get install kubelet=1.19.0-00 && kubelet --version
9、kubectl get nodes 发现master 不可调度 && kubectl uncordcn master-1
4、ETCD备份还原
首先,为运行在http://127.0.0.1:2379上的etcd实例创建快照,并保存到指定路径 /var/lib/backup/etcd-snapshot.db
然后还原于 /var/www/etcd/xxxx.db
服务提供了以下TLS证书和秘钥,以通过etcdctl链接到服务器
CA证书: 客户端证书; 客户端秘钥
答案: //考试环境在node1上执行 不需要切换环境
1、指定etcdctl版本为v3 export ETCDCTL_API=3
2、备份命令:etcdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/Kuxxxx/ca.crt" --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" snapshot save /var/lib/backup/etcd-snapshot.db
检查命令: etcdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/Kuxxxx/ca.crt" --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" stapshot status /var/lib/backup/etcd-snapshot.db -wtable
3、还原 etcdctl snapshot restore /var/lib/backup/etcd-snapshot.db cacert="/opt/Kuxxxx/ca.crt" --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" stapshot
检查命令: etcdctl snapshot status /var/lib/backup/etcd-snapshot.db -wtable
5、网络策略
在已有的namespace forbar中创建一个名为allow-port from namespace的新Network policy ,以允许namespace corp-bar访问其端口9200
不同namespace的情况下:
//需要给namespace corp-bar打标 project: corp-bar
kubectl label namespace corp-bar project:corpbar
Vim 5.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port from namespace
namespace: forbar
spec:
podSelector:
{}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: corp-bar
ports:
- protocol: TCP
port: 9200
相同namespace的情况下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port from namespace
namespace: forbar
spec:
podSelector:{}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
ports:
- protocol: TCP
port: 9200
Kubectl apply -f 5.yml
6、SVC
重新配置现有的deployment frond-end 并添加名为http的端口规范,以暴露现有容器nginx的端口80/TCP
创建一个名为plant-end-svc的新服务,以暴露容器端口HTTP
配置新服务以通过调度它们的节点上的Node port暴露各个pod
解答:
1、kubectl get deployment.apps
2、kubectl edit deployment.apps
在name: nginx下增加
ports:
- containerPort: 80
name: http
3、创建svc
Kubectl create svc nodeport front-end-svc --tcp=80:80
修改标签 与deployment的pod标签一致
查看标签: kubectl get svc front-end-svc --show-labels
修改app: front-end
//必须要改 否则不通,需要登陆到 master节点 去 curl svc的ip地址 为 nginx就可以了
kubectl edit svc front-end-svc
修改app: front-end-svc 为app: front-end
7、ingress
创建一个名为nginx的ingress并遵守以下规则:
Name pong
Namespace ing-internal
Exposing service hello on path/test 使用端口5678
验证: curl -Kl
//这个需要把要把原有的service 从 nodeport改成clusterip
Kubectl edit service hello 修改 type nodeport改成clusterip
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
8、扩容
将deployment web-server扩容到4个
Kubectl get delolyments.apss
Kubectl scale deployment web-server --replicas=4
9、通过node标签调度pod
按以下规则调度pod:
Name nginx.kusc004001
Image nginx
Node selector : disk ssd
解答:
1、kubectl get nodes --show-labels
2、kubectl run nginx.kusc004001 --image=nginx --dry-run=client -oyaml > 9.yaml
3、编辑yaml文件,在resource下 添加
nodeSelector:
disk: ssd
10、节点数量
检查并查看有多少节点准备就绪(不包括不可调度的节点)并将其写入/opt/1.txt
Kubectl describe node|grep Taint
None 有2个
echo 2 > /opt/1.txt
11、创建多容器
创建一个名为kucc3的pod,并且使用以下镜像(可能包含了1到4个镜像)
Nginx+redis+memached+coocsal
解答:
kubectl run nginx.kusc004001kucc3 --image=nginx --dry-run=client -oyaml > 11.yaml
增加另外三个image
12、PV
创建一个名为app.config的pv、1G大小、权限为ReadOnlyMany使用hostpath类型挂载到本地位置priveage-config
apiVersion: v1
kind: PersistentVolume
metadata:
name: app.config
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
13、PVC
创建一个pvc满足以下要求:
name: pv-volume
class: cni-hostpath-vc
Cagcity: 10Mi
创建一个pod并挂载pvc
name: test
image: nginx
Mount path /usr/share/nginx/
编辑pod volume权限为readonlyOnce
最后,使用kubectl edit或者kubectl patch将pvc大小改为70Mi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: cni-hostpath-vc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
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
14、输出日志
监控pod的日志
并将error字段的日志输出到/var/log/1.txt
Kubectl run bar --image=nginx
Kubectl logs bar |grep ‘题目的关键字’ > /var/log/1,txt
15、sidecar
在pod big-corp-app中增加一个busybox的sitecar。新的sidecar容器使用以下命令:
/bin/sh < tailf -n+1 /var/log/app.log
挂载一个logs卷并确保 /var/log/app.log文件在 sidecar中可达
不要修改已经存在的容器
不要修改日志路径与文件
解答:
1、kubectl get pod big-corp-app -oyaml > 15.yaml
2、在15.yaml中编辑
volumeMounts:下面增加
- name: logs
mountPath: /var/log
- name: busybox
image: busybox:1.28
args: [/bin/sh, -c, 'tail -n+1 -F /var/log/app.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:增加
- name: logs
emptyDir: {}
16 top
从pod标签为name-cpu-loader中找到CPU负载最大的pod名称,并输出到 log、中
解答:
Kubectl top pod -A -l app=fannel --sort-by='cpu'
echo 'cpu使用最大的pod的名字' > log
17 kubelet
名为k8s-node-C的工作节点状态为Notready,找到并解决问题
解答:
Ssh k8s-node-C节点上
Systemctl start kubelet
Systemctl enable kubelet