CKA考试心得

考前须知:

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

CKA考试心得_第1张图片

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

//这个需要把要把原有的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

CKA考试心得_第2张图片

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

CKA考试心得_第3张图片

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

你可能感兴趣的:(Kubernetes,kubernetes)