k8s mysql授权_Kubernetes之(十五)身份认证,授权,准入控制

本文详细介绍了Kubernetes中的身份认证、授权和准入控制过程,重点讲解了ServiceAccount的工作原理及其在Pod中的应用。通过实例展示了如何创建和使用ServiceAccount,以及如何通过Role和ClusterRole进行权限控制。同时,还探讨了用户和Group的权限管理,以及RBAC在Pod访问控制中的作用。
摘要由CSDN通过智能技术生成

Kubernetes之(十五)身份认证,授权,准入控制

API Server作为Kubernetes网关,是访问和管理资源对象的唯一入口,其各种集群组件访问资源都需要经过网关才能进行正常访问和管理。每一次的访问请求都需要进行合法性的检验,其中包括身份验证、操作权限验证以及操作规范验证等,需要通过一系列验证通过之后才能访问或者存储数据到etcd当中。如下图:

m_5ae513116d5641cee062bc81ec148b04_r.png

ServiceAccount

Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。它与User account不同:

User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API而设计

User account是跨namespace的,而service account则是仅局限它所在的namespace

每个namespace都会自动创建一个default service account

Token controller检测service account的创建,并为它们创建secret

开启ServiceAccount Admission Controller后

每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout)

验证Pod引用的service account已经存在,否则拒绝创建

如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中

每个container启动后都会挂载该service account的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/

当创建 pod 的时候,如果没有指定一个 service account,系统会自动在与该pod 相同的 namespace 下为其指派一个default service account。而pod和apiserver之间进行通信的账号,称为serviceAccountName。如下:

[root@master manifests]# kubectl get pods

NAME READY STATUS RESTARTS AGE

myapp-0 1/1 Running 0 16h

myapp-1 1/1 Running 0 16h

myapp-2 1/1 Running 0 16h

myapp-3 1/1 Running 0 16h

[root@master manifests]# kubectl get pods myapp-0 -o yaml|grep serviceAccountName

serviceAccountName: default

[root@master manifests]# kubectl describe pods myapp-0

......

default-token-dqd2f:

Type: Secret (a volume populated by a Secret)

SecretName: default-token-dqd2f

......

每个Pod无论定义与否都会有个存储卷,这个存储卷为default-token-*** token令牌,这就是pod和serviceaccount认证信息。通过secret进行定义,由于认证信息属于敏感信息,所以需要保存在secret资源当中,并以存储卷的方式挂载到Pod当中。从而让Pod内运行的应用通过对应的secret中的信息来连接apiserver,并完成认证。每个 namespace 中都有一个默认的叫做 default 的 service account 资源。进行查看名称空间内的secret,也可以看到对应的default-token。让当前名称空间中所有的pod在连接apiserver时可以使用的预制认证信息,从而保证pod之间的通信。

[root@master manifests]# kubectl get sa

NAME SECRETS AGE

default 1 7d21h

[root@master manifests]# kubectl get sa -n ingress-nginx #所有的名称空间都存在name是default的serviceAccount

NAME SECRETS AGE

default 1 2d20h

nginx-ingress-serviceaccount 1 2d5h

[root@master manifests]# kubectl get secret

NAME TYPE DATA AGE

default-token-dqd2f kubernetes.io/service-account-token 3 7d21h

mysql-root-password Opaque 1 23h

tomcat-ingress-secret kubernetes.io/tls 2 2d3h

[root@master manifests]# kubectl get secret -n ingress-nginx

NAME TYPE DATA AGE

default-token-fkw6s kubernetes.io/service-account-token 3 2d20h

nginx-ingress-serviceaccount-token-jvlq9 kubernetes.io/service-account-token 3 2d5h

默认的service account 仅仅只能获取当前Pod自身的相关属性,无法观察到其他名称空间Pod的相关属性信息。如果想要扩展Pod,假设有一个Pod需要用于管理其他Pod或者是其他资源对象,是无法通过自身的名称空间的serviceaccount进行获取其他Pod的相关属性信息的,此时就需要进行手动创建一个serviceaccount,并在创建Pod时进行定义。那么serviceaccount该如何进行定义呢???实际上,service accout也属于一个kubernetes资源,如下查看service account的定义方式:

[root@master ~]# kubectl explain sa.

KIND: ServiceAccount

VERSION: v1

FIELDS:

apiVersion

imagePullSecrets

kind

metadata

secrets

创建serviceaccount

[root@master manifests]# kubectl create serviceaccount mysa -o yaml --dry-run #干跑模式,类似ansible的-C检查语法

apiVersion: v1

kind: ServiceAccount

metadata:

creationTimestamp: null

name: mysa

[root@master manifests]# kubectl create serviceaccount mysa -o yaml --dry-run > serviceaccount.yaml #保存为yaml文件,

[root@master manifests]# cat serviceaccount.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

creationTimestamp: null

name: mysa

[root@master manifests]# kubectl get sa mysa -o yaml

apiVersion: v1

kind: ServiceAccount

metadata:

annotations:

kubectl.kubernetes.io/last-applied-configuration: |

{"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"creationTimestamp":null,"name":"mysa","namespace":"default"}}

creationTimestamp: "2019-04-04T06:23:58Z"

name: mysa

namespace: default

resourceVersion: "273220"

selfLink: /api/v1/namespaces/default/serviceaccounts/mysa

uid: 3ab9e525-56a2-11e9-80a7-000c295ec349

secrets:

- name: mysa-token-cxlvc

看到有一个 token 已经被自动创建,并被 service account 引用。设置非默认的 service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为您想要用的 service account 名字即可。在 pod 创建之初 service account 就必须已经存在,否则创建将被拒绝。需要注意的是不能更新已创建的 pod 的 service account。

自定义serviceaccount

在default名称空间创建了一个sa为admin

[root@mas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值