1、权限控制 RBAC
1.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Context
为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定 ServiceAccount。
Task
创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:
Deployment
StatefulSet
DaemonSet
在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。
限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。
1.2 参考链接
无
1.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
创建 ClusterRole(集群角色):
candidate@node01:~$ kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created
candidate@node01:~$
创建 ServiceAccount(服务账号):
candidate@node01:~$ kubectl -n app-team1 create serviceaccount cicd-token
serviceaccount/cicd-token created
candidate@node01:~$
创建 RoleBinding(角色绑定):
candidate@node01:~$ kubectl -n app-team1 create rolebinding cicd-token-rolebinding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
rolebinding.rbac.authorization.k8s.io/cicd-token-rolebinding created
candidate@node01:~$
# rolebinding 后面的名字 cicd-token-rolebinding 随便起的,因为题目中没有要求,如果题目中有要求,根据题目要求写。
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl describe rolebinding cicd-token-rolebinding -n app-team1
Name: cicd-token-rolebinding
Labels: <none>
Annotations: <none>
Role:
Kind: ClusterRole
Name: deployment-clusterrole
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount cicd-token app-team1
candidate@node01:~$
2、扩容 deployment 副本数量
2.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
将 deployment presentation 扩展至 4 个 pods
2.2 参考链接
无
2.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
检查现有 deployment 的 pod 数量:
candidate@node01:~$ kubectl get deployment presentation
NAME READY UP-TO-DATE AVAILABLE AGE
presentation 1/1 1 1 167d
candidate@node01:~$
将 deployment presentation 扩展至 4 个 pods:
candidate@node01:~$ kubectl scale deployment presentation --replicas=4
deployment.apps/presentation scaled
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get deployment presentation
NAME READY UP-TO-DATE AVAILABLE AGE
presentation 4/4 4 4 167d
candidate@node01:~$
3、配置网络策略 NetworkPolicy
3.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。
进一步确保新的 NetworkPolicy:
不允许对没有在监听 端口 9000 的 Pods 的访问
不允许非来自 namespace echo 中的 Pods 的访问
3.2 参考链接
https://kubernetes.io/docs/concepts/services-networking/network-policies/
3.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
查看所有 ns 的标签 label:
candidate@node01:~$ kubectl get ns echo --show-labels
NAME STATUS AGE LABELS
candidate@node01:~$
打标签 echo :
candidate@node01:~$ kubectl label ns echo project=echo
namespace/echo labeled
candidate@node01:~$
# 再次进行查看标签
candidate@node01:~$ kubectl get ns echo --show-labels
NAME STATUS AGE LABELS
echo Active 167d kubernetes.io/metadata.name=echo,project=echo
candidate@node01:~$
手动编写一个 yaml 文件(名字任意):
candidate@node01:~$ touch networkpolicy.yaml
查看参考链接并复制内容:
将文档内容进行修改:
candidate@node01:~$ cat networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace # 根据题目要求填写
namespace: my-app # 根据题目要求填写
spec:
podSelector: {} # 应用在 my-app 命名空间中的所有 Pod
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: echo # 访问者的命名空间的标签 label(echo 访问 my-app)
ports:
- protocol: TCP
port: 9000 # 被访问者公开的端口
candidate@node01:~$
创建:
candidate@node01:~$ kubectl apply -f networkpolicy.yaml
networkpolicy.networking.k8s.io/allow-port-from-namespace created
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl describe networkpolicy -n my-app
Name: allow-port-from-namespace
Namespace: my-app
Created on: 2024-08-01 16:16:07 +0800 CST
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in this namespace)
Allowing ingress traffic:
To Port: 9000/TCP
From:
NamespaceSelector: project=echo
Not affecting egress traffic
Policy Types: Ingress
candidate@node01:~$
4、暴露服务 service
4.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。
创建一个名为 front-end-svc 的新 service,以公开容器端口 http。
配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。
4.2 参考链接
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
4.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
检查 deployment 信息,并记录 SELECTOR 的 Lable 标签,这里是 app=front-end:
candidate@node01:~$ kubectl get deployment front-end -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
front-end 1/1 1 1 167d nginx vicuu/nginx:hello app=front-end
candidate@node01:~$
添加端口信息:(官方文档只给出两行需要自己在手动添加两行)
candidate@node01:~$ kubectl edit deployment front-end
# 官方给出
ports:
- containerPort: 80
# 修改为
ports:
- name: http
containerPort: 80
protocol: TCP
暴露对应端口:
candidate@node01:~$ kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
service/front-end-svc exposed
candidate@node01:~$
curl 检查(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
front-end-svc NodePort 10.109.15.45 <none> 80:30757/TCP 36s app=front-end
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 167d <none>
candidate@node01:~$
candidate@node01:~$ curl 10.109.15.45
Hello World ^_^
candidate@node01:~$
5、创建 Ingress
5.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
如下创建一个新的 nginx Ingress 资源:
名称: ping
Namespace: ing-internal
使用服务端口 5678 在路径 /hello 上公开服务 hello
可以使用以下命令检查服务 hello 的可用性,该命令应返回 hello
curl -kL <INTERNAL_IP>/hello
5.2 参考链接
https://kubernetes.io/docs/concepts/services-networking/ingress/
5.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
检查环境里 ingressclass 的名字:
candidate@node01:~$ kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 167d
candidate@node01:~$
# 看到 ingressclass 的名字叫 nginx,下面创建 ingress 需要使用。
创建编写 ingress 的 yaml:
candidate@node01:~$ touch ingress.yaml
candidate@node01:~$ cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ping # 根据题目要求填写
namespace: ing-internal # 根据题目要求填写
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # 上面查出来的 ingressclass 的名字
rules:
- http:
paths:
- path: /hello # 根据题目要求填写
pathType: Prefix
backend:
service:
name: hello # 根据题目要求填写
port:
number: 5678 # 根据题目要求填写
candidate@node01:~$
创建:
candidate@node01:~$ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/ping created
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get ingress -n ing-internal
NAME CLASS HOSTS ADDRESS PORTS AGE
ping nginx * 10.110.140.170 80 69s
candidate@node01:~$
candidate@node01:~$ curl 10.110.140.170/hello
Hello World ^_^
candidate@node01:~$
6、查看 pod 的 CPU
6.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
通过 pod label name=cpu-loader,找到运行时占用大量 CPU 的 pod,
并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。
6.2 参考链接
无
6.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
查看 pod 名称:
candidate@node01:~$ kubectl top pod -l name=cpu-loader --sort-by=cpu -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
cpu-top redis-test-799bc675cd-zr7jv 2m 5Mi
cpu-top nginx-host-846bf49987-mf4mr 0m 4Mi
cpu-top test0-6c665fdc6c-kbm76 0m 5Mi
candidate@node01:~$
# -A 是所有 namespace 的意思
将 cpu 占用最多的 pod 的 name 写入/opt/test1.txt 文件:
candidate@node01:~$ echo "redis-test-799bc675cd-zr7jv" > /opt/KUTR000401/KUTR00401.txt
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ cat /opt/KUTR000401/KUTR00401.txt
redis-test-799bc675cd-zr7jv
candidate@node01:~$
7、调度 pod 到指定节点
7.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
按如下要求调度一个 pod:
名称:nginx-kusc00401
Image:nginx
Node selector:disk=ssd
7.2 参考链接
https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/
7.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
先检查一下是否有这个 pod,因为没有创建,所以需要创建:
candidate@node01:~$ kubectl get pod -A | grep nginx-kusc00401
candidate@node01:~$
检查一下 node 的标签:
candidate@node01:~$ kubectl get nodes --show-labels | grep "disk=ssd"
node01 Ready <none> 167d v1.29.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
candidate@node01:~$
创建并参考官方文档编写yaml:
candidate@node01:~$ touch pod-disk-ssd.yaml
修改文件内容:
candidate@node01:~$ cat pod-disk-ssd.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disk: ssd
candidate@node01:~$
创建:
candidate@node01:~$ kubectl apply -f pod-disk-ssd.yaml
pod/nginx-kusc00401 created
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get pod nginx-kusc00401 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-kusc00401 1/1 Running 0 30s 10.244.196.176 node01 <none> <none>
candidate@node01:~$
8、查看可用节点数量
8.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
检查有多少 nodes 已准备就绪(不包括被打上 Taint:NoSchedule 的节点),
并将数量写入 /opt/KUSC00402/kusc00402.txt
8.2 参考链接
无
8.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
检查几个打了 NoSchedule:
candidate@node01:~$ kubectl describe nodes | grep -i Taints
Taints: node-role.kubernetes.io/control-plane:NoSchedule
Taints: <none>
Taints: <none>
candidate@node01:~$
写入文件:
candidate@node01:~$ echo "2" > /opt/KUSC00402/kusc00402.txt
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ cat /opt/KUSC00402/kusc00402.txt
2
candidate@node01:~$
9、创建多容器的 pod
9.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
按如下要求调度一个 Pod:
名称:kucc8
app containers: 2
container 名称/images:
nginx
memcached
9.2 参考链接
https://kubernetes.io/docs/concepts/workloads/pods/
9.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
创建 yaml 文件:
candidate@node01:~$ touch pod-kucc8.yaml
根据官方文档进行修改:
candidate@node01:~$ cat pod-kucc8.yaml
apiVersion: v1
kind: Pod
metadata:
name: kucc8
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- name: memcached
image: memcached
imagePullPolicy: IfNotPresent
candidate@node01:~$
创建:
candidate@node01:~$ kubectl apply -f pod-kucc8.yaml
pod/kucc8 created
candidate@node01:~$
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get pod kucc8
NAME READY STATUS RESTARTS AGE
kucc8 2/2 Running 0 8s
candidate@node01:~$
10、创建 PV
10.1 题目详情
设置配置环境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
创建名为 app-config 的 persistent volume,容量为 1Gi,访问模式为 ReadWriteMany。
volume 类型为 hostPath,位于 /srv/app-config
10.2 参考链接
https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
10.3 解题流程
切换集群:
candidate@node01:~$ kubectl config use-context k8s
创建 yaml 文件:
candidate@node01:~$ touch pv.yaml
根据官方文档进行编辑修改:
candidate@node01:~$ cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
candidate@node01:~$
创建:
candidate@node01:~$ kubectl apply -f pv.yaml
验证查看(考试时,所有的检查项,都可以不做):
candidate@node01:~$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
app-config 1Gi RWX Retain Available <unset> 2m21s
pv01 10Mi RWO Recycle Available csi-hostpath-sc <unset> 166d
candidate@node01:~$