Kubernetes 示例小册
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-role-binding-example subjects: - kind: User name: "[email protected]" apiGroup: rbac.authorization.k8s.io - kind: ServiceAccount name: default namespace: kube-system - kind: Group name: some-resource-manager apiGroup: rbac.authorization.k8s.io - kind: Group name: system:serviceaccounts:example-dev apiGroup: rbac.authorization.k8s.io - kind: Group name: system:serviceaccounts apiGroup: rbac.authorization.k8s.io - kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io - kind: Group name: system:unauthenticated apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-role-example apiGroup: rbac.authorization.k8s.io
示例 YAML 解释
subjects
指定绑定角色到一个用户上, 其中 name 是一串大小写敏感的字符串, 内容可以是字母, 数字和
@
.
等部分符号.- kind: User name: "[email protected]" apiGroup: rbac.authorization.k8s.io
最常用的是绑定角色到一个用户组, 例如:
- kind: Group name: some-resource-manager apiGroup: rbac.authorization.k8s.io
绑定角色到一个指定的 ServiceAccount 上, 比如绑定到
kube-system
namespace 下的 default
这个 ServiceAccount.- kind: ServiceAccount name: default namespace: kube-system
或者绑定到 example-dev 这个 namespace 下的所有服务账户:
- kind: Group name: system:serviceaccounts:example-dev apiGroup: rbac.authorization.k8s.io
甚至整个集群的 ServiceAccount:
- kind: Group name: system:serviceaccounts apiGroup: rbac.authorization.k8s.io
注意: system: 前缀是一个 Kubernetes 保留使用的名称, 修改任何 system: 前缀的用户或用户组都需要小心, 错误的权限配置可能导致集群工作不正常.
集群所有用户:
- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io - kind: Group name: system:unauthenticated apiGroup: rbac.authorization.k8s.io
ClusterRoleBinding 常见问题
- 如何创建一个只能访问特定资源的用户, 并允许使用 kubectl 接入?
创建私钥, 保存到 zuolan.key 中:
openssl genrsa -out zuolan.key 4096
创建证书签名请求(CSR):
openssl req -new -key zuolan.key -out zuolan.csr 回车键按下后, 会让你填写一些信息: ----- Country Name (2 letter code) []:CN State or Province Name (full name) []:Null Locality Name (eg, city) []:Null Organization Name (eg, company) []:dev Organizational Unit Name (eg, section) []:Null Common Name (eg, fully qualified host name) []:zuolan Email Address []:Null A challenge password []:
注意: Organization Name 和 Common Name 分别对应用户组和用户名, 这两项很重要, 其他可以随便填. 若无需认证密码, 最后输密码的时候直接回车结束, 最终生成 zuolan.csr 文件.
用 base64 编码一下 zuolan.csr 文件:
export BASE64_CSR=$(cat ./zuolan.csr | base64 | tr -d '\\n')
创建一个 zuolan.yaml 文件, 内容如下:
apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: zuolan-csr spec: groups: - system:authenticated request: ${BASE64_CSR} signerName: kubernetes.io/kube-apiserver-client usages: - client auth
最后应用到集群中:
cat zuolan.yaml | envsubst | kubectl apply -f -
批准这个请求:
kubectl certificate approve zuolan-csr
导出已经签发了的证书:
kubectl get csr zuolan-csr \ -o jsonpath='{.status.certificate}'| base64 -d > zuolan.crt
使用 openssl 查看签发的证书:
openssl x509 -in ./zuolan.crt -noout -text
从返回的内容上可以看到 zuolan 这个名称和 dev 这个组织, 另外这个证书是由 k3s 签发的 (Issuer), 因为我在用的集群是 k3d 部署的:
Certificate: Data: Version: 3 (0x2) Serial Number: 03:ca:c0:82:77:d6:de:73:01:76:e6:ae:7f:82:d2:57 Signature Algorithm: ecdsa-with-SHA256 Issuer: CN=k3s-client-ca@1651201516 Validity Not Before: May 6 09:47:00 2022 GMT Not After : May 6 09:47:00 2023 GMT Subject: C=CN, ST=Null, L=Null, O=dev, OU=Null, CN=zuolan
证书部分完成, 现在创建一个角色, 可以编写 YAML 然后
kubectl apply
:kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: example-dev-user rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "update", "list", "delete"]
也可以直接一行解决:
kubectl -n default create role example-dev-user \ --verb=create --verb=get --verb=list --verb=update --verb=delete \ --resource=pods
然后绑定 zuolan 这个用户到 example-dev-user 这个角色上, 创建 RoleBinding YAML 文件并 apply 它:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: example-dev-user-binding namespace: default subjects: - kind: User name: zuolan apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: example-dev-user apiGroup: rbac.authorization.k8s.io
或者一行命令行解决:
kubectl create rolebinding example-dev-user-binding \ --role=example-dev-user --user=zuolan
现在到了最后一步, 创建 config 文件, 以便使用 kubectl 操作集群.
首先, 生成 users 那部分:
kubectl config --kubeconfig=./zuolan.config \ set-credentials zuolan --embed-certs=true \ --client-key=zuolan.key \ --client-certificate=zuolan.crt
再生成 contexts 的部分:
kubectl config --kubeconfig=./zuolan.config \ set-context zuolan-example-context \ --cluster=zuolan-example-cluster \ --user=zuolan
最后还缺 clusters 的部分, 就直接从管理员的 config 文件中复制一下吧. 确保 clusters 里的集群名称和 contexts 里的 cluster 名称一致即可.