具体流程如下:
Authentication(认证)
认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。
通常启用X509 Client Certs和Service Accout Tokens两种认证方式。
Kubernetes集群有两类用户:由Kubernetes管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。
k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。
Authorization(授权)
必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。
授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC。
Admission Control(准入控制)
用于拦截请求的一种方式,运行在认证、授权之后,是权限认证链上的最后一环,对请求API资源对象进行修改和校验。
访问k8s的API Server的客户端主要分为两类:
kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。
pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。
如果将一个镜像放入私有仓库内,那么拉取镜像就会失败,为了解决这个问题可以用命令创建一个secret,其中指定了仓库的名字和账号密码,然后我们编写yaml文件,在其中写入secret,包括了仓库的名字和账号密码,这样就可以拉取镜像。但是我们将账号密码写入yaml文件中就会有安全风险,该如何解决这个问题?
创建一个服务账户ServiceAccount,它会用户自动生成认证信息,但是没有进行授权
使用此命令将secrets添加到admin服务账户内
kubectl patch serviceaccount admin -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
可以看到myregistrykey已经和admin绑定成功,如果现在有pod使用admin服务账户就可以调用myregistrykey,但无法破解其真实密码。
编辑文件
[root@server2 configmap]# cat registry.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: reg.westos.org/westos/game2048:latest 拉取镜像
serviceAccountName: admin 使用admin这个sa
应用文件创建pod成功
应该要注意的是,在yaml文件里使用sa添加认证信息,要比在yaml文件里让pod直接指定imagePullSecrets安全的多。
kubectl get pod mypod -o yaml 查看mypod这个pod的yaml信息
可以看到,mypod在创建时调用了admin的sa
创建test用户,进入/etc/kubernetes/pki/目录
openssl genrsa -out test.key 2048 创建认证密钥
openssl req -new -key test.key -out test.csr -subj "/CN=test" 提交证书申请请求
openssl x509 -req -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out test.crt -days 365 生成x509证书
openssl x509 -in test.crt -text -noout 查看证书
test.key:认证密钥
test.csr:证书申请请求
test.vrt:证书
kubectl config set-credentials test --client-certificate=/etc/kubernetes/pki/test.crt --client-key=/etc/kubernetes/pki/test.key --embed-certs=true 为test用户添加认证
kubectl config view 查看配置
当前使用的是admin账户,需要切换
kubectl config set-context test@kubernetes --cluster=kubernetes --user=test 创建test UserAccount
kubectl config use-context test@kubernetes 切换到test用户
切换成功,但是因为test是普通用户并且没有设置任何权限,所以无法查看pod
切换回admin超户,进行授权
RBAC(Role Based Access Control):基于角色访问控制授权。
允许管理员通过Kubernetes API动态配置授权策略。RBAC就是用户通过角色与权限进行关联。
RBAC只有授权,没有拒绝授权,所以只需要定义允许该用户做什么即可。
RBAC包括四种类型:Role、ClusterRole、RoleBinding、ClusterRoleBinding。
(1)Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
(2)Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
(3)RoleBinding:定义了“被作用者”和“角色”的绑定关系。
RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role。
RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。
创建一个目录,编辑文件
[root@server2 ~]# mkdir roles
[root@server2 ~]# cd roles/
[root@server2 roles]# vim role.yaml
[root@server2 roles]# cat role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: myrole
rules:
- apiGroups: [""]
resources: ["pods"] 可以对pod进行操作
verbs: ["get", "watch", "list", "create", "update", "patch", "delete"] 可以执行的操作种类
[root@server2 roles]#
创建该角色,发现我们允许执行的操作种类已经写入
编写另一个文件
[root@server2 roles]# vim rolebinding.yaml
[root@server2 roles]# cat rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-read-pods
namespace: default 授权作用与default这个命名空间内
subjects:
- kind: User
name: test 授权对象是test用户
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role 授权角色是myrole 其中myrole已经列出了可以执行的操作
name: myrole
apiGroup: rbac.authorization.k8s.io
[root@server2 roles]#
应用rolebinding.yaml文件发现用户test已经和角色myrole绑定,subjects是被作用者,而Role则是作用者
切换回test用户,可以执行pod命令,但是查看其他ns的pod被拒绝,这是因为默认查看pod属于ns中的default,查看别的ns则还需要集群角色授权。查看default中的控制器也被拒绝了,这是因为只授权了pod,没有授权deployment
所有ns
创建集群角色ClusterRole
编辑文件
[root@server2 roles]# vim clusterrole.yaml
[root@server2 roles]# cat clusterrole.yaml
kind: ClusterRole 集群角色
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: myclusterrole
rules:
- apiGroups: [""]
resources: ["pods"] 对pod可以操作
verbs: ["get", "watch", "list", "delete", "create", "update"] 可以操作的种类
- apiGroups: ["extensions", "apps"]
resources: ["deployments"] 对deployments控制器可以操作
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 可以操作的种类
切换回超级用户,查看clusterrole,我们的集群角色myclusterrole已经添加成功
编辑文件
[root@server2 roles]# vim rolebinding.yaml
[root@server2 roles]# cat rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-read-pods
namespace: default
subjects:
- kind: User
name: test
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: myrole
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rolebind-myclusterrole
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole 角色来源为Clusterrole
name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User 作用对象是test
name: test
切换到test用户,可以对pod和deployments控制器进行操作
集群角色也有集群绑定方法,可以作用所有ns
编辑文件
[root@server2 roles]# cat clusterbinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding 集群绑定
metadata:
name: clusterrolebinding-myclusterrole
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: test
在超级用户下应用该文件,可以看到clusterbinding集群绑定成功
应用后切换到test用户,可以作用其他ns
如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为 default。
保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的 ImagePullSecrets 信息添加到 pod 中。
将一个包含用于 API 访问的 token 的 volume 添加到 pod 中。
将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到 pod 下的每个容器中。
检测服务账户的创建,并且创建相应的 Secret 以支持 API 访问。
检测服务账户的删除,并且删除所有相应的服务账户 Token Secret。
检测 Secret 的增加,保证相应的服务账户存在,如有需要,为 Secret 增加 token。
检测 Secret 的删除,如有需要,从相应的服务账户中移除引用。
服务账户管理器管理各命名空间下的服务账户,并且保证每个活跃的命名空间下存在一个名为 “default” 的服务账户
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停
文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象