当前位置: 首页 > news >正文

CKA考题 [k8s1.21]

文章目录

  • 第一题
  • 第二题
  • 第三题
  • 第四题
  • 第五题
  • 第六题
  • 第七题
  • 第八题
  • 第九题
  • 第十题
  • 第十一题
  • 第十二题
  • 第十三题
  • 第十四题
  • 第十五题
  • 第十六题
  • 第十七题

【摘要】 (CKA)认证Kubernetes管理员,由Linux基金会和云原生计算基金会(CNCF)推出,是关于kubernetes技术的官方认证。考试环境kubernetes1.21。考试共计17道题,线上考试,2小时之内完成。
题目来自 华为云社区 :https://bbs.huaweicloud.com/blogs/301628

第一题

任务:

使用kubectl config use-context k8s。

  • 创建 名字为deployment-cluserrole的ClusterRole,可以创建Deployment,StatefulSet,DaemonSet。
  • 在namespace名字为app-team1下创建名字为cicd-token的ServiceAccount。
  • 将创建好的ClusterRole和cicd-token进行绑定。

答案:

切换到kubectl config use-context k8s。

kubectl create clusterrole deployment-clusterrole--verb=create--resource=Deployment,StatefulSet,DaemonSet

kubectl -n app-team1 create serviceaccourt cicd-token

kubectl create rolebinding cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1
  • 验证
kubectl describe -n app-team1 rolebindings cicd-bind

第二题

任务:

使用kubectl config use-context ek8s。

  • 名字为ek8s-node-0的节点,设置为不可用。

答案:

切换到kubectl config use-context ek8s。

kubectl drain ek8s-node-0 --ignore-daemonsets --force
  • 验证
kubectl describe ek8s-node-0

第三题

任务:

使用kubectl config use-context mk8s。

  • Master节点使用Kubeadm将升级至1.21.1。升级前master设置drain,升级后恢复uncordon。
  • Kubelet和kubectl同样升级,但是etcd不升级。

答案:

切换到kubectl config use-context mk8s

# (确定哪个node是master )
kubectl get nodes
kubectl drain ek8s-node-0--ignore-daemonsets --force
# 登录节点,并sudo -i 授权
ssh master
apt-get install -y kubeadm=1.21.1-00
# (验证)
Kubeadm upgrade plan
Kubeadm upgrade apply v1.21.1 --etcd-upgrade=false
Apt-get install -y kubelet=1.21.1-00 kubectl=1.21.1-00
systemctl daemon-reload
systemctl restart kubelet
#Exit(返回到mk8s)
kubectl uncordon ek8s-node-0
  • 验证
#(查看状态是否非unschedule)
kubectl describe ek8s-node-0

第四题

任务:

  • 对etcd进行备份。
  • 用/srv/data/etcd-snapshot-previous.db恢复etcd。

答案:

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/opt/KUIN00601/ca.crt --cert= --key=/opt/KUIN00601/etcd-client.crt \ --key=/opt/KUIN00601/etcd-client.key  snapshot save /data/backup/etcd-snapshot.db
 
ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 snapshot restore /srv/data/etcd-snapshot-previous.db

第五题

任务:

使用kubectl config use-context hk8s。

  • 创建一个名字为allow-port-from-namespace的NetworkPolicy,只允许NS为internal的pod允许通过80端口访问NS为fubar的pod。

答案:

切换到kubectl config use-context hk8s。

# (查看internal的标签)
Kubectl get ns --show-labels
Vim NetworkPolicy.yaml
# 如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: fubar
spec:
  podSelector: {}
  policyTypes:
  - Ingress
    ingress:
  - from:
    - namespaceSelector:
      matchLabels:
        label1: internal
    ports:
      - protocol: TCP
        port: 80

创建网络策略:

kubectl apply -f NetworkPolicy.yaml

第六题

任务:

使用kubectl config use-context k8s。

  • 通过一个已经存在的名字为front-end的deployment增加一个特殊的配置:
    容器为nginx,名字为http端口为80。
  • 通过修改后front-end这个deployment导出一个名字为front-end-svc,并且该SVC可以启用新修改的配置。

答案:

切换到kubectl config use-context k8s。

#(查看front-end)
kubectl get deployment.app front-end -o yaml
kubectl edit deployment.app front-end

在name=nginx下面插入:

ports:
  - name: http
    containerPort: 80

# (看到已经增加的http和80端口,则代表更改完成)
kubectl descript deployment.app front-end
kubectl expose deployment.app frond-end --port=80 --target-port=http --type=NodePort --name=front-end-svc

验证:

# (看到有front-end-svc)
Kubectl get svc
# (看到http和80端口的映射状态,代表成功)
Kubectl descript svc front-end-svc 

第七题

任务:

使用kubectl config use-context k8s。

  • 创建名字为pong的ingress,服务名hi,路径/hi,服务端口5678。

答案:

切换到kubectl config use-context k8s。

Vim ingress.yaml
# 如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  namespace: ing-internal
spec:
  rules:
  - http:
    paths:
    - path: /hi
      pathType: Prefix
      backend:
        service:
          name: hi
          port:
            number: 5678

  • 验证
Curl -kL <internal_ip> /hi

第八题

任务:

使用kubectl config use-context k8s。

  • 将guestbook的deployment内pod数量更改为6。

答案:

切换到kubectl config use-context k8s。

kubectl scale deployment guestbook --replicas=6

  • 验证
kubectl get deployment guestbook

第九题

任务:

使用kubectl config use-context k8s。

  • 创建一个pod,名字为nginx-kusc00401,镜像为nginx,nodeSelector为disk:spinning。

答案:

Vim nginx.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
  name: nginx-kusc00401
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disk: spinning

创建pod应用

kubectl apply -f nginx.yaml
kubectl get pod nginx-kusc00401

第十题

任务:

使用kubectl config use-context k8s。

  • 查看当前状态为ready的node,统计ready的node,taint=none,并将统计的数量输出到/opt/KUSC00402/kusc00402.txt。

答案:

# (查看共有几个状态为ready的node)
kubectl get nodes
# (taints:<none>,每一个node都查看一下,统计数量)
kubectl describe nodes <node name> | grep -i taint
# (将结果输入)
echo 4>/opt/KUSC00402/kusc00402.txt

第十一题

任务:

使用kubectl config use-context k8s。

  • 创建一个名字为kucc8的pod,里面包含2个容器redis和consul。

答案:

Vim kucc8.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
name: kucc8
  spec:
    containers:
    - name: redis
      image: redis
    - name: consul
      image: consul

创建应用

kubectl apply -f kucc8.yaml
kubectl get pod

第十二题

任务:

使用kubectl config use-context hk8s。

  • 创建一个名字为app-config,大小2G,readwritenany,类型为host path,path路径为/srv/app-config的卷。

答案:

使用kubectl config use-context hk8s。

Vim app-config.yaml
# 如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
  spec:
    capacity:
      storage: 2Gi
    accessModes:
      - ReadWriteMany
    hostPath:
      path: /srv/app-config

  • 验证
Kubectl get pv

第十三题

任务:

  • 创建一个名字为pv-volume,类型为csi-hostpath-sc,大小为10M的pvc。
  • 创建一个pod,使用第一步创建的pvc,挂在地址是/usr/share/nginx/html。
  • 将第一步创建的pv-volume大小更改为70M。

答案:

Vim pv-volume.yaml
# 如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-vloume
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi
  storageClassName: csi-hostpath-sc

创建pvc

kubectl apply -f pv-volume.yaml

创建pod,绑定pvc

vim web-server.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: /usr/share/nginx.html
        name: mypd
    volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: pv-volume

创建pod并验证

kubectl apply -f web-server.yaml
kubectl descript pod web-server
# (将10Mi改成70Mi,保存即可)
kubectl edit pvc pv-volume

第十四题

任务:

使用kubectl config use-context k8s。

  • 导出pod名为foobar的日志,查找其中包含file-not-found的错误,并写入到/opt/KUTR00101/foobar。

答案:

切换到kubectl config use-context k8s。

kubectl logs foobar | grep file-not-found > /opt/KUTR00101/foobar

第十五题

任务:

使用kubectl config use-context k8s。

已经有一个pod,用于存储记录kubectl的logs。

  • 已有的名字为11-factor-app的pod,添加一个容器sidicar,使用busybox镜像,命令为/binsh -c “tail -n+1 f /var/log/11-factor-app.log”。
  • 将新容器(看数据)和老容器(写数据),都挂在存储到/var/log。

答案:

# (输出其yaml文件)
kubectl get pod 11-factor-app -o yaml > app.yaml
# (先备份一份,删除managed部分,删除status部分,不删会有问题。)
vim app.yaml
# 在container下添加:
containers:
  - name: sidecar
    image: busybox
    args: [/bin/sh, -c,'"tail -n+1 f /var/log/11-factor-app.log"']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
# 在原容器下添加:
    volumeMounts:
    - name: varlog
      mountPath: /var/log
#注意:pod的volumes为emptyDir。
    volumes:
    - name: varlog
      emptyDir: {}

重新创建pod应用

kubectl delete pod 11-factor-app
kubectl apply -f app.yaml

第十六题

任务:

使用kubectl config use-context k8s。

  • 查找label标签name=cpu-utilizer的pod,查看他们的CPU使用率,将使用率最高的pod,写到/opt/KUTR00401/KUTR00401.txt。

答案:

切换到kubectl config use-context k8s。

# (查看哪个pod的CPU使用率最高,如pod名为websvr)
kubectl top pod -l name=cpu-utilizer
echo websvr >/opt/KUTR00401/KUTR00401.txt

第十七题

任务:

使用kubectl config use-context wk8s。

  • 名字叫做wk8s-node-0的node状态为NotReady,查找原因,并让其状态变为ready。

答案:

切换到kubectl config use-context wk8s。

ssh wk8s-node-0
sudo -i
# (查看kubelet为啥没起来)
systemctl status kubelet
systemctl start kubelt
systemctl enable kubelet
exit

验证:

# (状态为Ready)
kubectl get node

相关文章:

  • AcWing第 70 场周赛题解
  • 读FFA-net: Feature Fusion Attention Network for Single Image Dehazing
  • 测试需求平台4-Flask实现API服务入门实战
  • js单行代码-----dom
  • 模型压缩常用方法简介
  • css常用属性
  • 【Android】Android Binder进程间通信AIDL示例与过程分析
  • C#教程 - 模式匹配(Pattern matching)
  • 动手学习深度学习 05:深度学习计算
  • 状体模式-优雅解决物流状态
  • CTF之加密解密训练
  • gnome-terminal用法解析
  • ceres优化库的使用
  • TypeScript基础教程
  • docker安装Jenkins配置cicd
  • hexo+github搭建个人博客
  • Docker下部署自己的LNMP工作环境
  • exif信息对照
  • express如何解决request entity too large问题
  • Go 语言编译器的 //go: 详解
  • Java小白进阶笔记(3)-初级面向对象
  • java小心机(3)| 浅析finalize()
  • js中的正则表达式入门
  • k8s如何管理Pod
  • passportjs 源码分析
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 阿里研究院入选中国企业智库系统影响力榜
  • 关于Flux,Vuex,Redux的思考
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 浏览器缓存机制分析
  • 使用权重正则化较少模型过拟合
  • 用简单代码看卷积组块发展
  • 在weex里面使用chart图表
  • Semaphore
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $GOPATH/go.mod exists but should not goland
  • (2015)JS ES6 必知的十个 特性
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (k8s中)docker netty OOM问题记录
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • *Django中的Ajax 纯js的书写样式1
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Framework .NET Core与 .NET 的区别
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [ linux ] linux 命令英文全称及解释
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [C++]类和对象(中)
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [DevOps云实践] 彻底删除AWS云资源
  • [Editor]Unity Editor类常用方法