CKA1.24题库

权限控制RBAC

考题

Context

为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定 ServiceAccount。

Task

  1. 创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:
    Deployment
    StatefulSet
    DaemonSet

  2. 在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。

  3. 限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。

解答

参考官方文档

Task1:创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:Deployment、StatefulSet、ServiceAccount。

# 先查看帮助文档
root@node01:~# kubectl create clusterrole -h

# 执行创建
root@node01:~# kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created

Task2:在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。

# 查看帮助文档
root@node01:~# kubectl create serviceaccount -h

# 执行创建 serviceaccount,可以简写成 sa
root@node01:~# kubectl create serviceaccount cicd-token -n app-team1 
serviceaccount/cicd-token created

Task3:限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。

# 题目为“限于 namespace app-team1 中”,则创建 rolebinding,如果没说限于哪个具体的ns,则创建 clusterrolebinding

# 查看帮助文档
root@node01:~# kubectl create clusterrolebinding -h
root@node01:~# kubectl create rolebinding -h

# 执行创建:cicd-token-rolebinding为此rolebinding的名称,自己定义的,如题目定义则以题目为准,--serviceaccount 的格式必须为<namespace>:<name>
root@node01:~# kubectl create rolebinding cicd-token-rolebinding --clusterrole deployment-clusterrole --serviceaccount app-team1:cicd-token -n app-team1 
rolebinding.rbac.authorization.k8s.io/cicd-token-rolebinding created

# 检查下
root@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

查看POD的CPU

考题

Task

通过 pod label name=cpu-loader,找到运行时占用大量 CPU 的 pod,
并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。

解答

参考官方文档

# 查看帮助文档
root@node01:~# kubectl top pod -h

# 执行查看CPU指标,并排序
root@node01:~# kubectl top pod -l name=cpu-loader --sort-by=cpu -A

# 将查出来的<POD_NAME>写入文件
root@node01:~# echo "查出来的 Pod Name" > /opt/KUTR000401/KUTR00401.txt

# 检查下
root@node01:~# cat /opt/KUTR000401/KUTR00401.txt

配置网络策略 NetworkPolicy

考题

Task

  1. 在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
  2. 确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。
  3. 进一步确保新的 NetworkPolicy:
    • 不允许对没有在监听 端口 9000 的 Pods 的访问
    • 不允许非来自 namespace echo 中的 Pods 的访问

解答

参考官方文档

  1. 编写yaml文件:
root@node01:~# cat NetworkPolicy.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: my-app #被访问者的命名空间
spec:
  podSelector:  #这两行必须要写,或者也可以写成一行为 podSelector: {}
    matchLabels: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: echo #访问者的命名空间的标签 label
        #- podSelector: {} #注意,这个不写。如果 ingress 里也写了- podSelector: {},则会导致 my-app 中的 pod 可以访问 my-app 中 pod 的 9000 了,这样不满足题目要求不允许非来自 namespace echo 中的 Pods 的访问。
      ports:
        - protocol: TCP
          port: 9000    #被访问者公开的端口
  1. 执行建立NetworkPolicy:
root@node01:~# kubectl apply -f NetworkPolicy.yaml 
networkpolicy.networking.k8s.io/allow-port-from-namespace created
  1. 检查:
root@node01:~# kubectl get networkpolicies.networking.k8s.io  -n my-app
NAME                        POD-SELECTOR   AGE
allow-port-from-namespace   <none>         45s

root@node01:~# kubectl describe networkpolicies.networking.k8s.io allow-port-from-namespace -n my-app
Name:         allow-port-from-namespace
Namespace:    my-app
Created on:   2022-09-02 21:47:09 +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

暴露服务 service

考题

Task

  1. 请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。
  2. 创建一个名为 front-end-svc 的新 service,以公开容器端口 http。
  3. 配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。

解答

参考官方文档