Kubernetes-CKA-2022真题

Kubernetes环境安装过程看 二进制部署kubernetes 1.25.5或 使用kubeadm搭建kubernetes 1.25.5

二进制 一

二进制 二

检测脚本地址

题库

题目一 RBAC

创建一个名为deployment-clusterrole的clusterrole,该clusterrole只允许创建deployment、daemonset、statefulset的create操作。

在名字为 app-team1的namespace下创建一个名为cicd-token的serviceAccount。

限于namespace app-team1,将新的clusterrole deployment-clusterrole绑定到新的serviceAccount cicd-token。

参考答案:

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

题目二 Top

通过pod label name=cpu-utilizer 直到运行占用大量cpu的pod,将pod名写入文件/opt/KUTR00401/KUTR00401.txt

测试环境先创建

参考答案:

kubectl top pod -h
kubectl top pod -lname=cpu-utilizer --sort-by='cpu'-A
echo <podname> > /opt/KUTR00401/KUTR00401.txt

题目三 Networkpolicy

在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访问

参考答案:

vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: my-app       # 被访问着的名称空间
spec:
  podSelector:      # 这两行必须要写,或者也可以写成一行为 podSelector: {}  
    matchLabels: {}
  policyTypes:
    - Ingress          # 策略影响入栈流量
  ingress:
    - from:            # 允许流量的来源
        - namespaceSelector:
            matchLabels:
              name: big-corp     #访问者的命名空间的标签 label
      ports:
        - protocol: TCP
          port: 8080      # 被访问者公开的端口
#官网链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
#官网->概念->服务->网络策略
#或 在搜索写入 network policy
​
​
# 查看所有 ns 的标签 label
kubectl get ns big-corp --show-labels
#将命名空间标签
kubectl label namespace big-corp name=big-corp
#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用
# vim 03.yaml
#内容参考下方
kubectl apply -f networkpolicy.yaml
kubectl get networkpolicy -n my-app   #查看状态。如果脚本报错,可能是命名空间标记没标注导致脚本报错。

题目四 Service

重新配置现有的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 get svc -n k8s                    # 查看服务有没有启动,考试不需要
kubectl edit deployment front-end -n k8s  # 注意,已经存在pods,修改即可,改动如下:
# 在以下位置然后保存:wq
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
    ports:
    - containerPort: 80
      name: http
      protocol: TCP
kubectl expose -h
kubectl expose deployment front-end --name front-end-svc --port80--target-port http --type NodePort --namespace k8s
#说明,deployment 接的是pod名字,外部端口,容器端口,type别漏了,--name=svc名字
kubectl get deployment front-end -n k8s -owide      #查看配置
kubectl get svc -n k8s                               #查看服务
curl nodeIP:端口                                    #验证是否访问到nginx

题目五 Ingress

创建一个新的nginx Ingress资源:

名称: pong

Namespace: ing-internal

使用服务端口 5678 在路径 /hello上公开服务 hello

可以使用curl -kl <IP> /hello

参考答案:

vim ingress.yml
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
#官网地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource
#文档路径:概念 --> 服务,负载均衡和联网  --> Ingress-->第一个示例
#或搜索ingress
kubectl apply -f ingress.yml
curl-kL ip/hello  

题目六 副本扩容

将deployment 从 loadbalancer 扩展至 5 pods

参考答案:

kubectl get deployment -n k8s
kubectl scale deployment loadbalancer --replicas=5-n k8s  #记住scale既可以
kubectl get deployment -n k8s

题目七 分配Pod

按照要求调度一个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 run nginx-kusc00401 --image=nginx --dry-run=client --namespace k8s -o yaml > nginx.yaml
# --dry-run 以某种方式只测试不运行,不会创建pod,测试语句是否正常。
​
# 修改nginx.yaml
​
spec:
  nodeSelector:
    disk: ssd
  containers:
​
​
# 创建,如果是自己搭建的环境需要给一台下属节点创建label
kubectl apply -f nginx.yaml
kubectl get pods nginx-kusc004001 -owide-n k8s

题目八 统计污点

统计有多少个worker nodes 以准备就绪(不包括被打上Taint:NoSchedule的节点),并将数量写入到/opt/KUSC00402/kusc00402.txt

参考答案:

# 方法一:
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 getnode | 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 

题目九 多容器运行一个Pod

创建一个名叫kucc4的pod,在pod里面分别为每个images单独运行一个app container Nginx+redis+memcached

参考答案:

#官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
#文档主页-->概念-->工作负载-->pod
#或搜索pods
kubectl run hwcka-009 --image=nginx --dry-run=client --namespace k8 -o yaml > 09.yaml
#修改vim 09.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: hwcka-009
  name: hwcka-009
  namespace: k8s
spec:
  containers:
  - image: nginx
    name: nginx
  - image: redis
    name: redis
  - image: memcached
    name: memcached
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
kubectl apply -f09.yaml

题目十 PV

创建名叫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 作为存储
vim 10.yaml
kubectl apply -f 10.yaml
kubectl get pv -n k8s
apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-data
  namespace: k8s
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  hostPath:
     path: /srv/app-data/

题目十一 PVC

创建一个新的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修改大小
vim pvc.yaml
kubectl apply -f pvc.yaml
kubectl get pvc -n k8s        #注意,这里因为没有csi这个类,所以状态处于pending是正常的。考试会有csi这个类,csi这个类需要安装对应插件才能使用。
kubectl edit pvc pv-volume --save-config-n k8s     #我们修改会保存不了,因为上面pvc,pending状态,记住在那里修改即可。或--save-config也可以用--record替换。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-volume
  namespace: k8s
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:
  name: web-server
  namespace: k8s
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: pv-volume

题目十二 Logs

监控 pod bar的日志并:提取与错误 file-not-found 相对应的日志行,将这些日志写入到 /opt/KUTR00101/bar

参考答案:

kubectl logs -h
kubectl logs pod/bar -n k8s | grep file-not-found >/opt/KUTR00101/bar  #注意pod/bar格式。可以先logs看有没有信息在输出,注意权限问题,必要加sudo
cat /opt/KUTR00101/bar               #验证

题目十三 Sidecar

现有一个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 get po leagcy-app -oyaml-n k8s > 13.yaml       #导出旧pod修改,注意因为要求不对原有pod修改,只能新增辅助sidecar,另外要注意备份
cp13.yaml 13.bak.yaml                #备份
kubectl delet pod legacy-app          #删除旧pod
kubectl apply -f13.yaml              #重新部署
kubectl exec -n k8s legacy-app -c legacy-app -- tail -f /var/log/legacy-app.log    #验证
kubectl exec -n k8s legacy-app -c sidecar -- tail -f /var/log/legacy-app.log     #验证是否使用同一个log
#第一处
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-gzqgn
      readOnly: true
    - name: varlog
      mountPath: /var/log/
  - args: [/bin/sh, -c,'tail -n+1 -f /var/log/legacy-app.log']
    name: sidecar
    image: 10.10.10.2/lancy/busybox
    volumeMounts:
    - name: varlog
      mountPath: /var/log/
  dnsPolicy: ClusterFirst
​
#第二处
  volumes:
  - name: varlog
    emptyDir: {}
  - name: kube-api-access-gzqgn

题目十四 升级

现有的 Kubernetes 集权正在运行的版本是 1.20.4,仅将主节点上的所有 kubernetes 控制面板和组件升级到版本 1.20.1 另外,确保在升级之前drain主节点,并在升级完成后uncordon主节点,在主节点上升级 kubelet 和 kubectl

参考答案:

#官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
#文档主页-->任务-->管理集群-->用 kubeadm 进行管理-->升级 kubeadm 集群
#或搜索kubeadm update
# 1、配置
#升级kueadm
kubectl cordon mk8s-master-0
kubectl drain mk8s-master-0 --ignore=daemonsets           #驱逐pod 
ssh mk8s-master-0                            #远程到master节点
sudo-i                                         #提权
yum 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 getnode-owide
kubectl --version
kubelet --version

题目十五. Etcd备份

针对 etcd 实例 https://127.0.0.1:2379 创建一个快照,保存到/data/backup/etcd-snapshot.db在创建快照的过程中,如果卡住了,就键入 ctrl+c 终止,然后重试。然后恢复一个已经存在的快照: /data/backup/etcd-snapshot-previous.db执行 etcdctl 命令的证书存放在:ca 证书:/etc/kubernetes/pki/etcd/ca.crt客户端证书:/etc/kubernetes/pki/etcd/server.crt客户端密钥:/etc/kubernetes/pki/etcd/server.key

参考答案:

#官网地址:https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
#文档主页-->任务-->管理集群-->为Kubernetes运行etcd集群
#或搜索etcd
#1、确定当前环境
kubectl getnode
#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
sudoETCDCTL_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 退回上一步操作

题目十六 Node 状态排错

一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成

参考答案:

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驱逐Pod

将名叫ek8s-node-1的node设置为不可用,并重新调度该node上的所有pods。

参考答案:

#1、配置
kubectl coredon ek8s-node-1                  #设置为不可调度
kubectl drain ek8s-node-1 --ignore-daemonsets#设置次节点为不可调度,并且排空次节点
#如果上面命令报错就加上一个 --delete-local-data --force
2、验证
kubectl get node
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值