当前位置: 首页 > news >正文

Kubernetes集群安全机制

Kubernetes集群安全机制

  • 一、认证(身份鉴别,只有正确的账号才能够通过认证)
    • 1.1 基于 HTTPS 认证方式
    • 1.2 证书签发模式
    • 1.3 kubeconfig 文件
    • 1.4 ServiceAccount
  • 二、鉴权(确定请求方有哪些资源的权限)
    • 2.1 RBAC(基于角色的访问控制)
      • 2.1.1 用户(user)
      • 2.1.2 Role( 角色权限控制)
      • 2.1.3 **ClusterRole**(集群级别角色权限控制)
      • 2.1.4 **RoleBinding(将角色中定义的权限授予用户或用户组) + Role**
      • 2.1.5 **RoleBinding + ClusterRole**
      • 2.1.6 **ClusterRoleBinding**(对整个集群中的所有命名空间资源权限进行授权)
    • 2.2 示例:创建一个用户智能管理 dev 名字空间
      • 2.2.1 创建证书
      • 2.2.2 设置集群参数
      • 2.2.3 设置客户端参数
      • 2.2.4 权限绑定
  • 三、准入控制(检查请求中到达的数据,以修改资源)

官网地址:https://kubernetes.io/zh-cn/docs/concepts/security/controlling-access/

Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的

在这里插入图片描述

在上图左边有一个用户和一个 Pod,想通过 kubernetes 集群访问到内部的这些资源对象,必须要经过身份认证鉴权准入控制这几个步骤,而这几个步骤都封装在了 apiServer 内部

一、认证(身份鉴别,只有正确的账号才能够通过认证)

认证是必需的,证书是私钥

比较常见的认证类型:

  1. HTTP Token 认证:通过一个 Token 来识别合法用户
    • HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式
    • 每一个 Token 对应一个用户名存储在 API Server能访问的文件中
    • 当客户端发起 API 调用请求时,需要在 HTTP Header 里放入Token
  2. HTTP Base 认证:通过 用户名+密码 的方式认证
    • BASE64 算法进行编码后 的字符串放在 HTTP Request 中的 Heather Authorization 域里发送给服务端,服务端收到后进行编码,获取用户名及密码
  3. 最严格的 HTTPS 证书认证基于 CA 根证书签名的客户端身份认证方式

在这里插入图片描述

需要认证的节点

  • Kubernetes 组件对 APIServer 的访问:kubectl、Controller Manager、Scheduler、kubelet、kube-proxy

    • Controller Manager、Scheduler 与 API Server 在同一台机器,所以直接使用 API Server 的非安全端口访问
    • kubectl、kubelet、kube-proxy 访问 API Server 就都需要证书进行 HTTPS 双向认证
  • Kubernetes 管理的 Pod 对容器的访问:Pod(dashborad 也是以 Pod 形式运行)

1.1 基于 HTTPS 认证方式

安全性最高

在这里插入图片描述

客户端和服务器端都需要去向 CA(证书颁发机构) 架构申请证书,验证通过以后就会下发证书给申请者,客户端和服务器端之间如果想进行数据沟通,必须要交换证书。

这种方式类似于 HTTPS 的访问方式,只不过 HTTPS 的访问方式只有服务器端需要把证书给客户端,而客户端不需要发送证书给服务器端

1.2 证书签发模式

集群是通过 kubeadm 这个工具来完成证书签发

  • 手动签发:通过 k8s 集群的跟 CA 进行签发 HTTPS 证书

  • 自动签发:kubelet 首次访问 APIServer 时,使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了(经常频繁交互的组件,通常证书使用是一年期限,到期后需重新认证)

除了 kubelet 组件以外,其它所有组件如果需要用证书,都必须要手动签发

kubelet 能够自动签发:

  • kubelet 组件的作用是确保 Pod 及其容器能够正常运行,因此 Kubernetes 集群对它的信任度非常高,所以默认就认为它是安全的。而对于一个认为是安全的组件就可以自动签发一个证书
  • 其它组件之所以要手动签发,原因是无法判定其身份是不是安全合理的

endpointSlice —> Pod —> kubelet —> ipvsadm —> 负载均衡

在 kubernetes 集群安装完成后,会执行这么一条命令:

# 将我工作节点加入到 Kubernetes 集群中,它会在每个工作节点上执行:
[root@node1 ~]# kubeadm join 192.168.86.11:6443 \	#是 Kubernetes集群的master服务器的apiServer地址和端口
--token ge53zg.14u86m07fuz4ywa7 \		# 为 node 节点颁发的令牌,用于 apiServer 识别 kubelet 是否合法
--discovery-token-ca-cert-hash			# CA证书的哈希值,用于kubelet确认apiServer发送过来的证书是否合法
sha256:98580c3b4b9958d879a83c8af531076574aabe5f4b5bd98e0e5ca25ba69191f9 \
--cri-socket unix:///var/run/cri-dockerd.sock
#在节点加入集群的时就已经做了双向认证了,因此 kubelet 能够实现自动签发证书

1.3 kubeconfig 文件

通向集群的钥匙,而且这个钥匙的权限还是最高权限,该文件非常重要

kubeconfig 文件包含

  • 集群参数(CA 证书、API Server 地址)
  • 客户端参数(上面生成的证书和私钥)
  • 集群 context 信息(集群名称、用户名)

Kubenetes 组件通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群

当 kubectl 在执行命令的时候,它会去调用当前节点家目录下的 /root/.kube/config 文件[root@master ~]# cat /root/.kube/config
apiVersion: v1
clusters:
- cluster:certificate-authority-data:#集群的 CA 证书,如果双方都需要去认证对方证书是否有效,就必须有 CA 的根证书才可以。它发给我,我再拿 CA 根证书去确认这个证书是不是它签发的
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJS29Dbm9UV...........
..................server: https://192.168.10.11:6443		#集群的地址和端口,通过这个地址和端口才能去访问name: kubernetes	#集群的名字叫 kubernetes
contexts:	#表示上下文,将集群信息和用户信息这两部分关联起来
- context:cluster: kubernetes		#集群user: kubernetes-adminname: kubernetes-admin@kubernetes	#上下文的名字		#只要切换到这个上下文里,就相当于拿着这个用户凭据(kubernetes-admin)在访问kubernetes 集群
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:		#用户信息,包括用户的名字、用户的证书、用户的私钥等
- name: kubernetes-adminuser:	client-certificate-data:	#用户证书信息
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJVVJVUU0xbk5iQWt3.............
.............................client-key-data:	#用户的私钥
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMkxIR3pDZ0lvdzFsL0dIelNqTUExWUdiSEJCZmY1c1BSNldzYVU2emZDSlRYb3FXCjFoT0NUW..................................

对 kubeconfig 文件进行分析:

  1. 集群的 CA 证书( cluster:certificate-authority-data 如果双方都需要去认证对方证书是否有效,就必须有 CA 的根证书才可)
    它发给我,我再拿 CA 根证书去确认这个证书是不是它签发的
  2. 集群的地址和端口(server 通过这个地址和端口才能去访问)
  3. 集群的名字(name)
  4. 上下文(context 将集群信息和用户信息关联起来)只要切换到这个上下文里,就相当于拿着这个用户凭据(user)在访问 kubernetes 集群
  5. 用户信息(users,包括用户的名字、用户的证书、用户的私钥等)
  6. 证书信息(user: client-certificate-data:)
  7. 用户的私钥(client-key-data)
    当 kubectl 在执行命令的时候,它会去调用当前节点家目录下的 /root/.kube/config 文件
  • 如果移除这个文件:
[root@master ~]# mv /root/.kube/config .#执行kubectl命令:
[root@k8s-master01 ~]# kubectl get pod
E0613 19:20:46.874165 469787 memcache.go:265] "Unhandled Error" err="couldn't
get current server API group list: Get \"http://localhost:8080/api?timeout=32s\":
dial tcp 127.0.0.1:8080: connect: connection refused"
.................
E0613 19:20:46.939215 469787 memcache.go:265] "Unhandled Error" err="couldn't
get current server API group list: Get \"http://localhost:8080/api?timeout=32s\":
dial tcp 127.0.0.1:8080: connect: connection refused"
The connection to the server localhost:8080 was refused - did you specify the
right host or port?
#会失败,这就是 config 文件的重要性,验证完成后我们再将这个文件移回去:
[root@master ~]# mv config /root/.kube/config
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nodeselect-test-6656f9d7b6-74cz6 1/1 Running 0 48m
nodeselect-test-6656f9d7b6-ts9cf 1/1 Running 0 48m

1.4 ServiceAccount

官方文档:ServiceAccount

Pod 中的容器 也需要访问 API Server

因为 Pod 的创建、销毁是动态的,所以要为它手动生成证书就不可行的。 因此 Kubenetes 使用 Service Account 解决 Pod 访问 API Server 的认证问题

Kubernetes 设计了一种资源对象叫做 Secret,分为两类,

  • 一种是用于 ServiceAccount 的 service account-token
  • 另一种是用于保存用户自定义保密信息的 Opaque[əʊˈpeɪk]。\ServiceAccount 中用到包含三个部分:token、ca.crt、namespace
    • token:它是使用 API Server 私钥签名的 JWT。用于访问 API Server 时,Server 端认证
    • ca.crt:根证书,用于 Client 端验证 API Server 发送的证书
    • namespace:是标识这个 service-account-token 的作用域名空间

Json web token(JWT)是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准([(REC 75191)。该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密

默认情况下,每个 namespace 都会有一个 ServiceAccount,如果 Pod 在创建时没有指定 ServiceAccount 就会使用 Pod 所属的 namespace 的 ServiceAccount
默认挂载目录是 /run/secrets/kubernetes.io/serviceaccount/

在这里插入图片描述

二、鉴权(确定请求方有哪些资源的权限)

官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/

认证过程只是确认通信的双方都确认了对力是可信的,可以相互通信。而鉴权确定请求方有哪些资源的权限

API Server 目前支持以下几种授权策略(通过 API Server 的启动参数 “–authorization-mode” 设置)

  • AlwaysDeny:表示拒绝所有的请求,一般用于测试
  • AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略
  • ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户于请求进行匹配和控制
  • Webhook:通过调用外部 REST 服务对用户进授权
  • RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规则

2.1 RBAC(基于角色的访问控制)

Role-Based Access Control 具有以下优势:

  • 对集群中的资源和非资源均拥有完整的覆盖
  • 整个 RBAC 完全由几个 API 对象完成,同其它 API 对象一样,可以用 kubectl 或 API 进行操作
  • 可以在运行时进行调整,无需重启 API Server

RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding,4 种对象类型均可以通过 kubectl 与 API 操作

  • 名称空间级别的对象:Role(角色)和 RoleBinding(角色绑定)
    • 名称空间级别归属在不同的名字空间下,不同的名字空间级别里可以存在相同名称的对象,这些对象互不干扰
  • 集群级别的对象:ClusterRole(集群角色)和 ClusterRoleBinding(集群角色绑定)
    • 整个集群不同的名字空间看到的结果是一样的,比如资源节点、集群角
      色、角色绑定等

在这里插入图片描述

2.1.1 用户(user)

权力的附着点有用户,有组,有SA

SA 的创建可通过如下的命令来实现:kubectl create sa sa名字 -n 名字空间

[root@master ~]# kubectl create sa chengke -n default --dry-run=client -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:creationTimestamp: nullname: chengkenamespace: default

背后的 ca.crt、token、namespace 都是这个对象自己去封装,不需要我们去组建或编码

2.1.2 Role( 角色权限控制)

在 RBAC API 中,Role 表示一组规则权限权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过 RBAC 对其进行减少的操作。Role 可以定义在一个 namespace 中,如果想要跨 namespace 则可以创建 ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API groupresources: ["pods"]verbs: ["get", "watch", "list"]

2.1.3 ClusterRole(集群级别角色权限控制)

ClusterRole 具有与 Role 相同的权限角色控制能力,不同的是 ClusterRole 是集群级别

用处:

  • 集群级别的资源控制(例如 node 访问权限)
  • 非资源型 endpoints(例如 /health 访问)
  • 所有命名空间资源控制(例如 pods)
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole
metadata:# "namespace" omitted since ClusterRoles are not namespacedname: secret-reader
rules:
- apiGroups: [""]resources: ["secrets"]verbs: ["get", "watch", "list"]

2.1.4 RoleBinding(将角色中定义的权限授予用户或用户组) + Role

RoleBinding 可以将角色中定义的权限授予用户或用户组,RoleBinding 包含一组权限主题列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(users,groups,or serviceaccounts)

RoleBinding 同样包含对被 Bind 的 Role 引用,RoleBinding 适用于某个命名空间内授权,而 ClusterRoleBinding 适用于集群范围内的授权

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pod
# 需要在该名字空间中有一个名为 “pod-reader” 的 Role
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
# 包含对角色绑定所适用的对象或用户标识的引用。其中可以包含直接 API 对象的引用或非对象(如用户名和组名)的值。
- kind: User    # 类别可以是 User、Group 和 ServiceAccountname: jane 	# 被引用的对象的名称,区分大小写的apiGroup: rbac.authorization.k8s.io   # 包含被引用主体的 API 组。 对于ServiceAccount 主体默认为 ""。 对于 User 和 Group 主体,默认为"rbac.authorization.k8s.io"
roleRef:# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系kind: Role        # 此字段必须是 Role 或 ClusterRolename: pod-reader  # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配apiGroup: rbac.authorization.k8s.io

2.1.5 RoleBinding + ClusterRole

RoleBinding 同样可以引用 ClusterRole 来对当前 namespace 内用户、用户组或 ServiceAccount 进行授权,这种操作允许集群管理员在整个集群内定义一些通用的 ClusterRole,然后在不同的 namespace 中使用 RoleBinding 来引用

# This role binding allows "dave" to read secrets in the "development" namespace.
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定使得用户 "dave" 能够读取 "development" 名字空间中的 Secret
# 需要一个名为 "secret-reader" 的 ClusterRole
kind: RoleBinding
metadata:name: read-secrets# RoleBinding 的名字空间决定了访问权限的授予范围。# 这里隐含授权仅在 "development" 名字空间内的访问权限。namespace: development
subjects:
- kind: Username: daveapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

2.1.6 ClusterRoleBinding(对整个集群中的所有命名空间资源权限进行授权)

使用 ClusterRoleBinding 可以对整个集群中的所有命名空间资源权限进行授权

  • 授权 manager 组内所有用户在全部命名空间中对 secrets 进行访问:
# 授权 manager 组内所有用户在全部命名空间中对 secrets 进行访问
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 Secret 资源
kind: ClusterRoleBinding
metadata:name: read-secrets-global
subjects:
- kind: Groupname: managerapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io

2.2 示例:创建一个用户智能管理 dev 名字空间

创建证书 > 转换为 kubeconfig 文件 > 创建名字空间 > 角色绑定

2.2.1 创建证书

在主节点目录下进行操作

  1. 创建 JSON 描述证书文件
  2. 下载证书生成工具(cfssl_1.6.5_linux_amd64.tar.gz)
    1. 将证书生成工具上传到 k8s-master01 家目录下
    2. 解压目录
    3. 为文件增加可执行权限
  3. 进入目录,生成证书(/etc/kubernetes/pki/
    cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser

由于有证书创建动作,建议最好在主节点/etc/kubernetes/pki/ 目录下进行操作,因为这里本身就是存储证书相关的目录

[root@master ~]# cd /etc/kubernetes/pki/
[root@master pki]# ls
apiserver.crt                 apiserver-kubelet-client.key  front-proxy-ca.key
apiserver-etcd-client.crt     ca.crt                        front-proxy-client.crt
apiserver-etcd-client.key     ca.key                        front-proxy-client.key
apiserver.key                 etcd                          sa.key
apiserver-kubelet-client.crt  front-proxy-ca.crt            sa.pub

执行如下命令创建 JSON 描述证书文件:

# 创建 JSON 描述证书文件
[root@master pki]# vim devuser.json
[root@master pki]# cat devuser.json
{"CN": "devuser","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "ChongQing","L": "ChongQing","O": "k8s","OU": "System"}]
}

下载证书生成工具:https://github.com/cloudflare/cfssl/releases

# 1. 将证书生成工具上传到 k8s-master01 家目录下
[root@master ~]# ls
4  5  6  7  8  cfssl_1.6.5_linux_amd64.tar.gz# 2. 然后解压目录
[root@master ~]# tar -xzf cfssl_1.6.5_linux_amd64.tar.gz # 3. 确认解压文件
[root@master ~]# ls
4  5  6  7  8  cfssl  cfssl_1.6.5_linux_amd64.tar.gz  cfssl-certinfo  cfssljson
[root@master ~]# cp cfssl cfssl-certinfo cfssljson /usr/local/bin
[root@master ~]# cd /usr/local/bin/
[root@master bin]# ls
cfssl  cfssl-certinfo  cfssljson
[root@master bin]# ll
total 25900
-rw-r--r--. 1 root root 11890840 Jul 21 11:17 cfssl
-rw-r--r--. 1 root root  8413336 Jul 21 11:17 cfssl-certinfo
-rw-r--r--. 1 root root  6205592 Jul 21 11:17 cfssljson# 4. 为文件增加可执行权限
[root@master bin]# chmod +x cfssl*# 5. 验证文件权限
[root@master bin]# ll
total 25900
-rwxr-xr-x. 1 root root 11890840 Jul 21 11:17 cfssl
-rwxr-xr-x. 1 root root  8413336 Jul 21 11:17 cfssl-certinfo
-rwxr-xr-x. 1 root root  6205592 Jul 21 11:17 cfssljson# 注意执行目录
[root@master pki]# pwd
/etc/kubernetes/pki生成证书    ca证书在哪	ca的key在哪                                管道符
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser
cfssl gencert 生成证书
-ca=ca.crt 指定当前的CA根证书,
-ca-key=ca.key 指定当前CA的私钥
-profile=kubernetes 指定当前要导出的证书要给谁用,我们的类型是 kubernetes类型
devuser.json 指定当前的 json 格式,也就是这个证书怎么去描述创建的
cfssljson -bare devuser 指定当前的证书的头部信息,也就是前缀

生成证书

[root@master pki]# cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser
2025/07/21 11:20:31 [INFO] generate received request
2025/07/21 11:20:31 [INFO] received CSR
2025/07/21 11:20:31 [INFO] generating key: rsa-2048
2025/07/21 11:20:31 [INFO] encoded CSR
2025/07/21 11:20:31 [INFO] signed certificate with serial number 165692886213913774838988527629367868665489821002
2025/07/21 11:20:31 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").

命令说明:

  • cfssl gencert 生成证书
  • -ca=ca.crt 指定当前的CA根证书,
  • -ca-key=ca.key 指定当前CA的私钥
  • -profile=kubernetes 指定当前要导出的证书要给谁用,我们的类型是 kubernetes类型
  • devuser.json 指定当前的 json 格式,也就是这个证书怎么去描述创建的
  • cfssljson -bare devuser 指定当前的证书的头部信息,也就是前缀

在这里插入图片描述

[root@master pki]# ls
apiserver.crt                 ca.key              front-proxy-ca.key
apiserver-etcd-client.crt     devuser.csr         front-proxy-client.crt
apiserver-etcd-client.key     devuser.json        front-proxy-client.key
apiserver.key                 devuser-key.pem     sa.key
apiserver-kubelet-client.crt  devuser.pem         sa.pub
apiserver-kubelet-client.key  etcd
ca.crt                        front-proxy-ca.crt
# devuser.pem 就是证书,而 devuser-key.pem 就是私钥

2.2.2 设置集群参数

# 先设置一个变量,注意地址写成 apiserver 的地址,也就是master的地址cat .kube/config
apiVersion: v1
clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWmZZODFaNy9JdEV3RFFZSktvWklodmNOQVFFTEJR....................................server: https://192.168.86.11:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJZjJtTGZRQ29EMlF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVU...................................client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMG1HaWdBTWs5MjNyeDlZV1JUeXVSY1BZRXVsTHdjbVNCL2JES.......................export KUBE_APISERVER="https://192.168.86.11:6443"[root@master pki]# export KUBE_APISERVER="https://192.168.86.11:6443"
[root@master pki]# kubectl config set-cluster kubernetes \
--certificate-authority=ca.crt \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=devuser.kubeconfig
Cluster "kubernetes" set.命令说明:set-cluster kubernetes 设置集群的名称为 kubernetes--certificate-authority=ca.crt 指定当前集群的CA根证书--embed-certs=true 需要对证书做验证--server=${KUBE_APISERVER} 指定当前服务器端的地址--kubeconfig=devuser.kubeconfig 当前保存在哪一个kubeconfig文件里

执行成功后查看 devuser.kubeconfig 文件内容:

[root@master pki]# ls
apiserver.crt                 ca.key              front-proxy-ca.crt
apiserver-etcd-client.crt     devuser.csr         front-proxy-ca.key
apiserver-etcd-client.key     devuser.json        front-proxy-client.crt
apiserver.key                 devuser-key.pem     front-proxy-client.key
apiserver-kubelet-client.crt  devuser.kubeconfig  sa.key
apiserver-kubelet-client.key  devuser.pem         sa.pub
ca.crt                        etcd
[root@master pki]# cat devuser.kubeconfig
apiVersion: v1
clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWmZZODFaNy9JdEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBM01Ea3dNalEwTWpGYUZ3MHpOVEEzTURjd01qUTVNakZhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUMxRGNCVUt3UjRnZXF2ZHNqbG16ekRjT09vQ1ZVRnlhb2dZZEZpOW1TOWtwbEc5WHJkVTlkQlJZTTYKS3dnRHgxQ3JUZnFsZGJVQituZnBEQmRQYWJscmxMUERnZlFzRmUyNDJqYXV1NmxJdURnRVlkSzNFZDRXa0JPdwpyYktYcEt1cWVYNlBNVTNpYnJnUWU1bVdtZnNycXhjWTBISUtySjQvZ1JQZytpa2FnMmJZMmpndlI0YmVsVkM1CnRtYk1rV3R0V0R5ZXp6R29VMWxHM05vd1pTd2VIcEYwVEJ4aVZyVkFQV0YyQXdiZGlEMWhpeFVnRHpFYisyZVoKbXBzOWVHQnJFRGJrTU51VGhISHQwUForVm45K3B5YzJ4Z2lCdDJORW1uNmFkSmZIaHdFa1YyMnhBYThjNmJrQgp3OUF6bHdpNjFhM1FGN2FoTHJGY012OUJCYVBQQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJROGF0R0VrcGJzNGsyTy9GNEJvQkM0aWR3L2tUQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQnlOMzVRc2tJVAptVVYyTnQ1cWJlUmNKMTVqZW5FT08yOG0rUURpaGM2VWJUYzZoYXR0REUzSlpib01GZWpERHBhd3pLbitsVVNtCmhoYVhoMGt1Y29FSm43dGI5d21WR0pmN05ZYTMwYmlqQXdVRy8wa0srSUlCTXZrd0drdVBXMHZBd3l2aXZwSG4KbXRKY0J1NUdqYVBFWGk4SlI5MUdScjh4K2M5YStKQWVHMTdDTWVveTVLSEIvVjV5ZTVTMytkdEl4QU5GUzFsOApXWEFiejVvL2d1eVZNYzdnY2Rjc1NtSyttOHVYQWpjLzd6Y0xXYWovU25uY29BWndaS0ZJeFZJRlFpbXVyVGRPCk9qRmFYLytkTmtPc21jY3JCSXNUNmZxOWJjMDR1U2pCMmNFQlRlaXprZjJGMkFpeUZZdHZ1Vk5FTEZoZjI3cWwKQVBoM295RDdqaDRQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0Kserver: https://192.168.86.11:6443name: kubernetes
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

2.2.3 设置客户端参数

设置客户端认证参数

# 设置客户端认证参数
[root@master pki]# kubectl config set-credentials devuser \
--client-certificate=devuser.pem \
--client-key=devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
User "devuser" set.
##命令说明:set-credentials devuser 为devuser用户设置凭据--client-certificate=devuser.pem 指定当前用户证书--client-key=devuser-key.pem 指定当前用户私钥--embed-certs=true 证书需要确认--kubeconfig=devuser.kubeconfig 证书信息保存在devuser.kubeconfig文件中[root@master pki]# cat devuser.kubeconfig 
apiVersion: v1
clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWmZZODFaNy9JdEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBM01Ea3dNalEwTWpGYUZ3MHpOVEEzTURjd01qUTVNakZhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUMxRGNCVUt3UjRnZXF2ZHNqbG16ekRjT09vQ1ZVRnlhb2dZZEZpOW1TOWtwbEc5WHJkVTlkQlJZTTYKS3dnRHgxQ3JUZnFsZGJVQituZnBEQmRQYWJscmxMUERnZlFzRmUyNDJqYXV1NmxJdURnRVlkSzNFZDRXa0JPdwpyYktYcEt1cWVYNlBNVTNpYnJnUWU1bVdtZnNycXhjWTBISUtySjQvZ1JQZytpa2FnMmJZMmpndlI0YmVsVkM1CnRtYk1rV3R0V0R5ZXp6R29VMWxHM05vd1pTd2VIcEYwVEJ4aVZyVkFQV0YyQXdiZGlEMWhpeFVnRHpFYisyZVoKbXBzOWVHQnJFRGJrTU51VGhISHQwUForVm45K3B5YzJ4Z2lCdDJORW1uNmFkSmZIaHdFa1YyMnhBYThjNmJrQgp3OUF6bHdpNjFhM1FGN2FoTHJGY012OUJCYVBQQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJROGF0R0VrcGJzNGsyTy9GNEJvQkM0aWR3L2tUQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQnlOMzVRc2tJVAptVVYyTnQ1cWJlUmNKMTVqZW5FT08yOG0rUURpaGM2VWJUYzZoYXR0REUzSlpib01GZWpERHBhd3pLbitsVVNtCmhoYVhoMGt1Y29FSm43dGI5d21WR0pmN05ZYTMwYmlqQXdVRy8wa0srSUlCTXZrd0drdVBXMHZBd3l2aXZwSG4KbXRKY0J1NUdqYVBFWGk4SlI5MUdScjh4K2M5YStKQWVHMTdDTWVveTVLSEIvVjV5ZTVTMytkdEl4QU5GUzFsOApXWEFiejVvL2d1eVZNYzdnY2Rjc1NtSyttOHVYQWpjLzd6Y0xXYWovU25uY29BWndaS0ZJeFZJRlFpbXVyVGRPCk9qRmFYLytkTmtPc21jY3JCSXNUNmZxOWJjMDR1U2pCMmNFQlRlaXprZjJGMkFpeUZZdHZ1Vk5FTEZoZjI3cWwKQVBoM295RDdqaDRQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0Kserver: https://192.168.86.11:6443name: kubernetes
contexts: null
current-context: ""
kind: Config
preferences: {}
users:
- name: devuseruser:client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpRENDQW5DZ0F3SUJBZ0lVSFFYdERVb3NXdjcvM2xxMkt4cGxDZ3FZalVvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZURVRNQkVHQTFVRUF4TUthM1ZpWlhKdVpYUmxjekFlRncweU5UQTNNakV3TXpFMk1EQmFGdzB5TmpBMwpNakV3TXpFMk1EQmFNR1l4Q3pBSkJnTlZCQVlUQWtOT01SSXdFQVlEVlFRSUV3bERhRzl1WjFGcGJtY3hFakFRCkJnTlZCQWNUQ1VOb2IyNW5VV2x1WnpFTU1Bb0dBMVVFQ2hNRGF6aHpNUTh3RFFZRFZRUUxFd1pUZVhOMFpXMHgKRURBT0JnTlZCQU1UQjJSbGRuVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgpBUURFSk1mS2tnSnRpVFJJNmN5K3F4NllUNmhDSXlYR0VlK2Q5TSs0R1MwNERuQUgwM0Q3clE3VTVtbnlMa1ZiCjNoVjdKV1g3dDFYWENsNGt5bDFydVJIZ0QwMEJoU3JlaUwrNWk0c2VnVERGZVZBTHY2K0dXR0ozdmc5UWRkOUgKWTRUcmVSdzRqQ2FNVXNCUlg5azc1K2xLVW1GbjJ1T0gvOUlLYkt1dnZMNVdLNjhtRGtyODYwQ21WS2swa2VFMwpTK2ttS0dmUDQyRDF3TDA1U01CT0dpNS9IWU5rMnJLbWNhWG0zZ2hYeGlQNmhLOVR3Z0RhbURhMUhQN21LR21KCkluNFRqWmxCTnBJZGFtdmRmRlNRUW5oRWhqZCttS2RnbWwvbEVoSDNQOU1xSUkzT2d2VHFQV05VRFJiVGlDTGIKQTdHMVliSi9DbmFLNWs5NnlJQlFQYTJIQWdNQkFBR2pmekI5TUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVgpIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUlLd1lCQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFCkZnUVUwSk5VeDEzYlpVRmNWY1FiU2VFY3Z4NGNZZFF3SHdZRFZSMGpCQmd3Rm9BVVBHclJoSktXN09KTmp2eGUKQWFBUXVJbmNQNUV3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUErSUtKRFh1Yi9tNzZqdE9UYyttd0FoQ1ZMSgpEQmo2blFMWXY4UUlTOHpUR2wvVWlkNEtldHFSSmp0eGhBN3QyTUx5WnBqdHZ2T0d2QzM1SmFiek1VNnNhdGVpCjZTbmd4M3VBQWpqeVcvb0c4aHdmOWtuK01oVkFtNHlhVjZ4MUJuVzUwTHBHdTY3eFJvYStUcFphbmw3dXRvKy8KRVNjenUvS0lYaVZiSFo1eTZNMGxXdXQ0aHBGY05hbEhnRCt5UWw0RzM3aHYxbktHa2U5MGxHbmZjQzZUeW1YWAo1dE4wamh1RGcxZENCS2M2SnBWUmhZTktUOUQ1a3hzQXJIYThnazVGMlRmSFRhYm83SUFxKzZDdG5kMUhyYW5wCmQrbjRQOUpSNTNFdDRwMUxxRVJWOHZMUXdFMjhtRk91TCtLcFVzMWFKemd5TFRtdWxOUCtISkJadzZjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeENUSHlwSUNiWWswU09uTXZxc2VtRStvUWlNbHhoSHZuZlRQdUJrdE9BNXdCOU53Cis2ME8xT1pwOGk1Rlc5NFZleVZsKzdkVjF3cGVKTXBkYTdrUjRBOU5BWVVxM29pL3VZdUxIb0V3eFhsUUM3K3YKaGxoaWQ3NFBVSFhmUjJPRTYza2NPSXdtakZMQVVWL1pPK2ZwU2xKaFo5cmpoLy9TQ215cnI3eStWaXV2Smc1SwovT3RBcGxTcE5KSGhOMHZwSmlobnorTmc5Y0M5T1VqQVRob3VmeDJEWk5xeXBuR2w1dDRJVjhZaitvU3ZVOElBCjJwZzJ0UnorNWlocGlTSitFNDJaUVRhU0hXcHIzWHhVa0VKNFJJWTNmcGluWUpwZjVSSVI5ei9US2lDTnpvTDAKNmoxalZBMFcwNGdpMndPeHRXR3lmd3AyaXVaUGVzaUFVRDJ0aHdJREFRQUJBb0lCQVFDR2hIc0k4RTM5OVVVSQpaRi9vdTg3RndvdXdvQTQ5NHZza3AwcjJCVDQvM1pienB3MHJiYXBvVklXQWREOVpHOXc3a3BCNHEybVJpeWk1CnJwZVhVMXR4QU0xZEo0a1pDVXdENGpITS8ra0U1WWdDSnJvb051R0JJYlc3QnJ2VVorbzIyOTZBNFkxbVd6Sk8KSEtBTk42V0ZOUzVjWFlBQ08yNC9lL3ZiRUdTeER4eHRhS1RmbTFFWjRTR2NmZlpqVUFpSjBFWTlRWm43MTg0RgpNeDhSU2M1OFZ1ODhLSVp6UThCbFVuTzBGbVlmZnZ4cUtxVUo2ZEpjRkJHb0pPbmRyeGlLVlA2M1I3VHkzWXRYCnRrTXBXQ1JkdkdTSnJWcE9aU3d5bVFzWUNQN3c1eFp4RzZPMXIyNHA4SWdtNk9lSWdKL0ZUa1Fjc2VWMUdMK3EKVWl2QjRJRVJBb0dCQU5DRHNtdVBSNHR1bFF2SW0rM3g0Yk4yQ3BFUUNEWXhSeEl3cUZtR3pnT2p4TFhrVHJnRgpTMFRwUGpscC9tVmxidDVycytDVnN3b3gva0lDeHNsU012NHdRdVNMVE1mbktielI2TE1FOEpNYmtQMmpNTi8rCm9qaVNidDJMMUVQSDRQZ1A3dVppT2hvL21PMUk5SGp2TERwZmhKZUJ1b0VnTlpIb1lNMVR0NytyQW9HQkFQRFAKMzN6cDRvb0EwVThLRUtpQWR6c2lTZFVUMjRreHdTOHo5QUIxVEFKY0FWU0tvU3pQWFNhZ1QrUTNaQ1hZcitpZAo3TXlZZzlJdHQwZy8vWllKNDJhTGpyckt4TUZIRy9UaENDa2F6SlVyZ1ZuRG0vbDcxTFlnbG50MlFMN1hWRnJ6CnV2b0gwWUYxc3RabCtGYStpWGVrdENVbEs4Umt5ZGZKOWt2Ky9sMlZBb0dBYmx1bGpPUHlXOHVWT3YxYitkMngKTlFoZW8xUTI1R2ZFVTg1STY4azdOQlh6UU1tckdCNUZMaDI4Znlxb0tBWTlYWjduUHhBOENFTlpiSnFIbDNuWAozMHl2dXNJM1N2My95eDNWNlJuT01pMisyVjhMdVNITnZkOVNxaE1kcnhvVTZYV1ZYWDNUZnB6MlZXL3RaQ3hCCjNrczdvK3hYUjR4Q2pnek5YeDdWKzYwQ2dZQUR2b2V3RG9icU5HY012cEJSdm1XY01zVkpIZHpzL2l3Tnl0WUIKWjlGOXUrWjlaUVpxaHZMZzFkOUlJaUJaZ2t3QjV1cTJwNnh0Q1M3dlhhZFl2T0NmU0k0NGsweUo0TXdyZTVBLwo2MTNBK0FNejNSbkF3RThuWWN4Vk1ScUNuU0IvcFlpRHVMbG1OT2xKOGgzeFkxY0oyRExBM1JvWUhLVVN5TjRlCmdtRjhIUUtCZ0FEc2xIY1FiWnhZTWR1V3orZjZ6dU9ZVnpCRmhKcjREenVlQ1Q0eU9NS0RTNWlDZVJGSjVsVk0KK0hGSnA5d3pTbUVjcGZNUHUzNmpRamx4cHJWaXRQSEZXZGNTS3lyZG82QTJncnZ5akxJYnNuUVpETzJRQ1c4dgp6a1V1TUZGNy9raW9Hb2JHU2t6d3dsRVR3cDYvLzNqa24wUm5kN0VmTE9xSDJhd1BnRUY0Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

设置上下文参数,进而将集群和用户关联起来:

[root@master pki]# kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=dev \
--kubeconfig=devuser.kubeconfig
Context "kubernetes" created.## 命令说明:set-context kubernetes 为集群设置一个上下文的名字为kubernetes--cluster=kubernetes 指定集群的名称为kubernetes--user=devuser 指定当前的用户是devuser--namespace=dev 指定默认的命名空间为dev--kubeconfig=devuser.kubeconfig 将上下文信息保存在devuser.kubeconfig文件中# 设置好后再次查看上下文信息:
[root@master pki]# cat devuser.kubeconfig
apiVersion: v1
clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWmZZODFaNy9JdEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBM01Ea3dNalEwTWpGYUZ3MHpOVEEzTURjd01qUTVNakZhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUMxRGNCVUt3UjRnZXF2ZHNqbG16ekRjT09vQ1ZVRnlhb2dZZEZpOW1TOWtwbEc5WHJkVTlkQlJZTTYKS3dnRHgxQ3JUZnFsZGJVQituZnBEQmRQYWJscmxMUERnZlFzRmUyNDJqYXV1NmxJdURnRVlkSzNFZDRXa0JPdwpyYktYcEt1cWVYNlBNVTNpYnJnUWU1bVdtZnNycXhjWTBISUtySjQvZ1JQZytpa2FnMmJZMmpndlI0YmVsVkM1CnRtYk1rV3R0V0R5ZXp6R29VMWxHM05vd1pTd2VIcEYwVEJ4aVZyVkFQV0YyQXdiZGlEMWhpeFVnRHpFYisyZVoKbXBzOWVHQnJFRGJrTU51VGhISHQwUForVm45K3B5YzJ4Z2lCdDJORW1uNmFkSmZIaHdFa1YyMnhBYThjNmJrQgp3OUF6bHdpNjFhM1FGN2FoTHJGY012OUJCYVBQQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJROGF0R0VrcGJzNGsyTy9GNEJvQkM0aWR3L2tUQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQnlOMzVRc2tJVAptVVYyTnQ1cWJlUmNKMTVqZW5FT08yOG0rUURpaGM2VWJUYzZoYXR0REUzSlpib01GZWpERHBhd3pLbitsVVNtCmhoYVhoMGt1Y29FSm43dGI5d21WR0pmN05ZYTMwYmlqQXdVRy8wa0srSUlCTXZrd0drdVBXMHZBd3l2aXZwSG4KbXRKY0J1NUdqYVBFWGk4SlI5MUdScjh4K2M5YStKQWVHMTdDTWVveTVLSEIvVjV5ZTVTMytkdEl4QU5GUzFsOApXWEFiejVvL2d1eVZNYzdnY2Rjc1NtSyttOHVYQWpjLzd6Y0xXYWovU25uY29BWndaS0ZJeFZJRlFpbXVyVGRPCk9qRmFYLytkTmtPc21jY3JCSXNUNmZxOWJjMDR1U2pCMmNFQlRlaXprZjJGMkFpeUZZdHZ1Vk5FTEZoZjI3cWwKQVBoM295RDdqaDRQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0Kserver: https://192.168.86.11:6443name: kubernetes
contexts:
- context:cluster: kubernetesnamespace: devuser: devusername: kubernetes
current-context: ""
kind: Config
preferences: {}
users:
- name: devuseruser:client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpRENDQW5DZ0F3SUJBZ0lVSFFYdERVb3NXdjcvM2xxMkt4cGxDZ3FZalVvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZURVRNQkVHQTFVRUF4TUthM1ZpWlhKdVpYUmxjekFlRncweU5UQTNNakV3TXpFMk1EQmFGdzB5TmpBMwpNakV3TXpFMk1EQmFNR1l4Q3pBSkJnTlZCQVlUQWtOT01SSXdFQVlEVlFRSUV3bERhRzl1WjFGcGJtY3hFakFRCkJnTlZCQWNUQ1VOb2IyNW5VV2x1WnpFTU1Bb0dBMVVFQ2hNRGF6aHpNUTh3RFFZRFZRUUxFd1pUZVhOMFpXMHgKRURBT0JnTlZCQU1UQjJSbGRuVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgpBUURFSk1mS2tnSnRpVFJJNmN5K3F4NllUNmhDSXlYR0VlK2Q5TSs0R1MwNERuQUgwM0Q3clE3VTVtbnlMa1ZiCjNoVjdKV1g3dDFYWENsNGt5bDFydVJIZ0QwMEJoU3JlaUwrNWk0c2VnVERGZVZBTHY2K0dXR0ozdmc5UWRkOUgKWTRUcmVSdzRqQ2FNVXNCUlg5azc1K2xLVW1GbjJ1T0gvOUlLYkt1dnZMNVdLNjhtRGtyODYwQ21WS2swa2VFMwpTK2ttS0dmUDQyRDF3TDA1U01CT0dpNS9IWU5rMnJLbWNhWG0zZ2hYeGlQNmhLOVR3Z0RhbURhMUhQN21LR21KCkluNFRqWmxCTnBJZGFtdmRmRlNRUW5oRWhqZCttS2RnbWwvbEVoSDNQOU1xSUkzT2d2VHFQV05VRFJiVGlDTGIKQTdHMVliSi9DbmFLNWs5NnlJQlFQYTJIQWdNQkFBR2pmekI5TUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVgpIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUlLd1lCQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFCkZnUVUwSk5VeDEzYlpVRmNWY1FiU2VFY3Z4NGNZZFF3SHdZRFZSMGpCQmd3Rm9BVVBHclJoSktXN09KTmp2eGUKQWFBUXVJbmNQNUV3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUErSUtKRFh1Yi9tNzZqdE9UYyttd0FoQ1ZMSgpEQmo2blFMWXY4UUlTOHpUR2wvVWlkNEtldHFSSmp0eGhBN3QyTUx5WnBqdHZ2T0d2QzM1SmFiek1VNnNhdGVpCjZTbmd4M3VBQWpqeVcvb0c4aHdmOWtuK01oVkFtNHlhVjZ4MUJuVzUwTHBHdTY3eFJvYStUcFphbmw3dXRvKy8KRVNjenUvS0lYaVZiSFo1eTZNMGxXdXQ0aHBGY05hbEhnRCt5UWw0RzM3aHYxbktHa2U5MGxHbmZjQzZUeW1YWAo1dE4wamh1RGcxZENCS2M2SnBWUmhZTktUOUQ1a3hzQXJIYThnazVGMlRmSFRhYm83SUFxKzZDdG5kMUhyYW5wCmQrbjRQOUpSNTNFdDRwMUxxRVJWOHZMUXdFMjhtRk91TCtLcFVzMWFKemd5TFRtdWxOUCtISkJadzZjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeENUSHlwSUNiWWswU09uTXZxc2VtRStvUWlNbHhoSHZuZlRQdUJrdE9BNXdCOU53Cis2ME8xT1pwOGk1Rlc5NFZleVZsKzdkVjF3cGVKTXBkYTdrUjRBOU5BWVVxM29pL3VZdUxIb0V3eFhsUUM3K3YKaGxoaWQ3NFBVSFhmUjJPRTYza2NPSXdtakZMQVVWL1pPK2ZwU2xKaFo5cmpoLy9TQ215cnI3eStWaXV2Smc1SwovT3RBcGxTcE5KSGhOMHZwSmlobnorTmc5Y0M5T1VqQVRob3VmeDJEWk5xeXBuR2w1dDRJVjhZaitvU3ZVOElBCjJwZzJ0UnorNWlocGlTSitFNDJaUVRhU0hXcHIzWHhVa0VKNFJJWTNmcGluWUpwZjVSSVI5ei9US2lDTnpvTDAKNmoxalZBMFcwNGdpMndPeHRXR3lmd3AyaXVaUGVzaUFVRDJ0aHdJREFRQUJBb0lCQVFDR2hIc0k4RTM5OVVVSQpaRi9vdTg3RndvdXdvQTQ5NHZza3AwcjJCVDQvM1pienB3MHJiYXBvVklXQWREOVpHOXc3a3BCNHEybVJpeWk1CnJwZVhVMXR4QU0xZEo0a1pDVXdENGpITS8ra0U1WWdDSnJvb051R0JJYlc3QnJ2VVorbzIyOTZBNFkxbVd6Sk8KSEtBTk42V0ZOUzVjWFlBQ08yNC9lL3ZiRUdTeER4eHRhS1RmbTFFWjRTR2NmZlpqVUFpSjBFWTlRWm43MTg0RgpNeDhSU2M1OFZ1ODhLSVp6UThCbFVuTzBGbVlmZnZ4cUtxVUo2ZEpjRkJHb0pPbmRyeGlLVlA2M1I3VHkzWXRYCnRrTXBXQ1JkdkdTSnJWcE9aU3d5bVFzWUNQN3c1eFp4RzZPMXIyNHA4SWdtNk9lSWdKL0ZUa1Fjc2VWMUdMK3EKVWl2QjRJRVJBb0dCQU5DRHNtdVBSNHR1bFF2SW0rM3g0Yk4yQ3BFUUNEWXhSeEl3cUZtR3pnT2p4TFhrVHJnRgpTMFRwUGpscC9tVmxidDVycytDVnN3b3gva0lDeHNsU012NHdRdVNMVE1mbktielI2TE1FOEpNYmtQMmpNTi8rCm9qaVNidDJMMUVQSDRQZ1A3dVppT2hvL21PMUk5SGp2TERwZmhKZUJ1b0VnTlpIb1lNMVR0NytyQW9HQkFQRFAKMzN6cDRvb0EwVThLRUtpQWR6c2lTZFVUMjRreHdTOHo5QUIxVEFKY0FWU0tvU3pQWFNhZ1QrUTNaQ1hZcitpZAo3TXlZZzlJdHQwZy8vWllKNDJhTGpyckt4TUZIRy9UaENDa2F6SlVyZ1ZuRG0vbDcxTFlnbG50MlFMN1hWRnJ6CnV2b0gwWUYxc3RabCtGYStpWGVrdENVbEs4Umt5ZGZKOWt2Ky9sMlZBb0dBYmx1bGpPUHlXOHVWT3YxYitkMngKTlFoZW8xUTI1R2ZFVTg1STY4azdOQlh6UU1tckdCNUZMaDI4Znlxb0tBWTlYWjduUHhBOENFTlpiSnFIbDNuWAozMHl2dXNJM1N2My95eDNWNlJuT01pMisyVjhMdVNITnZkOVNxaE1kcnhvVTZYV1ZYWDNUZnB6MlZXL3RaQ3hCCjNrczdvK3hYUjR4Q2pnek5YeDdWKzYwQ2dZQUR2b2V3RG9icU5HY012cEJSdm1XY01zVkpIZHpzL2l3Tnl0WUIKWjlGOXUrWjlaUVpxaHZMZzFkOUlJaUJaZ2t3QjV1cTJwNnh0Q1M3dlhhZFl2T0NmU0k0NGsweUo0TXdyZTVBLwo2MTNBK0FNejNSbkF3RThuWWN4Vk1ScUNuU0IvcFlpRHVMbG1OT2xKOGgzeFkxY0oyRExBM1JvWUhLVVN5TjRlCmdtRjhIUUtCZ0FEc2xIY1FiWnhZTWR1V3orZjZ6dU9ZVnpCRmhKcjREenVlQ1Q0eU9NS0RTNWlDZVJGSjVsVk0KK0hGSnA5d3pTbUVjcGZNUHUzNmpRamx4cHJWaXRQSEZXZGNTS3lyZG82QTJncnZ5akxJYnNuUVpETzJRQ1c4dgp6a1V1TUZGNy9raW9Hb2JHU2t6d3dsRVR3cDYvLzNqa24wUm5kN0VmTE9xSDJhd1BnRUY0Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

2.2.4 权限绑定

  1. 创建一个名为 dev 的名称空间
  2. 在这个名称空间下再创建角色绑定
  3. 生成关于用户信息的内容
  4. 验证这个配置文件是否有效
# 首先创建一个名为 dev 的名称空间
[root@master pki]# kubectl create ns dev
namespace/dev created# 创建成功后在这个名称空间下再创建角色绑定
[root@master pki]# kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
rolebinding.rbac.authorization.k8s.io/devuser-admin-binding created
##命令说明:create rolebinding 创建角色绑定devuser-admin-binding 角色绑定的名字--clusterrole=admin 引用的是集群角色admin--user=devuser 绑定给devuser用户--namespace=dev 绑定在dev名字空间里# 生成关于用户信息的内容:
[root@master pki]# kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
Switched to context "kubernetes".##命令说明:config use-context kubernetes 使用kubernetes这个上下文--kubeconfig=devuser.kubeconfig 指定使用devuser.kubeconfig文件

以上自定义的管理配置文件就已经完成

  • 验证这个配置文件是否有效
# 将当前默认正在使用的家目录下的.kube 目录下的config文件移到root目录下
[root@master ~]# mv /root/.kube/config /root/# 将 /etc/kubernetes/pki/devuser.kubeconfig 复制到 /root/.kube/ 目录下,并更名为config文件
[root@master pki]# cp -a /etc/kubernetes/pki/devuser.kubeconfig /root/.kube/config
[root@master pki]# kubectl create deployment dev-deploy --image=harbor.registry.com/library/myapp:1.0 --replicas=5
deployment.apps/dev-deploy created# 复制成功后查看 Pod 信息
[root@master pki]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
dev-deploy-75cd84d958-6jvbn   1/1     Running   0          11s
dev-deploy-75cd84d958-8lrb6   1/1     Running   0          11s
dev-deploy-75cd84d958-n4hwm   1/1     Running   0          11s
dev-deploy-75cd84d958-r2sg7   1/1     Running   0          11s
dev-deploy-75cd84d958-rcfwf   1/1     Running   0          11s
[root@master pki]# kubectl get pod -n dev
NAME                          READY   STATUS    RESTARTS   AGE
dev-deploy-75cd84d958-6jvbn   1/1     Running   0          16s
dev-deploy-75cd84d958-8lrb6   1/1     Running   0          16s
dev-deploy-75cd84d958-n4hwm   1/1     Running   0          16s
dev-deploy-75cd84d958-r2sg7   1/1     Running   0          16s
dev-deploy-75cd84d958-rcfwf   1/1     Running   0          16s
# 命令可以正常执行,但是没有查到任何信息

devuser 用户登录后就默认能够使用自己的 devuser.kubeconfig 文件:

  • 改回来
[root@master ~]# ls
4  5  6  7  8  config
[root@master ~]# mv config .kube/
mv: overwrite '.kube/config'? yes
[root@master ~]# ls /root/.kube/
cache  config

三、准入控制(检查请求中到达的数据,以修改资源)

准入控制是 API Server 的插件集合,通过添加不同的插件,实现额外的准入控制规则。甚至于 API Server 的一些主要的功能都需要通过 Admission Controllers 实现

列举几个插件的功能:

  • NamespaceLifecycle:防止在不存在的 namespace 上创建对象,防止删除系统预置
  • namespace,删除 namespace 时,连带删除它的所有资源对象
  • LimitRanger:确保请求的资源不会超过资源所在 Namespace 的 LimitRange 的限制
  • ServiceAccount:实现了自动化添加 ServiceAccount
  • ResourceQuota:确保请求的资源不会超过资源的 ResourceQuota 限制

除了对对象进行变更外,准入控制器还可能有其它副作用:相关资源作为请求处理的一部分进行变更

增加配额用量就是一个典型的示例,说明了这样做的必要性。 此类用法都需要相应的回收或回调过程,因为任一准入控制器都无法确定某个请求能否通过所有其它准入控制器,调用的顺序如下:
在这里插入图片描述

  • 启用一个准入控制器:
# Kubernetes API 服务器的 enable-admission-plugins 标志接受一个(以逗号分隔的)准入控制插件列表, 这些插件会在集群修改对象之前被调用
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
  • 关闭准入控制器
# Kubernetes API 服务器的 disable-admission-plugins 标志,会将传入的(以逗号分隔的) 准入控制插件列表禁用,即使是默认启用的插件也会被禁用
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...
  • 查看哪些插件是被启用的
kube-apiserver -h | grep enable-admission-plugins
http://www.dtcms.com/a/446158.html

相关文章:

  • 建站行业的发展趋势网站建设网络
  • AI大事记9:从 AlexNet 到 ChatGPT——深度学习的十年跃迁(下)
  • 网站收录了但是搜索不到全网霸屏推广系统
  • 张量分解 | CP / Tucker / BTD
  • 网站推广及建设ppt河北网站建设企业
  • 【数据结构】二叉搜索树的递归与非递归实现
  • 九亭镇村镇建设办官方网站1688接代加工订单
  • GJOI 9.27/10.3 题解
  • Python实例入门
  • 多线程核心知识点与高并发应用指南
  • 南宁网站建设nnxun政策变了2022二建有必要考吗
  • ASP3605电源芯片关键指标测试说明
  • Spring——事件机制
  • UMI企业智脑4.0与5.0的先进性之争,从“AI工具”到“孪生数字人”,赋能每个员工
  • 城乡建设查询网站网站维护包括
  • 从国标到自动化:VSTO实现身份证智能解析(待测)
  • 租凭境外服务器做违规网站wordpress 幻灯片主题
  • 网站开发团队简介如何写链接网站制作
  • php 8.4.5 更新日志
  • MongoDB 连接时的**认证参数配置错误**
  • 大兴安岭做网站葫芦岛建设工程信息网站
  • 商标设计网站提供哪些服务建筑书店
  • 除 OpenAI/GPT-4o 等主流头部产品外,值得关注的 AI 及 Agent 产品有哪些?
  • Vue 3 —— M / 接口文档
  • 【办公类-109-06】20250916圆牌卡片15CM手工纸+动物头像+拼音表+word单面编辑
  • 服务器搭建网站制作网站怎么用图片做背景
  • 搭建网站空间无印良品vi设计分析
  • 做pc端网站资讯seo诊断工具有哪些
  • 高层次综合基础-vivado hls第三章
  • 网站建设单位不给数据库苏州网络公司工作室