10 k8s 考试基础知识(八)

本文详细介绍了Kubernetes中的API对象和RBAC(Role-Based Access Control)机制。API对象是集群状态的持久化实体,通过HTTP服务进行交互。RBAC中,用户验证包括X509客户端证书、静态token文件和静态密码文件。重点讲述了Role、RoleBinding、ClusterRole和ClusterRoleBinding的使用,以及如何为kubectl配置用户,包括创建userAccount和服务Account。此外,还讨论了默认角色和面向用户的权限配置。
摘要由CSDN通过智能技术生成

API 对象解释

Kubernetes 对象是持久化的实体,是存入 etcd 中的数据,集群中通过这些实体来表示整个集群的状态。

Kubernetes API 是一个以 JSON 为主要序列化方式的 HTTP 服务,除此之外也支持 Protocol Buffers 序列化方式。

主要用于集群内部组件间的通信。为了可扩展性,Kubernetes 在不同的 API 路径(比如/api/v1 或者 /apis/batch)下面不同的 API 版本意味着不同级别的稳定性和支持:

  • Alpha 级别,例如 v1alpha1 默认情况下是被禁用的,可以随时删除对功能的支持,所以要慎用
  • Beta 级别,例如 v2beta1 默认情况下是启用的,表示代码已经经过了很好的测试,但是对象的语义可能会在随后的版本中以不兼容的方式更改
  • 稳定级别,比如 v1 表示已经是稳定版本了,也会出现在后续的很多版本中。

Kubernetes 集群中,API 对象在 Etcd 里的完整资源路径,由: Group(API 组); Version(API 版本); Resource(API 资源类型)

apiserver tree

kubectl get --raw /

RBAC详解

Role-Based Access Control

K8S中,有3种验证方式:

kubectl config set-credentials -h 
1 Client-certificate flags
2 Bearer token flags
3 Basic auth flags
  • X509客户端证书
    客户端证书验证通过为API Server指定--client-ca-file=xxx选项启用,API Server通过此ca文件来验证API请求携带的客户端证书的有效性,一旦验证成功,API Server就会将客户端证书Subject里的CN属性作为此次请求的用户名
  • 静态token文件
    通过指定--token-auth-file=SOMEFILE选项来启用bearer token验证方式,引用的文件是一个包含了 token,用户名,用户ID 的csv文件 请求时,带上Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269头信息即可通过bearer token验证
  • 静态密码文件
    通过指定--basic-auth-file=SOMEFILE选项启用密码验证,类似的,引用的文件时一个包含 密码,用户名,用户ID 的csv文件 请求时需要将Authorization头设置为Basic BASE64ENCODED(USER:PASSWORD)

X509客户端证书 这个比较重要,下面按照Client-certificate 这个方式创建用户

在 RBAC API 中,一个角色包含一组相关权限的规则。权限是纯粹累加的(不存在拒绝某操作的规则),即只能给权限累加,不存在给了XX权限,然后去掉XX01权限的情况。

RBAC 账户管理有两种:

  • userAccount: 给人设计使用,并且userAccount不在k8s集群内管理
  • serviceAccount: 为集群内pod,外部service访问而设计的,更轻量级,更专注与实现某个任务

01 userAccount

为kubectl配置用户

在命令中带上 kubectl --context=tom@aliyun ... 参数即可指定kubectl使用之前添加的名为tom@aliyun的context操作集群
也可以通过命令 kubectl config use-context tom@aliyun 来设置当前激活的context

不在k8s集群内管理内的资源

为用户生成证书的步骤 为用户提供了基于X509证书的验证,也就是生成一个userAccount

{
    mkdir ~/userAccount_dir/ ; cd $_ ; }
# 1 为jemmy用户创建一个私钥
# 设置掩码077,这样只有当前用户有rw权限
(umask 077; openssl genrsa -out jemmy.key 2048)
# 2 用此私钥创建一个csr(证书签名请求)文件,需要在subject里带上用户信息(CN为用户名,O为用户组) 
# /O参数可以出现多次,即可以有多个用户组
openssl req -new -key jemmy.key -out jemmy.csr -subj "/CN=jemmy/O=Shanghai/O=worker"
# 3 找到K8S集群(API Server)的CA证书文件,其位置取决于安装集群的方式,通常会在`/etc/kubernetes/pki/`路径下,会有两个文件,一个是CA证书(ca.crt),一个是CA私钥(ca.key)
# 4 通过集群的CA证书和之前创建的csr文件,来为用户颁发证书
# -CA和-CAkey参数需要指定集群CA证书所在位置path/to/ca.crt; path/to/ca.key,
# -days参数指定此证书的过期时间,这里为365天
openssl x509 -req -in jemmy.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out jemmy.crt -days 365
# openssl x509 -req -in mrvolleyball.csr -CA ca.pem  -CAkey ca-key.pem -CAcreateserial -out mrvolleyball.crt # 注:ca.pem与ca-key.pem分别是证书与私钥
# 5 最后将证书(jemmy.crt)和私钥(jemmy.key)保存起来,这两个文件将被用来验证API请求
# 看一下这个详细信息
openssl x509 -in jemmy.crt -text -noout
# openssl x509 -in mrvolleyball.crt -text
# Subject: CN=jemmy, O=Shanghai, O=worker

以上步骤就有了用户jemmy

接下来将账户注册到kubectl config当中进行管理:

# 注册这个用户
k config -h  # set-credentials   Set a user entry in kubeconfig
kubectl config set-credentials -h  #  --client-certificate=certfile --client-key=keyfile
# set User "jemmy" 
kubectl config set-credentials jemmy --client-certificate=jemmy.crt --client-key=jemmy.key
# kubectl config set-credentials jemmy --client-certificate=jemmy.crt --client-key=jemmy.key --embed-certs=true  # Embed client cert/key for the user entry in kubeconfig # 加上了就不显示真实目录显示 这个 DATA+OMITTED
# created Context "jemmyLoc" 
kubectl config set-context jemmyLoc --cluster=kubernetes --user=jemmy
#  --namespace=a-1 这个ns可加可不叫,不加就没有默认的命名空间
# 创建好之后使用新账户来登录:
kubectl config use-context jemmyLoc
# 一开始由于没有权限,我们只能允许被进入k8s集群,但是没有访问任何资源的权限
kubectl get pod
kubectl config use-context kubernetes-admin@kubernetes 

接下来为用户添加基于角色的访问控制(RBAC)

目前RBAC已作为稳定的功能,管理员可以通过 Kubernetes API 动态配置策略来启用RBAC,需要在 kube-apiserver 中添加参数--authorization-mode=RBAC

# 查看哪些插件是默认启用的:
cat  /etc/kubernetes/manifests/kube-apiserver.yaml  | grep enable-admission-plugins
#   - --authorization-mode=Node,RBAC

02 clusterrole 和 rolebinding

RoleBinding 在 哪个名命名空间,用户就有哪个命名空间的权限

角色

  • 普通角色(Role) 作用域 某个命名空间
  • 集群角色(ClusterRole) 作用域 整个集群 可以多次复用
    • 比如node资源的管理;
    • 非资源类型的接口请求(如"/healthz");
    • 请求全命名空间的资源(通过指定 --all-namespaces)

apiGroups
要使用的API Group name。若此欄空白,則預設為core API

cat <<- eof | kubectl apply -f - 
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # ClusterRole 是集群范围对象,没有 "namespace" 区分
  name: jemmy-clusterrole
rules:
  # 对哪个api组进行授权,""核心资源组,apps组是deployment控制器所在的api组
- apiGroups: ["", "apps"]
  # 授权资源的类型
  resources: ["pods","deployments"]
  verbs: ["get", "watch", "list", "create", "delete"]
eof
kubectl get clusterrole | grep jemmy-clusterrole
k get clusterrole.rbac.authorization.k8s.io/jemmy-clusterrole
k describe $_

Kubernetes集群RBAC授权案例(一)通过用户账号的方式分配单独Namespace的权限(四十)_nginx_02

RoleBinding的目的即是連接User或者service account 和Role

如yaml中所示,RoleBinding资源创建了一个 Role-User 之间的关系,roleRef节点指定此RoleBinding所引用的角色,subjects节点指定了此RoleBinding的受体,可以是User,也可以是前面说过的ServiceAccount,在这里只包含了名为 tom 的用户

RoleBinding资源将用户和角色绑定

通过RoleBinding角色绑定将用户与集群角色进行绑定

cat <<- eof | kubectl apply -f - 
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: jemmy-clusterrole-csdn-binding
  namespace: csdn-test
#关联用户信息
subjects:
  #类型为用户
- kind: User	
  #用户名称
  name: jemmy
  #角色所能控制的命名空间
  namespace: csdn-test			
  apiGroup: rbac.authorization.k8s.io
#关联角色信息
roleRef:
  #类型为ClusterRole
  kind: ClusterRole		
  #角色名称
  name: jemmy-clusterrole						  
  apiGroup: rbac.authorization.k8s.io
eof

验证

k auth can-i -h 
kubectl auth can-i <verb> <resoureces>
k auth can-i get po -n default --as=jemmy
k auth can-i get deploy -n default --as=jemmy
k auth can-i get po -n csdn-test --as=jemmy
k auth can-i get deploy -n csdn-test --as=jemmy
kubectl config use-context jemmyLoc

下面以命令行的方式创建

kubectl config 
  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k8sKubernetes基础知识点通俗易懂的解释如下: Kubernetes是一种容器编排平台,用于管理和部署容器化应用程序。它提供了一种简单而强大的方式来自动化应用的调度、扩展和管理,使开发人员和运维人员能够以更高效的方式管理容器化应用。 在学习k8s基础知识之前,建议您具备一定的Linux基础和网络基础知识,并了解一些Docker和k8s相关的概念。例如,您可以先掌握一些关于容器的基本概念,比如什么是容器容器镜像、容器编排等。此外,您还需要了解一些关于k8s的核心概念,比如Pod、Service、Deployment等。 Kubernetes中的Pod是最小的部署单元,它包含一个或多个容器,并共享存储、网络等资源。Pod可以被创建、启动、停止或调度,以确保容器应用程序的高可用性和弹性。 Service是一种抽象,用于将一组Pod暴露给其他应用程序或用户。它为Pod提供了一个稳定的网络地址,并负责负载均衡请求。 Deployment是一种资源对象,它定义了如何部署应用程序。通过Deployment,您可以指定要运行的Pod数量、容器的镜像、升级策略等。 除此之外,还有许多其他的k8s核心概念和功能,如Namespace、ReplicaSet、StatefulSet等,它们可以帮助您更好地管理和扩展容器化应用程序。 总之,k8s基础知识点涉及到了容器编排、Pod、Service、Deployment等核心概念。通过学习这些知识,您将能够更好地理解和使用Kubernetes平台来管理和部署容器化应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Prometheus+Grafana(Kubernetes)企业级监控](https://download.csdn.net/download/weixin_26833205/19732967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [云计算虚拟化:k8s进阶-CRD开发基础](https://blog.csdn.net/dustzhu/article/details/112029190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [视频教程-通俗易懂的消息中间件ActiveMQ教程(含配套资料)-Docker/K8S](https://blog.csdn.net/weixin_33500227/article/details/106513277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值