K8S ServiceAccount RBAC的原理和操作究竟有多简单?

2026-05-27 12:432阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计678个文字,预计阅读时间需要3分钟。

K8S ServiceAccount RBAC的原理和操作究竟有多简单?

ServiceAccount是运行在Pod中的程序使用的身份认证,Pod容器需要访问API Server时使用的账户就是ServiceAccount。ServiceAccount仅限于它所在的namespace,每个namespace创建时都会自动创建。

ServiceAccount

ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户。

ServiceAccount仅局限它所在的namespace,每个namespace创建时都会自动创建一个default service account。

创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。

通过以下命令可以查看我们前面创建chesterns这个namespace下的serviceaccount与对应的secret

kubectl describe pod -n chesterns kubectl describe sa -n chesterns kubectl describe secrets -n chesterns

通过以下命令查看serviceaccount挂载进容器内部的文件

kubectl exec -it chesterdeployment-cb855fb4b-5ksgd -n chesterns -- ls /var/run/secrets/kubernetes.io/serviceaccount/

  • ca.crt:根证书,用于Client端验证API Server发送的证书
  • namespace:标识这个service-account-token的作用域空间
  • token:使用API Server私钥签名的JWT,用于访问API Server时,Server端的验证
自定义ServiceAccount

kubectl create sa chestersa -n chesterns kubectl describe sa chestersa -n chesterns

通过指定serviceAccountName,让pod使用自定义的sa

apiVersion: apps/v1 kind: Deployment metadata: name: chesterdeployment namespace: chesterns labels: app: chesterapi spec: replicas: 1 selector: matchLabels: app: chesterapi template: metadata: labels: app: chesterapi spec: serviceAccountName: chestersa containers: - name: oneapi image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest ports: - containerPort: 5000 livenessProbe: pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 ## 改名,给执行权限 mv cfssl_linux-amd64 cfssl mv cfssljson_linux-amd64 cfssljson mv cfssl-certinfo_linux-amd64 cfssl-certinfo chmod +x * ll -h 生成证书

mkdir /usr/local/chestercert cd /usr/local/chestercert vi chester-csr.json

{ "CN": "chester", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "O": "Ctyun", "ST": "BeiJing", "OU": "System" } ] }

cd /etc/kubernetes/pki/ cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/chestercert/chester-csr.json | cfssljson -bare chesteruser ls

为chester用户生成集群配置文件

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=192.168.43.111:6443 --kubeconfig=chester.kubeconfig ls

绑定用户信息至kubeconfig中

kubectl config set-credentials chesteruser \ --client-certificate=/etc/kubernetes/pki/chesteruser.pem \ --client-key=/etc/kubernetes/pki/chesteruser-key.pem \ --embed-certs=true \ --kubeconfig=chester.kubeconfig

设置上下文参数

kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=chesteruser \ --namespace=chesterns \ --kubeconfig=chester.kubeconfig

把kubeconfig文件复制到chester用户的目录的.kube下

mkdir -p /home/chester/.kube cp chester.kubeconfig /home/chester/.kube/config cd /home/chester/.kube/ ls config ## 修改文件所有者 cd /home/chester/ chown -R chester:chester .kube/ RoleBinding与ClusterRoleBinding

RoleBinding可以将角色中定义的权限授予用户或用户组。

RoleBinding包含一组权限列表(Subjects),权限列表中包含有不同形式的待授予权限资源类型(users,groups, or Service Account),Rolebinding 同样包含对被 Bind的Role

  • RoleBinding 适用于某个命名空间内授权

  • ClusterRoleBinding适用于集群范围内的授权。

定义RoleBinding

定义一个名称为chesterrolebinding,将chesterrole权限资源赋予名为chester的用户,仅作用于chesterns namespace。

apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: chesterrolebinding namespace: chesterns subjects: - kind: User name: chester apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: chesterrole apiGroup: rbac.authorization.k8s.io

kubectl apply -f rolebinding.yaml kubectl describe rolebinding -n chesterns

K8S ServiceAccount RBAC的原理和操作究竟有多简单?

验证chester用户能否正常访问

su chester cd /home/chester/.kube kubectl config use-context kubernetes --kubeconfig=config kubectl get pod -n chesterns

本文共计678个文字,预计阅读时间需要3分钟。

K8S ServiceAccount RBAC的原理和操作究竟有多简单?

ServiceAccount是运行在Pod中的程序使用的身份认证,Pod容器需要访问API Server时使用的账户就是ServiceAccount。ServiceAccount仅限于它所在的namespace,每个namespace创建时都会自动创建。

ServiceAccount

ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户。

ServiceAccount仅局限它所在的namespace,每个namespace创建时都会自动创建一个default service account。

创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。

通过以下命令可以查看我们前面创建chesterns这个namespace下的serviceaccount与对应的secret

kubectl describe pod -n chesterns kubectl describe sa -n chesterns kubectl describe secrets -n chesterns

通过以下命令查看serviceaccount挂载进容器内部的文件

kubectl exec -it chesterdeployment-cb855fb4b-5ksgd -n chesterns -- ls /var/run/secrets/kubernetes.io/serviceaccount/

  • ca.crt:根证书,用于Client端验证API Server发送的证书
  • namespace:标识这个service-account-token的作用域空间
  • token:使用API Server私钥签名的JWT,用于访问API Server时,Server端的验证
自定义ServiceAccount

kubectl create sa chestersa -n chesterns kubectl describe sa chestersa -n chesterns

通过指定serviceAccountName,让pod使用自定义的sa

apiVersion: apps/v1 kind: Deployment metadata: name: chesterdeployment namespace: chesterns labels: app: chesterapi spec: replicas: 1 selector: matchLabels: app: chesterapi template: metadata: labels: app: chesterapi spec: serviceAccountName: chestersa containers: - name: oneapi image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest ports: - containerPort: 5000 livenessProbe: pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 ## 改名,给执行权限 mv cfssl_linux-amd64 cfssl mv cfssljson_linux-amd64 cfssljson mv cfssl-certinfo_linux-amd64 cfssl-certinfo chmod +x * ll -h 生成证书

mkdir /usr/local/chestercert cd /usr/local/chestercert vi chester-csr.json

{ "CN": "chester", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "O": "Ctyun", "ST": "BeiJing", "OU": "System" } ] }

cd /etc/kubernetes/pki/ cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/chestercert/chester-csr.json | cfssljson -bare chesteruser ls

为chester用户生成集群配置文件

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=192.168.43.111:6443 --kubeconfig=chester.kubeconfig ls

绑定用户信息至kubeconfig中

kubectl config set-credentials chesteruser \ --client-certificate=/etc/kubernetes/pki/chesteruser.pem \ --client-key=/etc/kubernetes/pki/chesteruser-key.pem \ --embed-certs=true \ --kubeconfig=chester.kubeconfig

设置上下文参数

kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=chesteruser \ --namespace=chesterns \ --kubeconfig=chester.kubeconfig

把kubeconfig文件复制到chester用户的目录的.kube下

mkdir -p /home/chester/.kube cp chester.kubeconfig /home/chester/.kube/config cd /home/chester/.kube/ ls config ## 修改文件所有者 cd /home/chester/ chown -R chester:chester .kube/ RoleBinding与ClusterRoleBinding

RoleBinding可以将角色中定义的权限授予用户或用户组。

RoleBinding包含一组权限列表(Subjects),权限列表中包含有不同形式的待授予权限资源类型(users,groups, or Service Account),Rolebinding 同样包含对被 Bind的Role

  • RoleBinding 适用于某个命名空间内授权

  • ClusterRoleBinding适用于集群范围内的授权。

定义RoleBinding

定义一个名称为chesterrolebinding,将chesterrole权限资源赋予名为chester的用户,仅作用于chesterns namespace。

apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: chesterrolebinding namespace: chesterns subjects: - kind: User name: chester apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: chesterrole apiGroup: rbac.authorization.k8s.io

kubectl apply -f rolebinding.yaml kubectl describe rolebinding -n chesterns

K8S ServiceAccount RBAC的原理和操作究竟有多简单?

验证chester用户能否正常访问

su chester cd /home/chester/.kube kubectl config use-context kubernetes --kubeconfig=config kubectl get pod -n chesterns