CKA 认证考试必过技巧分享

CKA 认证考试必过技巧分享_第1张图片

什么是CKA考试?

CKA (Certified Kubernetes Administrator) 考试是一种远程在线、有监考、基于实操的认证考试,需要在运行Kubernetes的命令行中解决多个任务。CKA认证考试是专为Kubernetes管理员、云管理员和其他管理Kubernetes实例的IT专业人员而设的。已获得认证的K8s管理员具备了进行基本安装以及配置和管理生产级Kubernetes集群的能力。

考CKA有什么用?

  1. 证明你的实力,提高竞争力: 云原生发展趋势日益迅猛,越来越多的公司已经开始使用kubernetes作为核心容器调度平台,因此在诸多岗位都有明确的CKA认证要求。
  2. 公司招投标:有过招投标经验的同学应该了解招投标的过程,这块就不详细叙述,通过CKA证明你们公司拥有云原生技术实力,同时可通过CKA认证提供公司投标评分
  3. 申请KCSP认证:每个公司有3名CKA员工就可以申请KCSP

考试内容

CKA 认证考试必过技巧分享_第2张图片

通过考试后您将会获得由Linux基金会和云原生计算基金会(CNCF)颁发的CKA (Certified Kubernetes Administrator)证书,如下:

CKA 认证考试必过技巧分享_第3张图片

考试规则

考试模式:线上考试

考试时间:2小时

认证有效期:3年

软件版本:Kubernetes v1.24

重考政策:可接受1次重考

经验水平:中級

考试过程中你的PC机是可以通过浏览器访问Kubernetes官网的,这一点很重要,相当于“开卷考试”,所以没事多看看官网文档很重要!知道考试内容在哪里,学会关键词搜索。

https://kubernetes.io/zh-cn/docs/home/

更多关于考试的详细内容可以前往linuxfoundation社区官网查看

https://training.linuxfoundation.cn/certificates/1

考试技巧

1. 别名设置

考试多半是通过命令行直接操作,已到达考试目标,频繁的命令不仅容易出错而且比较占用时间,2小时很宝贵!通过别名来偷个懒吧!

vi ~/.bashrc
---
alias k='kubectl'
alias kg='k get'
alias kd='k describe'
alias kl='k logs'
alias kc='k create'
source <(kubectl completion bash)
source <(kubectl completion bash | sed 's/kubectl/k/g' )
complete -F __start_kubectl k
---

2. 资源简称-SHORTNAMES

下面只是列举了部分比较常见的资源,因为k8s资源很多,像查看更多的话,可以执行 kubectl api-resources 命令来查看,表格中的简称一定要记住!尤其是英文不好的同学。

CKA 认证考试必过技巧分享_第4张图片

CKA 认证考试必过技巧分享_第5张图片

3. 学会看文档

记住“这是一场开卷考试”,所以不要想着死记硬背那一堆yaml文件,学会使用搜索,这将事半功倍,例如:想要知道deployment里面有哪些可以配置的字段,直接在官网文档搜索 deployment 即可,而且支持中文,考试中让你创建一个 deployment,你完全可以把 yaml 粘贴过去,通过 vi 命令编辑一些名称和docker image 即可,到这是不是感觉离通过考试又进了一步!

CKA 认证考试必过技巧分享_第6张图片

CKA 认证考试必过技巧分享_第7张图片

4. Help大法好

学会 kubectl xxx --help,会有不一样的惊喜。

CKA 认证考试必过技巧分享_第8张图片

5.牢记pod的状态

在k8s集群中,我们创建最多的资源应该就是pod了,因为这直接关系到我们的服务是否正常,了解pod不同状态所代表的含义是更加有利于帮助我们排查问题

CKA 认证考试必过技巧分享_第9张图片

考试练习

集群安装

平时学习、练习时是可以用kubeadm去安装集群,目前这是官方比较推荐的方式。

1) 初始化集群

kubeadm init --kubernetes-version 1.24 \
 --pod-network-cidr=172.16.0.0/16 \ 
 --apiserver-advertise-address=167.235.78.191

2) 添加节点

kubeadm join 192.168.1.253:6443 --token ptildy.2nyolwhkd8g1p8pq \
    --discovery-token-ca-cert-hash sha256:581214693222568860b1887121aab546b87f6fbfc1342d4092aa18601b2c27c3

3) 维护、移除节点

cordon  将节点标记为不可调度
drain  节点准备维护,将有问题的node中的pod迁移到其他正常的node上
taint    更新一个或多个节点上的错误

4) 恢复节点

uncordon  将节点标记为可调度

工作负载:

1) Deployment(无状态应用)

是kubernetes在1.2版本中引入的概念,用于更好的解决Pod的编排问题,Deployment在内部使用了ReplicaSet来实现目的,我们可以把Deployment理解为ReplicaSet的一次升级,两者的相似度超过90%。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

2) StatefulSet(有状态应用)

和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # 必须匹配 .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # 默认值是 1
  minReadySeconds: 10 # 默认值是 0
  template:
    metadata:
      labels:
        app: nginx # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1G

3) DaemonSet

守护进程,DaemonSet会在每个k8s 节点运行一个pod,当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。比如:Prometheus监控、日志收集的系统都需要

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

4) Job

任务,通常任务是临时性的,Job 会创建一个或者多个 Pod,Pod中的程序计算完成后会自动终止

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

服务和网络:

1) service

将运行在一组 Pods上的应用程序公开为网络服务的抽象方法。简单来说就是起到一个自动注册和对集群内部服务访问的作用。试想一下因为pod重建后IP都会变,想要被其他服务一直被访问不太现实,而且多个pod副本难道自己要搭建一个负载均衡,然后还要考虑pod怎么注册进来?不需要!这就是 service 干的活儿。

通过 selector 可以选择这个 service 后端的服务是什么,类似配置SLB负载均衡的Backend

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

2) ingress

提供将集群内部服务暴露到外部的能力,简单理解就是起到一个负载均衡器的作用,目前开源的ingress有 nginx-ingress、traefik,商用的F5、A10都有

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: my-app
            port:
              number: 80

存储

1) 持久卷(Persistent Volume)

简称 PV,PV是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统

apiVersion: v1
kind: PersistentVolume
metadata:
  name: foo-pv
spec:
  storageClassName: ""
  claimRef:
    name: foo-pvc
    namespace: foo

2) 持久卷申领(PersistentVolumeClaim)

简称PVC,PVC 表达的是用户对存储的请求。概念上与 Pod 类似。Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs"
spec:
  storageClassName: "nfs"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

3) 存储类 (storageClass)

简称SC,通过SC不需要管理员单独去创建PV,普通用于只需要根据需要指定用哪个SC,然后在PVC中指定存储卷大小就可以自动申请下来存储卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
provisioner: fuseim.pri/ifs
parameters:
  archiveOnDelete: "true"
reclaimPolicy: Retain

4) 存储类型

emptyDir: Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存,使用场景:如果Pod被删除,那么数据也会被删除,不具备持久化。Pod内的容器,需要共享数据卷的时候,使用的临时数据卷。

hostpath:直接挂载主机目录, 如果需要通过容器直接读取宿主机磁盘中的内容,那么可以通过挂载hostpath 的卷实现

故障排除

1) 常用工具

kubectl describe: 当任何资源没有进入一个正常状态的时候,都可以通过kubectl describe查看这个资产的事件信息

kubectl logs:这个命令主要对于pod资源使用,当pod 进入 running 状态后,服务已经有问题,这时候可能程序里面有报错,可以使用 kubectl logs 查看pod中应用的具体日志

2) 网络

遇到网络问题可使用 ping 、mtr、telnet 等命令测试网络连通性,判断网络故障点

总结

勤加练习是通过 CKA 考试的关键,本文只列举了部分实操内容,更多考试内容以及详细信息可以前往CNCF官网或Linux foundation查看,最后祝各位考试顺利通过!

关于HummerRisk

CKA 认证考试必过技巧分享_第10张图片

HummerRisk 是开源的云原生安全平台,以非侵入的方式对云原生环境进行全面安全检测。

针对于 K8s 容器云的安全,我们提供多方面的检测能力,可以帮助用户快速发现K8s集群中的各种安全问题。

欢迎关注我们了解更多。

GitHub - HummerRisk/HummerRisk: HummerRisk 是云原生安全平台,包括混合云安全治理和容器云安全检测。

你可能感兴趣的:(K8s安全,kubernetes,云原生,运维,容器)