2020年12月cka17题

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
image.png

知识点

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 
image.png

知识点

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 
image.png

知识点

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 /hello

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-config的pv1Gi大小,权限为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月题库讲解(下)

你可能感兴趣的:(2020年12月cka17题)