cka解题思路1.32-3
8、pvc
[candidate@base] $ ssh cka000047
Task
mariadb namespace 中的 MariaDB Deployment 被误删除。请恢复该 Deployment 并确保数据持久性。请按照以下步骤:
如下规格在 mariadb namespace 中创建名为 mariadb 的 PersistentVolumeClaim (PVC):
访问模式为 ReadWriteOnce
存储为 250Mi
集群中现有一个 PersistentVolume。
您必须使用现有的 PersistentVolume (PV)。
编辑位于 ~/mariadb-deployment.yaml 的 MariaDB Deployment 文件,以使用上一步中创建的 PVC。
将更新的 Deployment 文件应用到集群。
确保 MariaDB Deployment 正在运行且稳定。
题目要求:
1、创建pvc mariadb namespace mariadb 访问模式 readwriteonce 存储250M
2、创建的pvc 使用现有的pv
3、修改目录下的deployment文件,使用创建的pvc mariadb,
● 确保挂载方式正确(volumeMounts + volumes)。
4、更新deployment文件到集群
解题过程:
1、创建已有pv对应pvc,让pvc绑定pv
# 查看已有的pv
kubectl get pv -A
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-8ma68a57-t089-31f6-bab7-5656f638a98a 250Mi RWO Retain Available local-path <unset> 191d
#创建对应pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mariadbnamespace: mariadb
spec:accessModes:- ReadWriteOnceresources:requests:storage: 250MstorageClassName: local-path #如果pv指定了storage,这里也要指定#再次查看pv是否已被pvc绑定candidate@master01:~$ kubectl apply -f pvc.yaml
persistentvolumeclaim/mariadb created
candidate@master01:~$ kubectl get pv -A
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-8ma68a57-t089-31f6-bab7-5656f638a98a 250Mi RWO Retain Bound mariadb/mariadb local-path <unset> 191d
2、修改目录下的deployment文件,保证正确挂在volume
apiVersion: apps/v1
kind: Deployment
metadata:name: mariadbnamespace: mariadblabels:app: mariadb
spec:replicas: 1selector:matchLabels:app: mariadbtemplate:metadata:labels:app: mariadbspec:containers:- name: busyboximage: busybox:1.36.1imagePullPolicy: IfNotPresentcommand: ["/bin/sh"]args: ["-c", "while true; do echo autoscale; sleep 300;done"]volumeMounts:- name: mariadb-datamountPath: /var/logvolumes:- name: mariadb-datapersistentVolumeClaim:claimName: "mariadb" #指定pvc
kubectl apply -f deployment.yaml
#检查是否正常运行
kubectl get deployments.apps -n mariadb
NAME READY UP-TO-DATE AVAILABLE AGE
mariadb 1/1 1 1 12s
3、pvc模板地址concept-》storage-》pv 下拉末尾pvc
9、gateway
您必须连接到正确的主机。不这样做可能导致零分。
[candidate@base] $ ssh cka000057
Task
将现有 Web 应用程序从 Ingress 迁移到 Gateway API。您必须维护 HTTPS 访问权限。
注意:集群中安装了一个名为 nginx 的 GatewayClass 。
首先,创建一个名为 web-gateway 的 Gateway ,主机名为 gateway.web.k8s.local ,并保持现有名为 web 的 Ingress 资源的现有 TLS 和侦听器配置。
接下来,创建一个名为 web-route 的 HTTPRoute ,主机名为 gateway.web.k8s.local ,并保持现有名为 web 的 Ingress 资源的现有路由规则。
您可以使用以下命令测试 Gateway API 配置:
[candidate@cka000057]$ curl -Lk https://gateway.web.k8s.local:31443
最后,删除名为 web 的现有 Ingress 资源。
题目要求:
1、查看现有ingress资源 web tls和侦听配置 和ingress 路由规则
2、创建gateway,要求指定主机名:gateway.web.k8s.local ,gateway名字: web-gateway
tls和侦听配置与ingress web一直
3、创建httproute 名字web-route 主机名: gateway.web.k8s.local ,并绑定到web-gateway
4、测试是否生效,删除ingress
Gateway API 是 Kubernetes 官方推出的下一代服务网络 API,目标是取代 Ingress,提供更强大、统一、可扩展的流量管理能力。
它由三个核心资源组成:
解题过程:
1、查看现有ingress资源和web ingress
kubectl get gatewayclasses.gateway.networking.k8s.io -A
NAME CONTROLLER ACCEPTED AGE
nginx gateway.nginx.org/nginx-gateway-controller True 192d
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target: /nginx.ingress.kubernetes.io/ssl-redirect: "true"creationTimestamp: "2025-03-02T06:10:13Z"generation: 1name: webnamespace: defaultresourceVersion: "19116"uid: 09b1388f-12b1-4a89-8251-bf15f97a1b19
spec:ingressClassName: nginxrules:- host: ingress.web.k8s.localhttp:paths:- backend:service:name: webport:number: 80path: /pathType: Prefixtls:- hosts:- ingress.web.k8s.localsecretName: web-cert
status:loadBalancer:ingress:- ip: 10.99.167.108
2、创建gateway和httproute
gateway参考官网地址:https://kubernetes.io/blog/2024/05/09/gateway-api-v1-1/直接文档页搜索gateway-api
ps:考试的时候博客页如果没有还是得学习一下gateway用法
httproute参考网页地址https://kubernetes.io/docs/concepts/services-networking/gateway/ 文档页concepts-》service,loadbanlaceand networking-》gateway api
# 创建gateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:name: web-gateway #指定的gateway名字
spec:gatewayClassName: nginx #题目中说明的gatewyaclass名字listeners:- name: foo-httpsprotocol: HTTPSport: 443hostname: gateway.web.k8s.local #指定的主机名tls:certificateRefs:- kind: Secretgroup: ""name: web-cert #ingress里指定的secretname
#创建httproute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:name: web-route #指定的httproute名字
spec:parentRefs:- name: web-gateway #上面创建的gateway名字hostnames:- "gateway.web.k8s.local"rules:- matches:- path:type: PathPrefixvalue: /backendRefs:- name: web #ingress指定的serviceport: 80 #ingress指定的port
3、验证创建得gateway和httproute是否生效
kubectl get gateway -A
NAMESPACE NAME CLASS ADDRESS PROGRAMMED AGE
default web-gateway nginx True 51s
candidate@master01:~$ kubectl get httproutes.gateway.networking.k8s.io -A
NAMESPACE NAME HOSTNAMES AGE
default web-route ["gateway.web.k8s.local"] 29s
candidate@master01:~$ curl -Lk https://gateway.web.k8s.local:31443
Hello World ^_^
kubectl delete ingress web
10、NetworkPolicy
您必须连接到正确的主机。不这样做可能导致零分。
[candidate@base] $ ssh cka000056
Task
从提供的 YAML 样本中查看并应用适当的 NetworkPolicy。
确保选择的 NetworkPolicy 不过于宽松,同时允许运行在 frontend 和 backend namespaces 中的 frontend 和 backend Deployment 之间的通信。
首先,分析 frontend 和 backend Deployment,以确定需要应用的 NetworkPolicy 的具体要求。
接下来,检查位于 ~/netpol 文件夹中的 NetworkPolicy YAML 示例。
注意:请勿删除或修改提供的示例。仅应用其中一个。否则可能会导致分数降低。
最后,应用启用 frontend 和 backend Deployment 之间的通信的 NetworkPolicy,但不要过于宽容。
注意:请勿删除或修改现有的默认拒绝所有入站流量或出口流量 NetworkPolicy。否则可能导致零分。
题目要求:
1、网络策略选型,要求能允许frontend和backend namespace之间相互访问
解题过程:
1、切入到正确主机查看frontend和backend deployment状态和标签
kubectl get deployments.apps -n backend --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
backend 1/1 1 1 193d app=backend
candidate@master01:~/netpol$ kubectl get deployments.apps -n frontend --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
frontend 1/1 1 1 193d app=frontend
candidate@master01:~/netpol$ kubectl get pod -n backend --show-labels
NAME READY STATUS RESTARTS AGE LABELS
backend-5d999bc4dd-772hp 1/1 Running 12 (31m ago) 193d app=backend,pod-template-hash=5d999bc4dd
kubectl get pod -n frontend --show-labels
NAME READY STATUS RESTARTS AGE LABELS
frontend-5c4847b588-lxc97 1/1 Running 12 (32m ago) 193d app=frontend,pod-template-hash=5c4847b588
#networkpolicy作用与deployment和pod需要两个app=backend和app=frontend标签
kubectl get ns frontend backend --show-labels
NAME STATUS AGE LABELS
frontend Active 193d kubernetes.io/metadata.name=frontend
backend Active 193d kubernetes.io/metadata.name=backend
#即netwoorkpolicy作用与namespace需要两个namespace标签
kubectl get networkpolicies -A
NAMESPACE NAME POD-SELECTOR AGE
backend default-deny-all <none> 193d
calico-apiserver allow-apiserver apiserver=true 193d
#查看集群内得网络规则,backend默认全拒绝,frontend没有则默认全放通
2、切入到正确主机,查看指定目录下的networkpolicy yaml示例
cat netpol1.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: netpol-1namespace: backend
spec:podSelector: {} #backend下请求都允许policyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: frontend 允许带frontend访问#总结:允许 frontend namespace下的所有pod访问backend
cat netpol2.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: netpol-2namespace: backend
spec:podSelector:matchLabels:app: backend #允许带app:backend 标签访问backend namespace,由上文可知即限制为deployment和podpolicyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: frontend #指定frontend namespace访问backendpodSelector:matchLabels:app: frontend #允许带app: frontend标签访问即允许deployment和pod 访问backend
#总结:允许backend namespace下的deployment和pod带app: backend访问backend
#允许frontend namespace下的deployment和pod带app: frontend 访问backendcat netpol3.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: netpol-3namespace: backend
spec:podSelector:matchLabels:app: database # 允许带app: database访问backend - Ingressingress:- from:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: frontendpodSelector:matchLabels:app: frontend- ipBlock:cidr: 10.0.0.0/24
#由上可知backend和frontend下的deployment和pod都没有这个标签,直接省略
#总结1和2都可满足两个namespace间相互访问,但2限制更多一些更符合题意
3、应用符合规则的networkpolicy,并检查是否创建成功
kubectl apply -f netpol2.yaml
networkpolicy.networking.k8s.io/netpol-2 created
candidate@master01:~/netpol$ kubectl get networkpolicies -A
NAMESPACE NAME POD-SELECTOR AGE
backend default-deny-all <none> 193d
backend netpol-2 app=backend 10s
calico-apiserver allow-apiserver apiserver=true 193d
#frontend没有networkpolicy,默认是允许所有pod访问的,到这里已完成题目