赞
踩
大纲
K8S中有两种用户
K8S不存储用户信息,用户的创建管理都无需与K8S API交互,但K8S接收API请求时是需要知道发出请求的用户信息的。
所有对K8S的API请求都需要绑定身份信息(User或者ServiceAccount)
User&ServiceAccount的区别:
例如我们创建一个名叫jim的用户
首先需要为此用户创建一个私钥
openssl genrsa -out jim.key 2048
使用此私钥创建一个csr文件(证书签名请求),在subject里带上用户信息(CN为用户名,O为用户组)
openssl req -new -key jim.key -out jim.csr -subj "/CN=jim/O=MGM"
可能会出现如下异常
140587201880512:error:2406F079:random number
generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd
执行以下命令 解决异常
cd /root
openssl rand -writerand .rnd
使用kubernetes集群CA证书签署用户的的证书
openssl x509 -req -in jim.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out jim.crt -days 365
k8s安装完成后证书秘钥相关的资源都保存在 /etc/kubernetes/pki 文件夹下
这样就完成了用户的创建,注意保存证书(jim.crt)和私钥(jim.key),后面会用
可见创建一个用户是完全独立于k8s集群的,没有使用任何的k8s api
k8s是基于RBAC(Role-Based Access Control)角色实现访问控制
官方资料: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/
主要涉及4个Kind
Role 或 ClusterRole 中包含一组代表相关权限的规则
Role是用来在某个名字空间内设置访问权限。所以创建 Role 时必须指定该 Role 所属的名字空间。
ClusterRole 则是一个集群作用域的资源。
这两种资源的名字不同(Role 和 ClusterRole) 是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具
说白了Role 只能访问所属名字空间的资源,ClusterRole可以访问所以名字空间的资源
比如,你可以使用 ClusterRole 来允许某特定用户执行
kubectl get pods --all-namespaces
kubectl get pods -n 【指定命名空间】
Role的配置yaml文件如下:
apiVersion: rbac.authorization.k8s.io/v1
# 指定类型为Role
kind: Role
metadata:
namespace: team2
name: team2-role
rules:
- apiGroups: ["","apps"] # "" 标明 core API 组 如果要访问deployment 需要加入"apps"
#resources指定此角色可以访问操作那些资源 *代表所有 这里配置只能操作pods
resources: ["pods"]
#verbs指资源的具体操作的类型例如 create get delete list update edit watch exec *代表所有
verbs: ["get", "watch", "list"]
apiGroups配置项说明:
注意创建Role前 确保已存在对应的namespace
kubectl create namespace team2
kubectl apply -f team2-role.yaml 创建角色
这样就完成了角色的创建
ClusterRole的配置yaml文件如下:
apiVersion: rbac.authorization.k8s.io/v1
# 指定类型为ClusterRole
kind: ClusterRole
metadata:
# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
name: manger-cluster-role
rules:
- apiGroups: ["","apps"] "" 标明 core API 组
#resources指定此角色可以访问操作那些资源 *代表所有 这里配置只能操作secrets
resources: ["secrets"]
#verbs指资源的具体操作的类型例如 create get delete list update edit watch exec *代表所有
verbs: ["get", "watch", "list"]
这样就完成了ClusterRole的创建
角色绑定(RoleBinding & ClusterRoleBinding)是将角色中定义的权限赋予一个或者一组用户。
RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。
RoleBinding可以引用同一的名字空间中的任何Role也可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间。(RoleBinding 可以绑定 Role 和 ClusterRole)
如果希望将某 ClusterRole 绑定到集群中所有名字空间,你要使用 ClusterRoleBinding。
RoleBinding的配置yaml文件如下
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jim" 操作 "team2" 名字空间中的所有资源
# 需要在该命名空间中有一个名为 “team2-role” 的 Role
kind: RoleBinding
metadata:
name: team2-role-binding
namespace: team2
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: User
name: jim # "name" 是区分大小写的
apiGroup: ""
roleRef:
# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: Role # 此字段必须是 Role 或 ClusterRole
name: team2-role # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: ""
这样就完成了用户的与角色的绑定
到此k8s中已经存在一个jim用户可以访问资源了,接下来就是去配置kubeconfig
kubeconfig是一个配置文件,用于配置kubectl命令能够访问的k8s集群,是谁在访问集群,以及当前访问的上下文
可以简单把kubectl命令看做是一个浏览器,要访问一个网站(k8s集群)必须知道网站的IP地址,登录此网站的用户信息,以及保存当前登录的一些session cookie
kubeconfig中主要由如下部分组成:
使用 kubectl config view 命令可以看到
kubectl config view
k8s master初始化完成后 也会提醒把创建好的 admin.conf 放置到 $HOME/.kube下,才能正常使用kubectl命令
kubeconfig配置文件中一个重要的配置项就是clusters
如果把kubectl看做是浏览器,那么clusters配置更像是浏览器本地DNS缓存。
浏览器根据DNS获取网站的IP,clusters告诉kubectl可以访问的远端k8s集群的ip,以及访问时需要携带的证书
kubeconfig配置文件另一个重要的配置项就是users,user提供的就是登录远程k8s集群时使用的账号密码
这里的账号必须是所登录的k8s集群中存在的用户,同时密码就是所登录的k8s集群中的根证书颁发的证书(后面的创建用户会详细说明)
context 保存的是users和clusters的对应关系,选择了上下文即选择了以某个用户去访问某个集群
kubectl config -h 查看config的帮助文档
可以使用–kubeconfig来实现操作哪个kubeconfig配置文件
例如在指定的配置文件/ops/k8s/config/myconfig 中创建一个集群
kubectl config set-cluster development --server=https://192.168.0.110 --kubeconfig=/ops/k8s/config/myconfig
可以使用 set命令来修改或新建单独的一个配置属性
例如把刚才创建的集群中server的配置修改一下ip地址
kubectl config set clusters.development.server http://5.6.7.8 --kubeconfig=/ops/k8s/config/myconfig
其他命令说明
创建集群配置集群访问证书
kubectl config set-cluster k8s-test-cluster --server=https://192.168.0.160:6443 --embed-certs --certificate-authority=/medcrab/data/ca.crt
创建用户
kubectl config set-credentials jim --client-certificate=/medcrab/data/jim.crt --client-key=/medcrab/data/jim.key
创建上下文
kubectl config set-context jim@k8s-test-cluster --cluster=k8s-test-cluster --namespace=team2 --user=jim
指定上下文开始使用
kubectl get pods --context=jim@k8s-test-cluster
需求:
指定liuyijiang这个用户使用跳板机操作k8s集群dev名字空间中一些项目部署的资源 例如pod replicationcontroller service deployment
涉及在两台机器上操作
由于k8s集群证书在master机器上(签署用户证书的时候需要使用),所以先登录master机器 创建用户
mkdir -p /ops/k8s/user/liuyijiang
openssl genrsa -out liuyijiang.key 2048
openssl req -new -key liuyijiang.key -out liuyijiang.csr -subj "/CN=liuyijiang/O=DEV"
openssl x509 -req -in liuyijiang.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out liuyijiang.crt -days 365
产出物:
liuyijiang.crt liuyijiang.key 已经k8s集群证书 /etc/kubernetes/pki/ca.crt 这三个保存一下后面需要使用
创建demo.yaml文件用于创建命名空间 角色 角色绑定三个资源,此步骤也在k8s master机器上执行
demo.yaml内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
user: liuyijiang
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: devops-role
rules:
- apiGroups: ["","apps","batch","autoscaling"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devops-role-binding
namespace: dev
subjects:
- kind: User
name: liuyijiang
apiGroup: ""
roleRef:
kind: Role
name: devops-role
apiGroup: ""
执行命令 kubectl apply -f demo.yaml
由于需要实现跳板机操作k8s集群,所以这一步在跳板机上操作 跳板机ip:192.168.0.211
在跳板机上找一个文件夹,把step1中生产的liuyijiang.crt liuyijiang.key 以及k8s集群证书都保存到这里
然后开始配置kubeconfig
创建集群
kubectl config set-cluster dev-cluster --server=https://192.168.0.160:6443 --embed-certs --certificate-authority=/data/liuyijiang/ca.crt
创建用户
kubectl config set-credentials liuyijiang --client-certificate=/data/liuyijiang/liuyijiang.crt --client-key=/data/liuyijiang/liuyijiang.key
创建上下文
kubectl config set-context liuyijiang@dev-cluster --cluster=dev-cluster --namespace=dev --user=liuyijiang
这样kubeconfig配置完成可以开始使用kubectl 操作集群了
指定上下文开始使用
kubectl get pods --context=liuyijiang@dev-cluster
配置一下当前kubectl 命令的上下文
kubectl config use-context liuyijiang@dev-cluster
kubectl config current-context liuyijiang@dev-cluster
kubectl config get-contexts liuyijiang@dev-cluster
创建一个Pod
kubectl run myhttpservice --image=luksa/kubia --port=8080 --generator=run/v1
创建service
kubectl expose rc myhttpservice --type=NodePort --port 8080
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。