言简意赅的讲解Certified Kubernetes Administrator认证
在当今云计算和容器化技术迅猛发展的背景下,Kubernetes成为了现代软件开发和运维中的核心工具。作为一项广泛认可的认证,CKA (Certified Kubernetes Administrator) 认证不仅能够帮助提升个人的职业竞争力,还能证明你在Kubernetes集群的管理与维护方面具备专业技能。
无论你是刚接触Kubernetes的新手,还是已经在使用容器化技术的开发与运维工程师,准备通过CKA考试都是一个提升自己能力的重要步骤。本文将结合最新的CKA 1.29考试大纲,为你提供一份详细的备考指南。我们将深入分析考试的核心考点,帮助你精准定位备考方向,提升备考效率,从而顺利通过CKA认证考试。
刚考过了CKA给大家分享下知识,注意
本文章不能作为考试依据,只能作为学习使用。
一、RBAC(基于角色的访问控制)
题目
你需要为名为dev
的命名空间中的用户创建一个角色,允许他只能查看Pods的状态,但不能进行修改操作。该用户只能访问命名空间内的资源。请编写一个RBAC角色和角色绑定。
解析
首先,需要创建一个Role(角色),该角色只允许读取Pod的状态。然后,为该用户创建一个RoleBinding,将该Role绑定到用户上。
# rbac-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: pod-reader
rules:
- verbs: ["get", "list"]
apiGroups: [""]
resources: ["pods"]
# rbac-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: dev
subjects:
- kind: User
name: "dev-user" # 这里是要绑定的用户
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
命令:
kubectl apply -f rbac-role.yaml
kubectl apply -f rbac-rolebinding.yaml
此配置会创建一个pod-reader
角色,该角色只能查看dev
命名空间下的Pod信息(使用get
和list
动词),并将其绑定给dev-user
用户。
二、NetworkPolicy的创建
题目
你需要限制只有命名空间default
中的Pod才能访问命名空间dev
中的Pod。请编写一个NetworkPolicy来实现这一点。
解析
NetworkPolicy通过设置Ingress规则来控制访问。我们需要创建一个NetworkPolicy,允许default
命名空间中的Pod访问dev
命名空间中的Pod,其他命名空间的Pod则无法访问。
# networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-default-to-dev
namespace: dev
spec:
podSelector: {} # 选择所有dev命名空间中的Pod
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default # 允许default命名空间中的Pod访问
命令:
kubectl apply -f networkpolicy.yaml
此配置会创建一个NetworkPolicy
,允许来自default
命名空间的Pod访问dev
命名空间中的所有Pod。
三、Ingress的创建
题目
你需要创建一个Ingress资源,将集群外部的流量路由到命名空间default
中的my-service
服务。服务监听80端口,Ingress的路径是/app
。请编写Ingress的yaml文件。
解析
Ingress资源用于路由外部流量到集群内部的服务。我们需要创建一个Ingress,定义访问路径为/app
,并将流量路由到名为my-service
的服务。
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
命令:
kubectl apply -f ingress.yaml
此配置会创建一个Ingress,将myapp.example.com/app
的请求转发到default
命名空间中的my-service
服务,监听端口80。
四、kubectl top命令的使用
题目
你想查看集群中所有Pod的CPU和内存使用情况。请使用kubectl top
命令查看。
解析
kubectl top
命令用于查看资源使用情况。可以使用kubectl top pod
来查看Pod的资源使用情况。
kubectl top pod
命令输出类似于以下格式:
NAME CPU(cores) MEMORY(bytes)
pod-1 100m 256Mi
pod-2 200m 512Mi
此命令会显示当前集群中所有Pod的CPU和内存使用情况。
五、nodeSelector属性的使用
题目
你有两个节点,分别带有标签role=frontend
和role=backend
。你需要将一个Pod调度到带有role=frontend
标签的节点上。请编写Pod的yaml文件,并确保它只会调度到该节点上。
解析
nodeSelector
允许指定Pod只能调度到带有特定标签的节点上。在此示例中,我们将Pod的nodeSelector
设置为role=frontend
。
# pod-with-nodeSelector.yaml
apiVersion: v1
kind: Pod
metadata:
name: frontend-pod
spec:
nodeSelector:
role: frontend
containers:
- name: nginx
image: nginx
命令:
kubectl apply -f pod-with-nodeSelector.yaml
此配置会创建一个Pod,它会被调度到带有role=frontend
标签的节点上。
六、检查节点角色标签、状态属性和污点属性的使用
题目
你需要查看集群中所有节点的标签、状态以及是否存在污点。请编写命令来获取这些信息。
解析
可以使用kubectl get nodes
命令来查看节点的标签,状态以及污点属性。
kubectl get nodes --show-labels
输出示例:
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready master 10d v1.29.0 role=frontend,env=prod
node2 Ready <none> 10d v1.29.0 role=backend,env=prod
如果要查看污点属性,可以使用以下命令:
kubectl describe node <node-name> | grep Taints
七、创建多容器的Pod
题目
你需要创建一个包含两个容器的Pod,一个容器运行nginx,另一个容器运行一个简单的应用程序。请编写Pod的yaml文件。
解析
一个Pod可以包含多个容器,这两个容器可以共享网络和存储资源。
# multi-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: nginx
image: nginx
- name: myapp
image: myapp-image
命令:
kubectl apply -f multi-container-pod.yaml
此配置会创建一个Pod,包含两个容器:nginx
和myapp
,它们共享网络和存储资源。
八、hostPath类型的PV
题目
你需要创建一个hostPath
类型的PersistentVolume(PV),并使用hostPath
存储类型将其挂载到集群中的某个目录。请编写PV和PVC的yaml文件。
解析
hostPath
类型的PV将Pod的存储挂载到宿主机的特定目录。它用于本地存储场景。为了实现这个需求,我们需要先创建一个PV,再创建一个PVC来请求这个存储资源。
# pv-hostpath.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/data # 宿主机路径
type: DirectoryOrCreate
# pvc-hostpath.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hostpath-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manual
命令:
kubectl apply -f pv-hostpath.yaml
kubectl apply -f pvc-hostpath.yaml
此配置会创建一个hostPath
类型的PV,并将其挂载到宿主机的/mnt/data
路径。然后通过PVC请求这个存储资源。
九、PVC的创建及class属性的使用
题目
你需要为一个Pod创建一个持久化存储,存储类使用standard
,并且需要指定存储请求大小为2Gi
。请编写PVC的yaml文件。
解析
PVC是Pod请求存储资源的方式。我们可以指定存储类名称storageClassName
和存储的大小。standard
是Kubernetes集群中通常默认的存储类。
# pvc-standard.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-standard
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: standard
命令:
kubectl apply -f pvc-standard.yaml
该PVC请求了2Gi
的存储,并且指定了storageClassName
为standard
。
十、监控Pod日志
题目
你需要查看Pod my-pod
的日志,并根据日志中包含的特定关键字ERROR
筛选错误信息。请编写命令来实现。
解析
使用kubectl logs
命令可以查看Pod的日志,可以通过grep
来筛选包含特定关键字的日志行。
kubectl logs my-pod | grep "ERROR"
这个命令会返回Pod my-pod
中包含ERROR
关键字的日志行,有助于快速定位问题。
十一、Pod两个容器共享存储卷
题目
你需要创建一个包含两个容器的Pod,其中一个容器运行nginx
,另一个容器运行sidecar
应用程序。两个容器需要共享一个存储卷。请编写Pod的yaml文件。
解析
在Pod中可以通过共享存储卷让多个容器访问相同的数据。可以在Pod中定义volumes
,然后在各个容器中挂载相同的卷。
# multi-container-pod-with-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod-with-volume
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: shared-storage
- name: sidecar
image: sidecar-image
volumeMounts:
- mountPath: /data
name: shared-storage
volumes:
- name: shared-storage
emptyDir: {}
命令:
kubectl apply -f multi-container-pod-with-volume.yaml
此配置会创建一个Pod,其中包含两个容器,它们共享一个名为shared-storage
的存储卷。emptyDir
类型的卷会在Pod运行时提供临时存储。
十二、离线主机并升级控制面板和节点
题目
你需要将一个节点从Kubernetes集群中移除并进行维护。移除节点时,你需要确保节点上的Pod被驱逐并调度到其他节点。请写出步骤和命令。
解析
为了将节点移除并进行维护,我们可以使用kubectl cordon
将节点标记为不可调度,使用kubectl drain
驱逐节点上的Pod,最后进行必要的升级或维护。
kubectl cordon <node-name> # 标记节点不可调度
kubectl drain <node-name> --ignore-daemonsets --delete-local-data # 驱逐Pod并清理
驱逐完Pod后,可以进行节点维护或升级。维护完成后,使用kubectl uncordon
恢复节点的调度能力:
kubectl uncordon <node-name>
十三、etcd的备份和还原命令
题目
你需要备份Kubernetes集群的etcd数据,并且想要在必要时恢复它。请给出备份和还原的命令。
解析
etcdctl
是管理etcd的工具,可以用于备份和恢复etcd数据。
备份命令:
ETCDCTL_API=3 etcdctl snapshot save /path/to/backup.db --endpoints=https://127.0.0.1:2379 --cert-file=/etc/etcd/ssl/etcd-cert.pem --key-file=/etc/etcd/ssl/etcd-key.pem --ca-file=/etc/etcd/ssl/etcd-ca.pem
恢复命令:
ETCDCTL_API=3 etcdctl snapshot restore /path/to/backup.db --data-dir=/var/lib/etcd --name <etcd-node-name> --initial-cluster <etcd-cluster-info>
注意:恢复时需要提供正确的集群信息和数据目录。
十四、节点异常排查
题目
你的Kubernetes集群中有一个节点无法正常工作。你需要排查节点上的问题。请列出排查步骤。
解析
排查节点异常时,首先需要检查节点的状态、kubelet日志和节点的系统日志。
- 使用
kubectl get nodes
查看节点状态。 - 使用
kubectl describe node <node-name>
查看节点的详细信息,包括事件、污点、资源使用等。 - 检查节点上的
kubelet
服务是否正常运行。可以使用命令:systemctl status kubelet
- 查看
kubelet
的日志:journalctl -u kubelet -f
通过这些步骤,可以定位节点故障的根本原因,并采取相应的修复措施。
十五、节点维护
题目
你需要将一个节点进行维护,确保该节点上的Pod在维护期间不会被调度。请列出你会采取的操作。
解析
在节点维护期间,首先将节点设置为不可调度状态,然后驱逐该节点上的Pod。可以使用以下命令:
- 标记节点为不可调度:
kubectl cordon <node-name>
- 驱逐节点上的Pod:
kubectl drain <node-name> --ignore-daemonsets --delete-local-data
- 维护或修复节点后,恢复节点的调度能力:
kubectl uncordon <node-name>
这些操作可以确保在维护期间不会有新的Pod调度到该节点,并且已调度的Pod会被迁移到其他节点。
十六、创建Service
题目
你需要为一个Pod创建一个Service,以便其他Pod可以访问该Pod。请编写Service的yaml文件。
解析
Kubernetes中的Service用于定义Pod之间的网络访问规则。以下是创建一个Service的yaml文件,它暴露了Pod的80端口。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
命令:
kubectl apply -f service.yaml
这个Service会将请求转发到标记为app=my-app
的Pod的8080端口。
十七、理解Kubernetes核心概念
题目
简要解释Kubernetes中的Pod、Deployment、Service和Ingress的作用,并举例说明它们如何协作。
解析
理解Kubernetes的核心概念是成功通过CKA考试的基础。以下是对四个核心概念的简要解释及其协作示例:
-
Pod:是Kubernetes中的最小部署单元,可以包含一个或多个容器。Pod内的容器共享相同的网络和存储资源。Pod通常作为一个单元进行调度。
-
Deployment:Deployment是Kubernetes中的控制器,用于管理Pod的副本。它负责确保指定数量的Pod副本始终运行,并支持滚动更新和回滚。
-
Service:Service是Kubernetes中一个抽象层,用于定义如何访问Pod。它为Pod提供一个稳定的DNS名称和IP地址,允许集群内外的流量访问Pod。Service通常用于暴露一个或多个Pod的网络访问。
-
Ingress:Ingress是Kubernetes中用于管理外部流量的资源。它根据请求的路径或主机名将流量路由到不同的Service,通常用于实现HTTP/HTTPS路由和负载均衡。
协作示例:
假设你有一个Web应用程序,需要将用户的请求通过HTTP路由到Pod上的服务:
- Pod:你创建一个Pod,其中运行着Web应用程序的容器。
- Deployment:你使用Deployment管理这个Pod,确保它有多个副本以提供高可用性。
- Service:你为Web应用程序创建一个Service,确保外部流量能够访问这个Pod。
- Ingress:你创建一个Ingress资源,配置它将来自外部请求(如
example.com
)的流量路由到Service上,进而转发到Pod。
通过这种方式,Pod、Deployment、Service和Ingress协作确保了应用程序的可扩展性、可访问性和高可用性。
通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强
Best
Wenhao (楠博万)