2023-12月-CKA考题

        考试虽然是开卷考试,但是你得知道在哪儿查,怎么查,在哪儿看,改哪儿里。

01:RBAC(clusterrole,rolebinding)

官方参考地址:可恶!!不让挂链接!!

创建一个名称为 deployment-clusterrole 的 clusterrole,并只允许创建 deployment、statefulset、daemonset 资源
在 app-team1 命名空间下创建一个名称为 cicd-token 的 serviceaccount 资源对象
限定于 app-team1 名称空间,将上述创建两个资源对象进行绑定

解题:

1、创建ClusteRrole角色

kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets

2、创建ServiceAccount账户

kubectl create serviceaccount cicd-token -n app-team1

3、创建RoleBinding将角色与账户绑定

kubectl create rolebinding cicd-token --serviceaccount=app-team1:cicd-token --clusterrole=deployment-clusterrole -n app-team1

4、验证绑定信息

kubectl describe rolebinding cicd-token -n app-team1

02:节点维护(cordon,drain)

官方参考地址:可恶!!不让挂链接!!

考题:将k8s-node-1节点设置为不可用,然后重新调度该节点上的所有Pod

解题:

1、设置节点不可调度

kubectl cordon k8s-node-1

2、驱除k8s-node-1节点上Pod

kubectl drain k8s-node-1 --ignore-daemonsets --delete-emptydir-data --force

参数参考:可恶!!不让挂链接!!

–force 不被控制器 (RC、RS、Job、DaemonSet 或 StatefulSet) 管理的pod也会被强制删除
–ignore-daemonsets 表示不会驱逐 daemonset 管理的 Pods
–delete-emptydir-data 如果 pods 使用 emptyDir,也会继续被删除

03:集群版本升级

官方参考地址:可恶!!不让挂链接!!

考题:现有的Kubernetes 集群正在运行版本1.19.0。仅将master节点上的所有 Kubernetes控制平面和节点组件升级到版本1.20.0。

确保在升级之前 drain k8s-master-1节点,并在升级后 uncordon k8s-master-1节点。

另外,在主节点上升级kubelet和kubectl,请不要升级工作节点,etcd,container 管理器,CNI插件, DNS服务或任何其他插件。

解题:

1、驱除节点pod

kubectl cordon k8s-master-1
kubectl drain k8s-master-1 --delete-emptydir-data --ignore-daemonsets --force

2、将kubeadm升级到1.20.0版本

apt-cache show kubeadm|grep 1.20.0
apt-get update
apt-get install kubeadm=1.20.0-00
Do you want to continue? [Y/n] y

3、验证升级计划

kubeadm version
kubeadm upgrade plan

5、选择升级的版本 v1.23.2,忽略etcd升级

kubeadm upgrade apply v1.20.0 --etcd-upgrade
[upgrade/confirm] Are you sure you want to proceed with the upgrade? [y/N]: y

正确升级完成后会显示下图:

5、升级kubelet、kubectl

apt-get install kubelet=1.20.0-00 kubectl=1.20.0-00
Do you want to continue? [Y/n] y
kubelet --version
kubectl version

6、设置节点可调度

sudo systemctl daemon-reload
sudo systemctl restart kubelet

kubectl uncordon k8s-master-1
kubectl get nodes

04:ETCD

官方参考地址:可恶!!不让挂链接!!

考题:首先,为运行在https://127.0.0.1:2379上的现有 etcd 实例创建快照并将快照保存到 /tmp/etcd-snapshot.db文件

然后还原位于/tmp/etcd-snapshot-previous.db的现有先前快照。

提供了以下TLS证书和密钥,以通过etcdctl连接到服务器。

解题:

1、备份ETCD数据

​
export ETCDCTL_API=3 
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/etcd-snapshot.db

​

2、恢复ETCD数据

​
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /tmp/etcd-snapshot-previous.db

​

05:NetworkPolicy

官方参考地址:可恶!!不让挂链接!!

考题:基于已经存在的 topic-5 名称空间中创建一个名为allow-port的新NetworkPolicy。

确保新的NetworkPolicy允许echo名称空间中的Pods连接到名称空间topic-5中的Pods的9900端口。

进一步确保新的NetworkPolicy:

  • 不允许对没有在监听端口9900的Pods的访问
  • 不允许非来自名称空间echo中的Pods的访问

解题:

1、给echo名称空间打一个标签

#kubectl get ns --show-labels 查看标签
kubectl label ns echo project=echo

2、编写资源清单 && 执行资源清单

vim networkpolicy.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port
  namespace: topic-5
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: echo
      ports:
        - protocol: TCP
          port: 9900
kubectl apply -f networkpolicy.yaml

06:Service

官网参考地址:可恶!!不让挂链接!!

考题:重新配置一个已经存在的front-end的deployment,在名字为nginx的容器里面添加一个端口配置,名字为http,暴露端口号为80,然后创建一个service,名字为front-svc,暴露该deployment的http端口,并且service的类型为NodePort。

解题:

1、添加deployment暴露端口配置

kubectl edit deployment front-end

#添加如下
        ports:
        - containerPort: 80
          name: test
          protocol: TCP

2、编写service资源清单 && 执行资源清单

vim front-svc.yml 
---
apiVersion: v1
kind: Service
metadata:
  name: front-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: http
kubectl apply -f front-svc.yml 

3、验证service是否关联到Pod

kubectl describe svc front-svc

07:Ingress

官网参考地址:可恶!!不让挂链接!!

考题:如下创建一个nginx Ingress资源满足一下要求:

  • 名称:ingress-topic-7

  • 名称空间:topic-7

  • 使用服务端口 6686在路径 /go 上公开服务 go

解题:

1、创建 ingressclass && 执行

vim ingressclass.yml 
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx-example
  namespace: topic-7
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx
kubectl apply -f ingressclass.yml 

2、创建ingress规则 && 执行

vim ingress.yml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress.yml 
  namespace: topic-7
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /go
        pathType: Prefix
        backend:
          service:
            name: go
            port:
              number: 6686

08:Pod扩容(replicas)

考题:将loadbalancer的deployment管理的Pod的副本数扩容成6个

解题:

1、修改副本为6

kubectl edit deployment loadbalancer


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、验证副本数

kubectl get deployment loadbalancer

09:Pod指定调度节点(nodeSelector)

官方参考地址:可恶!!不让挂链接!!

考题:创建一个Pod,名字为topic-9,镜像地址是nginx,调度到具有env=uat标签的节点上

解题:

vim topic-9-pods.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: topic-9
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    env: uat
kubectl apply -f topic-9-pods.yml 

10:检查Node节点

考题:检查集群中有多少节点为Ready状态(不包括被打上 Taint:NoSchedule 的节点),之后将数量写到/tmp/kube-node.txt文件中。

解题:

k8s_ready=$(kubectl get node|grep -w "Ready"|wc -l)
k8s_noschedule=$(kubectl describe node|grep -w Taints|grep "NoSchedule" |wc -l)
k8s_sum=$(( ${k8s_ready} - ${k8s_noschedule} ))
echo ${k8s_sum} > /tmp/kube-node.txt

11:Pod多容器

官方参考地址:可恶!!不让挂链接!!

考题:创建一个Pod,名字为topic-11,这个Pod包含4容器,为nginx、redis、memcached、consul

解题:

1、创建Pods

cat topic-11-pods.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: topic-11
spec:
  containers:
  - name: nginx
    image: nginx
  - name: redis
    image: redis
  - name: memcached
    image: memcached
  - name: consul
    image: consul
kubectl apply -f topic-11-pods.yml 

2、验证Pods

kubectl get pods topic-11

12:PersistentVolume(PV)

官方参考地址:可恶!!不让挂链接!!

考题:创建一个persistentvolume,名字为nginx-config,大小为1Gi,访问权限为ReadWriteMany。Volume的类型为hostPath,路径为/tmp/nginx-config

解题:

cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-config
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/tmp/nginx-config"
kubectl apply -f pv.yaml

13:PersistentVolumeClaim(PVC)

官方参考地址:可恶!!不让挂链接!!

考题:创建一个名字为pvc-volume的pvc,指定storageClass为csi-hostpath-sc,大小为20Mi

然后创建一个Pod,名字为web-server,镜像为nginx,并且挂载该PVC至/usr/share/nginx/html,挂载的权限为ReadWriteOnce。之后通过kubectl edit或者kubectl path将pvc改成70Mi,并且记录修改记录。

解题:

1、编写PVC资源清单 && 执行

vim pvc.yaml 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-volume 
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Mi
  storageClassName: csi-hostpath-sc
kubectl apply -f pvc.yaml

2、创建Pod,挂载PV

cat pod-pvc.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  volumes:
    - name: pvc-volume
      persistentVolumeClaim:
        claimName: pv-volume
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pvc-volume
kubectl apply -f pvc-pods.yaml

3、修改PVC容量为70Mi

14:log查看

考题:监控名为foobar的Pod的日志,并过滤出具有unable-access-website 信息的行,然后将写入到 /tmp/foobar.txt

解题:

kubectl logs foobar|grep  unable-access-website >/tmp/foobar.txt

15:边车(Sidecar)

官方参考地址:可恶!!不让挂链接!!

考题:使用busybox Image来将名为sidecar的sidecar容器添加到现有的Pod legacy-app上,新的sidecar容器必须运行以下命令:

/bin/sh -c tail -n+1 -f /var/log/legacy-app.log

使用volume挂载/var/log/目录,确保sidecar能访问/var/log/legacy-app.log文件

解题:

1、基于legacy-appPod添加新的sidecar容器

kubectl get pods legacy-app -o yaml > legacy-app.yml
vim legacy-app.yml

编辑后需要修改以下几个步骤

#现有容器新增
    volumeMounts:
    - name: varlog
      mountPath: /var/log
#添加sidecar容器
  - name: sidecar
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f var/log/legacy-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
#最下面添加
  volumes:
  - name: varlog
    emptyDir: {}

2、删除已存在的Pod,执行上面更改完成的配置清单

kubectl delete pod legacy-app --force  --grace-period=0
kubectl apply -f legacy-app.yml

3、验证,正常1s会输出一条日志

kubectl logs -f  legacy-app -c  sidecar

16:Pod CPU资源使用率

考题:找出标签是name=cpu-user的Pod,并过滤出使用CPU最高的Pod,然后把它的名字写在已经存在的 /opt/KUTR27801/KUTR27801.txt文件里

解题:

1、查看CPU使用率最高的Pod(name=cpu-user)

kubectl top pod -l name=cpu-user --sort-by="cpu" –A 
# 然后将第一个 Pod 名称写到文件

2、将查看到Pod名称输出到 /opt/KUTR27801/KUTR27801.txt

echo "kube-apiserver-k8s-master-1" >  /opt/KUTR27801/KUTR27801.txt

17:故障排查(kubelet)

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

可以使用以下命令,通过ssh连接到wk8s-node-0节点:

ssh k8s-node-1

可以使用以下命令,在该节点上获取更高权限:

sudo -i

解题:

1、进入故障节点

ssh k8s-node-1
sudo -i

2、重启kubelet && 加入开机自启动

systemctl status kubelet
systemctl restart kubelet
systemctl enable kubelet

3、退出到原终端

exit
  • 33
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值