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:~$









