02集群强化
考试大纲
集群强化:15%
- 限制访问 Kubernetes API
- 使用基于角色的访问控制来最小化暴露
- 谨慎使用服务帐户,例如禁用默认设置,减少新创建帐户的权限
- 经常更新 Kubernetes
RBAC - Rolebinding
题目描述:
- 一个名为
web-pod
的现有 Pod 已在 namespacedb
中运行 - 编辑绑定到 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
通过查找 rolebind
的 serviceaccount,获取 role 名称
修改 role 对应的权限
在 namespace db
中创建 role-2,并配置对namespaces
类型进行 update 操作
创建新的rolebind role-2-binding
,将 role-2
绑定到 Pod ServiceAccount
kubectl create rolebinding role-2-binding \
--role=role-2 \
--serviceaccount=db:service-account-web \
-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
查看生成的 backend-sa.yaml
设置不自动挂载 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
删除没有使用的 ServiceAccount
查看所有的 sa
查看已经被使用的 sa
> kubectl get pod -n qa -o yaml | grep -i serviceaccountname
serviceAccountName: backend-sa
serviceAccountName: default
删除不用的 sa