CKA 模拟考 B
##这是第二套
这是B回次,与A回次没有重叠的课题。**域分配是
虽然和A一样匹配,但询问的能力完全不同。A将Namespace范围Role
如果问的话,这里会询问集群范围ClusterRole和服务账户令牌,A是
如果问了色彩和容忍度,这里会问每个领域的分布和优先顺序。
重新解决已经解过的问题是不可以练习的,所以在完成A之后
请用这套材料再次重新思考一下时间。
实际的CKA是在120分钟内完成15~20个课题,超过66%就可以通过。这个套餐也
作业17个·120分钟·合格线是66%,所以需要全部正确。因为是部分分数制,所以需要全部正确。
没有。通过17个中的12个视为完成处理。
**不要看提示,先试着解到最后。**实际考试没有提示。
遇到困难的作业可以跳过,如果还有时间的话,回来的话对分数更有优势。
提示和正确答案请在考试结束后用作复习。
在实际考试现场第一次知道的话会浪费时间的东西
- 考试是远程桌面,每道作业都通过指定的主机
ssh进行工作。
**不支持叠加ssh。**工作结束后,请务必用exit回到原来的位置。
k别名和bash自动完成**已经设置好了。**一开始就从alias开始
现在建议制作不符合环境。这个练习板也一样调整了。
-
yq·helm·etcdctl·openssl·curl·man也已经安装好了。 -
终端复制是
Ctrl+Shift+C,粘贴是Ctrl+Shift+V。 -
Ctrl+W关闭浏览器标签页。 删除单词时请使用Ctrl+Alt+W。 -
INSERT键被堵住,vim必须以
i进入输入模式。 -
每个题目的分值不同,允许多种途径到达正确答案。
域名分配
| 域名 | 实际分数 | 这套任务 |
|---|---:|---:|
| Cluster Architecture, Installation and Configuration | 25% | 1~4次 |
| Workloads and Scheduling | 15% | 5~7次 |
| Services and Networking | 20% | 8~10次 |
| Storage | 10% | 11~12号 |
| Troubleshooting | 30% | 13~17号 |
从13号到17号
在实际考试中,故障资源是事先准备好的。在这个环境中没有那个设备,所以
在各课题的指示书中放入了问题宣言。首先照样应用后
请诊断并纠正症状。即使不适用,从头正确制作也通过评分,
那样就不能进行诊断练习。从13号到16号是命名空间broken,
17号需要提前创建命名空间audit才能放入manifest。
##制作文件的课题
第3步在/root/exam下面留下文件。因为目录不是预先创建的,所以
请先制作。评分器不要直接相信文件上写着的值,而是从聚类和快照中
重新计算价格进行比较。
##在这个环境中的其他点
Pad内的群集是kwokctl发布的1人用群集。因为控制平面是真实的
Manifest、RBAC、排程、季度、CRD、PV绑定、排水全部实际运行。
但是工作负载容器不会运行,所以kubectl exec·logs·port-forward是
不能用。作业也不要求那个。因为网络也被封锁了,所以要重新上传图片。
不能接收或从排行榜存储库下载。
开始前,请用kubectl get nodes确认3个节点是否已准备就绪。如果还没有准备就绪的话
正在显示聚类中(大约需要2分钟)。
##评分
按下各课题的确认按钮,评分器将在活着的群集中重新计算值
进行对比。不是看文件上写了什么,而是看群集处于什么状态。
通往正确答案的道路允许多种途径。
仅用于读取集群范围的账户
创建名称空间infra,并创建服务帐户auditor。使用该服务帐户的派对上不应该自动挂载令牌。
ClusterRole infra-reader允许core组中的nodes和persistentvolumes、storage.k8s.io组的storageclasses进行get、list、watch。不得有其他权限。请用ClusterRoleBinding infra-reader绑定到该服务帐户。
将令牌自动安装设置为服务帐户的automountServiceAccountToken。权限范围扩大的错误只有确认允许的才不会被发现,所以请一起询问不能用kubectl auth can-i ... --as=system:serviceaccount:infra:auditor的动词。群集范围资源不附加命名空间而询问。
用户认证书请求和批准
新团队成员dev想获得粘附到群集的客户端证书。请创建CN为dev的证书请求,提交为CertificateSigningRequest dev。signerName为kubernetes.io/kube-apiserver-client,用途必须包含client auth,提交后完成批准。
然后在命名空间dev-team中创建Role dev和RoleBinding dev,以便该用户可以get·list·watch板。没有其他权限。
请求用openssl创建,spec.request中用base64换成PEM的一行(base64 -w0)。批准是kubectl certificate approve。绑定的主体类型不是ServiceAccount而是User。
etcd快照和修订号
创建名称空间ops,在其中放置配置图pre-snapshot,然后放入数据stage=before。
然后将该聚类etcd的快照保存为/root/exam/etcd-snapshot.db,只将快照中包含的修订(revision)编号用数字写在一行,写在/root/exam/etcd-revision.txt上。
这个群集的etcd在127.0.0.1:2379上无认证地接收。出现快照需要活着的服务器(etcdctl snapshot save),读取弹出的文件的元数据只需要文件就可以(etcdutl snapshot status)。修订号在元数据中,不要用手眼抄写,请摘下来使用。
用Helm图表安装发布
请在命名空间platform上安装Helm版本web。
重新创建图表并放在/root/exam/charts/web上。安装结果中出现的部署必须在3个副本上连着nginx:1.27的图像,并附上标签app.kubernetes.io/instance: web。
helm create 创建的基本图表是图像存储库为nginx,标签为空,所以写入图表的appVersion。复制件和标签可以修改values文件,安装时也可以用--set覆盖。因为没有网络,所以无法从图表存储库接收。
通过CPU使用率增加的工作负载
请在名称空间shop中创建Deploymentcart。图像是nginx:1.27,复制件是2个,容器requests.cpu是200m。
针对那个部署,请制作HorizontalPodAutoscaler cart。至少2个·最多10个,目标CPU平均使用率70%,减少时稳定化时间设置为300秒。
使用率(Utilization)目标需要在页面上有requests.cpu才能计算。如果没有请求量,HPA将永远保持unknown。稳定化时间在behavior.scaleDown下,这是只有在autoscaling/v2中才有的字段。
按领域均匀传播
请在名称空间shop中创建Deploymentfeed。图像是nginx:1.27,副本是6个,板标签是app=feed。
Pad必须根据节点的topology.kubernetes.io/zone标签均匀分布。区域之间的数量差异不得超过1,如果不能满足条件,则不进行调度。
topologySpreadConstraints中写着四个。以什么为标准进行划分(topologyKey)、可以有多大的偏差(maxSkew)、无法满足时该怎么办(whenUnsatisfiable),以及将哪些边段连接在一起(labelSelector)。如果省略最后一个的话,连接的目标就会变。
优先顺序和抢先政策
请创建两个PriorityClass。
-
high-priority: 值为100000,可以推掉优先级较低的队列,说明(description)不能为空。 -
low-priority:值100,绝对不会推开比自己低的帕德。
两者都不能成为基本值类。然后在命名空间shop中创建Deploymentstream,将nginx:1.27复制成2个副本,但请使用high-priority。
将“可以推开”和“绝对不会推开”转换为preemptionPolicy。默认值是否为类是globalDefault,打开这个的话,类甚至会受到不少子板的优先级。已经弹出的子板的优先级即使以后更改也不会反映。
NodePort服务和会话固定
请在名称空间edge中创建Deploymentportal。图像是nginx:1.27,复制件3个,容器端口是8080。
Service portal 接收 NodePort 80 次,转发到 8080,将 NodePort 固定为 30080。同一客户端必须在同一端口上,维护时间为 3600 秒。来自节点外的流量仅应发送到该节点上的端口。
“同一个客户端在同一个父节点”是sessionAffinity,维持时间在sessionAffinityConfig下面单独。“仅在那个节点上的父节点”是externalTrafficPolicy。选择器错误时,对象会正常创建,只有端点需要亲自确认。
锁定 outgoing traffic
请为名称空间edge的所有页面创建以** outgoing**流量为基础的NetworkPolicy default-deny-egress。
接下来,请仅在portal-egress版块上允许两个在NetworkPolicy app=portal中。一个是向命名空间kube-system发送的53号(UDP和TCP都发送),另一个是向10.40.0.0/16发送的TCP 5432。但是,除10.40.9.0/24外,其他频段都禁止。
如果名称解释卡住了,剩下的允许也毫无用处。DNS必须打开UDP和TCP。地址范围用ipBlock写,然后用except在里面打洞。如果把to列表中的项目分开写,就是OR。
创建通过Gateway API进入的路径
请创建GatewayClass labhub。controllerName是labhub.io/gateway。
在命名空间edge中创建Gatewayedge-gw,用名为http的监听器接收80次HTTP,但只能附加相同命名空间的路由。然后将主机portal的portal.example.com发送到HTTPRoute/的Serviceportal(8次创建的服务)的80次。路径匹配为PathPrefix。
Gateway API不是Kubernetes的基本资源,而是作为CRD进入的单独标准。这个群集只有CRD,没有实现体,所以status不会填充。HTTPRoute会自己告知会附加到哪个Gateway的parentRefs,后端会在backendRefs上写上名称和端口。
绑定到节点的本地卷
请创建StorageClass local-node。provisioner是kubernetes.io/no-provisioner, reclaimPolicy是Retain。
PV pv-local-1 是 5Gi·ReadWriteOnce·local-node, 路径是 local, 不是 hostPath, 是 /mnt/local1 卷, 只能在节点 lab-node-2 上使用. 请将命名空间 data 的 PVC records 设置为 5Gi·ReadWriteOnce·local-node, 并将其绑定到该 PV 上.
然后在同一个命名空间中创建Deployment archiver,将nginx:1.27复制为1个副本,并将该PVC挂载到/records。**请勿在PAD规格中指定节点。**部署将确保卷的固定大小。
如果没有nodeAffinity,local卷根本不会创建。而且如果pad绑定到那个卷上,scheduler会将卷的节点约束直接应用到pad上。即使不使用nodeSelector,pad去那个节点的理由就是这个。
每个状态套装单独附带的音量
请在名称空间data中创建无头Servicedb。端口是5432,没有集群IP。
然后创建StatefulSet db。使用该服务,图像是nginx:1.27,副本有3个。每个分区必须单独附加1Gi·ReadWriteOnce卷,该卷请求框架的名字是data,存储类是db-static,挂载位置是/var/lib/db。
这个群集没有动态配置器,所以需要提前准备卷。三个驱动器都必须处于Running状态。
volumeClaimTemplates 创建的 PVC 名称是“体积请求模板名称-状态全集名称-编号”。如果该 PVC 无法绑定,则 PAD 从 0 号开始停止,然后下一个 PAD 根本不会创建。请提前为每个 PAD 创建相同类的 PV。
无法在任何节点上坐的工作负载
首先创建名称空间broken,然后将以下文件名应用原样。
apiVersion: apps/v1
kind: Deployment
metadata: {name: ingest, namespace: broken}
spec:
replicas: 2
selector: {matchLabels: {app: ingest}}
template:
metadata: {labels: {app: ingest}}
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- {key: disktype, operator: In, values: ["ssd"]}
containers:
- name: ingest
image: nginx:1.27
PAD无法从Pending中脱离。这个工作流要求在具有快速磁盘的节点上运行,所以请保持PAD规格不变,请修复集群方面,让2个PAD都运行。
为什么Scheduler拒绝了,用句子留在了Pad的PodScheduled条件中。required条件不是“如果有就好了”,而是“没有就不能坐”。节点有什么,用标签来表示。
无法获得容量的工作负载
请先照样应用以下宣言。
apiVersion: v1
kind: PersistentVolume
metadata: {name: pv-archive-old}
spec:
capacity: {storage: 5Gi}
accessModes: ["ReadWriteOnce"]
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath: {path: /mnt/archive-old}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: {name: archive, namespace: broken}
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: slow
resources: {requests: {storage: 8Gi}}
---
apiVersion: apps/v1
kind: Deployment
metadata: {name: vault, namespace: broken}
spec:
replicas: 1
selector: {matchLabels: {app: vault}}
template:
metadata: {labels: {app: vault}}
spec:
volumes:
- name: archive
persistentVolumeClaim: {claimName: archive}
containers:
- name: vault
image: nginx:1.27
volumeMounts:
- {name: archive, mountPath: /archive}
帕德无法从Pending中脱离。PVC archive的请求(8Gi·slow)是正确的请求,所以保持原样,让帕德成为Running。
如果PVC是Pending,则垫子也不能坐下。在静态卷中形成绑定,必须满足类名、访问模式、容量三个条件,而现有的卷中其中两个条件不一致。这个群集没有动态配置器。
没有一个派达都能完成的工作量
请先照样应用以下宣言。
apiVersion: apps/v1
kind: Deployment
metadata: {name: courier, namespace: broken}
spec:
replicas: 2
selector: {matchLabels: {app: courier}}
template:
metadata: {labels: {app: courier}}
spec:
serviceAccountName: courier
containers:
- name: courier
image: nginx:1.27
虽然创建了部署,但没有任何派达出现。这个工作流程必须恢复到专用身份,所以请保持参考不变,让2个派达运行。
如果完全没有创建帕德时,应该看不是帕德而是试图创建它的方。kubectl describe rs -n broken的状态条件中保留着拒绝允许的语句。服务账户在每个命名空间中都是单独存在的。
无法改变的选择器
请先照样应用以下宣言。
apiVersion: apps/v1
kind: Deployment
metadata: {name: payments, namespace: broken}
spec:
replicas: 3
selector: {matchLabels: {app: payment}}
template:
metadata: {labels: {app: payment}}
spec:
containers:
- name: payments
image: nginx:1.27
在这个团队的条款中,这个工作负载的标签应该是app=payments,但出现了单数形式。请将部署名称保持为payments,将选择器和pad标签改为app=payments。复制件有3个,旧标签的单pad不能留下。
如果试图修改并应用,apiserver会拒绝。请阅读拒绝语句中提到哪些字段。该字段在创建时被设定,以后无法更改,因此要保留名称并更改值,只有一个方法。
没有附加权限的绑定
首先创建名称空间audit,然后将以下文件名应用原样。
apiVersion: v1
kind: ServiceAccount
metadata: {name: reporter, namespace: audit}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: {name: reader, namespace: audit}
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: {name: reader, namespace: audit}
roleRef: {apiGroup: rbac.authorization.k8s.io, kind: Role, name: pod-reader}
subjects:
- {kind: User, name: reporter}
即使创建了Role,服务账户reporter也无法读取pad。请不要删除服务账户和Rolereader,而是让该服务账户在命名空间audit中可以get·list·watch pad。其他权限不应该存在任何地方。
有两个错误的地方。一个是绑定指定的角色名称,另一个是主体的种类。服务账户的名字是reporter,但认证名字和它不一样。而且roleRef在创建后不能更改。确认方法是kubectl auth can-i --as=system:serviceaccount:audit:reporter。