跳转至

02集群强化

考试大纲

集群强化:15%

  • 限制访问 Kubernetes API
  • 使用基于角色的访问控制来最小化暴露
  • 谨慎使用服务帐户,例如禁用默认设置,减少新创建帐户的权限
  • 经常更新 Kubernetes

RBAC - Rolebinding

题目描述:

  • 一个名为 web-pod 的现有 Pod 已在 namespace db中运行
  • 编辑绑定到 Pod 的 ServiceAccount service-account-web的现有 Role,仅允许只对 services类型的资源执行 get 操作
  • 在 namespace db中创建一个名为 role-2,并仅运行只对 namespaces类型的资源执行 delete操作的新 Role
  • 创建一个名为 role-2-binding 的新 RoleBinding,将新创建的 Role 绑定到 Pod 的 ServiceAccount
  • 注意:请勿删除现有的 RoleBindinbg

官方文档:

参考解答:

查找 web-pod 所绑定的 ServiceAccount

kubectl get pod -n db -o yaml | grep -i serviceaccountname

通过查找 rolebind 的 serviceaccount,获取 role 名称

kubectl get rolebindings.rbac.authorization.k8s.io -n db -o yaml | grep -i service-account-web -B 5

修改 role 对应的权限

> kubectl edit role -n db web-role

rules:
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get

在 namespace db中创建 role-2,并配置对namespaces类型进行 update 操作

kubectl create role role-2 \
--verb=delete \
--resource=namespaces \
-n db

创建新的rolebind role-2-binding,将 role-2 绑定到 Pod ServiceAccount

kubectl create rolebinding role-2-binding \
--role=role-2 \
--serviceaccount=db:service-account-web \
-n db

检查

kubectl describe rolebindings -n db

Pod 指定服务账号(ServiceAccount)

题目描述:

  • 清单文件 /cks/sa/pod1.yaml 中指定的 Pod 由于 ServiceAccount 指定错误而无法调度
  • 在现有 namespace qa 中创建一个名为 backend-sa 的新 ServiceAccount,确保此 ServiceAccount 不自动挂载 API 凭据。
  • 使用 /cks/sa/pod1.yaml 中的清单文件来创建一个 Pod
  • 最后,清理 namespace qa 中任何未使用的 ServiceAccount
# /cks/sa/pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: backend
  namespace: qa
spec:
  serviceAccountName: dadong
  containers:
  - image: nginx:1.9
    imagePullPolicy: IfNotPresent
    name: backend

官方文档:

服务账号(Service Account)为 Pod 中运行的进程提供身份标识, 并映射到 ServiceAccount 对象。当你向 API 服务器执行身份认证时, 你会将自己标识为某个用户(User)。Kubernetes 能够识别用户的概念, 但是 Kubernetes 自身并不提供 User API。

每个 Kubernetes 名字空间至少包含一个 ServiceAccount:也就是该名字空间的默认服务账号, 名为 default。如果你在创建 Pod 时没有指定 ServiceAccount,Kubernetes 会自动将该名字空间中 名为 default 的 ServiceAccount 分配给该 Pod。

参考解答:

配置 ServiceAccount

创建名为 backend-sa 的 ServiceAccount

kubectl create sa backend-sa -n qa --dry-run=client -o yaml > backend-sa.yaml

查看生成的 backend-sa.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: backend-sa
  namespace: qa

设置不自动挂载 API 凭据

apiVersion: v1
kind: ServiceAccount
metadata:
  name: backend-sa
  namespace: qa
automountServiceAccountToken: false

Pod 添加 ServiceAccount

修改 /cks/sa/pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: backend
  namespace: qa
spec:
  serviceAccountName: backend-sa
  containers:
  - image: nginx:1.9
    imagePullPolicy: IfNotPresent
    name: backend

创建Pod

kubectl create -f /cks/sa/pod1.yaml

删除没有使用的 ServiceAccount

查看所有的 sa

> kubectl get sa -n qa
NAME         SECRETS   AGE
backend-sa   0         85s
default      0         54d
test01       0         54d

查看已经被使用的 sa

> kubectl get pod -n qa -o yaml | grep -i serviceaccountname

serviceAccountName: backend-sa
serviceAccountName: default

删除不用的 sa

kubectl delete sa -n qa test01