首页 > 技术文章 > CKA-Kubernets(K8s) (三)

Cong0ks 2021-03-25 17:04 原文

服务的发布
 
所谓发布指的是,如何让集群之外的主机访问服务
NodePort
LoadBalancer
ClusterIP
ingress -- 推荐

 

 

 

target-port 容器这边的端口
 
NodePort 把容器端口映射到外部物理机端口
 
方式一:
kubectl expose --name <SVC_NAME> pod <POD_NAME> --port=<svc的端口> --target-port=<pod的端口>

 

 

用edit方式修改 把type=ClusterIP type=NodePort

 

# 修改完成后,会发现svc产生了一个随机“外网”端口,尝试用外网主机访问这个随机端口31853

 

 

 

# 找一台非集群内主机,访问master"外网"IP地址

 

 

 

 

方式二:直接加上NodePort参数

 

 

还可以使用edit,修改NodePort分配的端口,但是端口区间只能用 30000-32767

NodePort存在缺陷:在有大量pod得到情况下,需要开放大量的物理机(NodePort),不方便管理和存在安全隐患

 

  

LoadBalancer

https://metallb.universe.tf/

# 首先准备yaml文件(建议直接复制地址把yaml内容复制单独粘贴到服务器上)
kubectl apply -f

https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: metallb-system
  labels:
    app: metallb
 
# 执行这个文件

 

 

 

 

# 并看到已经创建了一个namespace
开始创建secret
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

  

# 查看已经生成的secret

 

 

 

# 准备第二个yaml文件,并且查看所需镜像
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml

  

# 自己提前下载好镜像,并且修改镜像下载策略
sudo docker pull metallb/speaker:v0.9.5
sudo docker pull metallb/controller:v0.9.5

  

# 修改策略后,执行 kubectl apply -f metallb.yaml

  

#创建地址池yaml文件 -- pool1.yaml
#去官网复制模板 https://metallb.universe.tf/configuration/#layer-2-configuration
# 配置地址池
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250  # 修改为你自己的网段

  

# 从刚刚定义的IP池里面,获取到一个地址

   

# 连续申请地址,IP顺序递增

  

LoadBalancer 问题:
1. 造价比较高
2. 很难申请到地址段

 

ingress-- 推荐
官网地址:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/

 

 

 

 

 

 

NGINX主页存放目录: /usr/share/nginx/html/index.html
 
提前准备镜像,每个需要得worker节点导入下面镜像:
# 镜像下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-
controller:0.21.0
#
wget https://raw.githubusercontent.com/kubernetes/ingress-
nginx/master/deploy/mandatory.yaml
 
# ingress 0.21 yaml
https://github.com/kubernetes/ingress-nginx/releases/tag/nginx-0.21.0
 
# 导出下载好的镜像,scp给其他节点
sudo docker save -o nginx-ingress-controller.tar registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.21.0

 

# 官方已经推荐使用helm进行安装 ,稍后研究
https://github.com/kubernetes/ingress-nginx/releases/tag/helm-chart-3.24.0

 

 

 

# 导入老师的镜像后,包含3个images

 

 

 

# 部署后检查是否运行,并且查看是在哪个节点,这里是vm3节点

 

 

 

# 复制官方文档的规则模板
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/#the-ingress-resource

 

# 官方ingress 模板

 

 

 

# 开启2个ClusterIP的svc

 

 

 

 

 

 

 

 

 

# 开始修改规则,对外发布一个域名,并且不同的网站路径访问不同的svcIP

 

 

 

# 修改nginx页面内容,方便区分

 

 

 

# 应用规则

 

 

 

# 查看刚刚创建的ingress 简写为ing

 

 

 

# 在测试机vm4上,开始修改hosts(由于没有dns

 

 

 

# 设置完毕后,开始验证。通过访问不同的路径出现了不同的svc回应

 

 

 

 网络

  

1. 了解下calico网络
2. 网络策略

# 准备工作,确认配置了docker加速器

 

# 演示 2台 docker节点,实现跨节点通讯,通过calico跨节点通信
# Node:注意用docker,而非docker-ce,不然没有/etc/sysconfig/docker文件
 
# 不在k8s 节点上,单独重新弄2个docker环境
vm5        vm6
 
ETCD 相关

2个节点安装好ETCD,对etcd配置文件进行设置
[loki@vm5 ~]$ cat /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/cluster.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.27.220:2380,http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.27.220:2379,http://localhost:2379"
ETCD_NAME="etcd-220"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.220:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379,http://192.168.27.220:2379"
ETCD_INITIAL_CLUSTER="etcd-220=http://192.168.27.220:2380,etcd-221=http://192.168.27.221:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

 

[loki@vm6 ~]$ cat /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/cluster.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.27.221:2380,http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.27.221:2379,http://localhost:2379"
ETCD_NAME="etcd-221"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.221:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379,http://192.168.27.221:2379"
ETCD_INITIAL_CLUSTER="etcd-220=http://192.168.27.220:2380,etcd-221=http://192.168.27.221:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

# 两边配置好后,重启服务systemctl restart etcd

# 检查etcd集群情况

 

 

修改2台docker属性:(两边都要修改)

--cluster-store=etcd://192.168.27.220:2379

--cluster-store=etcd://192.168.27.221:2379

 

 

 

# 配置加速器,并启动docker

配置docker加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1vs5nfat.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

 

 

Calico网络 相关

# 最新版本已经是 v3版本的需要配置https和证书

# calico下载地址

https://github.com/projectcalico/calicoctl/tags

这里实验使用的是v2.6.12

# 相关组件介绍

https://docs.projectcalico.org/archive/v2.6/releases/

# 相关镜像包

https://github.com/projectcalico/calico/releases/tag/v2.6.12

 

# calicoctl版本  v1.6.5

 

# 创建calico 相关配置文件

sudo tee  /etc/calico/calicoctl.cfg <<-'EOF'
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://192.168.27.220:2379"
EOF
sudo tee  /etc/calico/calicoctl.cfg <<-'EOF'
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://192.168.27.221:2379"
EOF

 

 # 解压下载的包到/etc/calico/calico_package (这个目录自己创建)

然后把calicoctl做下软连接

sudo ln -s /etc/calico/calico_package/release-v2.6.12/bin/calicoctl /bin/calicoctl  # 为了sudo 后也能用

sudo ln -s /etc/calico/calico_package/release-v2.6.12/bin/calicoctl /usr/local/bin/calicoctl

导入镜像包到docker cd /etc/calico/calico_package/image

 # 导入calico-node的tar包

 

 

# 在2个节点上执行 

sudo calicoctl node run --node-image=calico/node:v2.6.12 -c /etc/calico/calicoctl.cfg

 

# 查看2个节点状态,都可以看到对方主机信息

 

 

 

# 现在开始在任意主机上创建网络(可以同步给远端)

docker network create --driver calico --ipam-driver calico-ipam calnet1

--driver calico 指定使用 calico 的 libnetwork CNM driver。
--ipam-driver calico-ipam 指定使用 calico 的 IPAM driver 管理 IP。

calnet1   网络名可以自定义

calico 为 global 网络,etcd 会将 calnet1 同步到所有主机。

 

# 验证是否创建成功

 

 

每在主机上创建一个容器,则会在物理机上创建一张虚拟网卡:

 

 

 # 下面是还没有创建容器时,物理机的网卡信息如下:

 

在vm5上创建一个容器:

docker run --name c220 --net calnet1 -itd busybox

 

 

 

绑定关系有问题,后续再进行一次实验!!!

 

 

 网络策略

 

 
# 三种策略方式
ipBlock                           # 基于ip来进行策略限制
namespaceSelector       # 基于名称空间或标签
podSelector                   # 基于
 

关于NetworkPolicy 资源的模板

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress                        # 策略方向,Ingress 针对进
  - Egress                         # 策略方向,Egress  针对出
  ingress:
  - from:
    - ipBlock:                       # 基于ip地址的策略
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:             # 基于名称空间的策略
        matchLabels:
          project: myproject
    - podSelector:                   # 基于标签名的策略
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Note:说明: 除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果

目前已知calico,是支持网络策略的

 

 

 # 首先,生产2个测试pod1和pod2,修改首页内容为111,222

 

 # 接着,再创建一个临时pod

kubectl run <POD_NAME> --rm -it --image=<IMAGE_NAME> --image-pull-policy=IfNotPresent -- <COMMAND>

 

# 生成2个svc服务

kubectl expose --name=<SVC_NAME> pod <POD_NAME> --port=<PORT_NUMBER> --type=<TYPE_VALUES>

 

   

 # 查看pod的标签

 

ingress例子:

 

通过Pod的标签来进行限制 -- podSelector

# 根据官方的模板修改一个。功能: 仅允许含有role: frontend标签的pod访问(in)80端口

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: mypolicy1
  namespace: 12-net
spec:
  podSelector:
    matchLabels:
      run: pod1                # 针对哪个标签的pod上生效,从这个标签来看是针对pod1
  policyTypes:
  - Ingress
#   - Egress
  ingress:
  - from:
#    - ipBlock:
#        cidr: 172.17.0.0/16
#        except:
#        - 172.17.1.0/24
#    - namespaceSelector:
#        matchLabels:
#          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 80
#  egress:
#  - to:
#    - ipBlock:
#        cidr: 10.0.0.0/24
#    ports:
#    - protocol: TCP

# 查看策略   kubectl get networkpolicies

 

 

# 策略生效前,我们用测试主机访问pod1的结果如下:

 

# 策略生效后,我们用测试主机访问pod1的结果如下: (已经被拒绝访问,hold住了~)

 

# 这个时候如果还想在策略生效的情况下访问到,需要增加标签到这个测试容器

  

通过名称空间的标签来进行限制 -- namespaceSelector

# 还是首先来修改模板文件,功能:只有指定的名称空间带有标签 project: myproject 才可以访问端口 80

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: t2
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
#  - Egress
  ingress:
  - from:
#    - ipBlock:
#        cidr: 172.17.0.0/16
#        except:
#        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
#    - podSelector:
#        matchLabels:
#          role: frontend
    ports:
    - protocol: TCP
      port: 80
#  egress:
#  - to:
#    - ipBlock:
#        cidr: 10.0.0.0/24
#    ports:
#    - protocol: TCP
#      port: 5978

 

# 还是继续沿用之前的测试机,在策略应用以后:

 

 # 这个时候我们把策略允许的名称空间标签加入到当前名称空间

# 删除标签,使用下面的方法 

 

Note: 如果注释名称空间下面的标签,表示所有标签都可以访问,设置了一个标签表示仅有一个标签可以访问

 

 

 Note: 还可以修改配合使用,允许任何名称空间下面(因为没有指定名称空间的标签),pod带有role: frontend标签的pod访问。但是,要注意配合使用的时候的缩进格式

也可以使用下面这种非常严格区分的方式,必须名称空间含有project: myproject标签,并且pod也必须要role: frontend标签

 

 

 通过IP来进行限制 -- namespaceSelector

 # 修改模板内容,功能:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: c3
#  namespace: default
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
#  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.0/16      # 允许这个网段的访问(可以写多行)
except: # - 10.244.185.194/32 # 除这IP以外 # - namespaceSelector: # matchLabels: # project: myproject # - podSelector: # matchLabels: # role: frontend ports: - protocol: TCP port: 80 # egress: # - to: # - ipBlock: # cidr: 10.0.0.0/24 # ports: # - protocol: TCP

 

egress例子: 

# 仅允许pod1 访问pod2的 TCP80 UDP 53(用于解析DNS)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: c4
#  namespace: default
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.0/16
        cidr: 192.168.27.0/24
        except:
    ports:
    - protocol: TCP
      port: 80
  egress:   
  - to:
    - podSelector:
        matchLabels:
          run: pod2
    ports:
    - protocol: TCP
      port: 80
    - protocol: UDP
      port: 53

 

 

 

# 默认拒绝所有的策略

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress

 

# 默认允许所有的策略

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

 

 

helm

 

 

# helm 下载地址
https://github.com/helm/helm/releases

 

# 最新版本直接就是二进制文件,下载后直接可以使用
https://helm.sh/docs/intro/install/
  1. Download your desired version
  2. Unpack it (tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  3. Find the helm binary in the unpacked directory, and move it to its desired destination (mv linux-amd64/helm /usr/local/bin/helm)

# 为helm添加源

helm repo add ali https://apphub.aliyuncs.com

helm repo add azure htp://miror.azure.cn/kubernetes/charts/

# 查看添加和删除的源   helm repo list   OR   helm repo remove <REPO_NAME>

 

 

# 搜索MYSQL 的chart      helm search repo mysql 

 

# 下载一个Chart包到本地    helm pull azure/mysql --version=1.6.9    Note: 这里的版本是Chart版本,而非应用(数据库)的版本

# 下载的Chart-- mysql 目录结构

 

  

 # values.yaml  基础环境的一些常用修改

# MySQL ROOT用户密码

 

# 动态扩容卷

 

  

# 开始创建    helm install <Name> <Chart_PATH>

 

 # 创建成功后查询

  

# 自动帮我们完成了svc,pod,secrets,deploy等

 

 # 删除helm     helm delete <HELM_NAME>

   

 

安全管理

 k8s认证的方式常用的有种方式

方法零:base authentication (1.19之前,不包括1.19的一种认证方式)  # 通过用户名和密码的方式

:: 使用 用户名和密码的方式登录

  # 创建账号密码文件存放于 /etc/kubernetes/pki/info.csv,内容如下:  密码,用户名,UID

pwd1,loki,1
pwd1,feel,2
pwd1,hope,3

  # 修改api调用参数  /etc/kubernetes/manifests/kube-apiserver.yaml

- --basic-auth-file=/etc/kubernetes/pki/info.csv

# 创建集群角色绑定    kubectl create clusterrolebinding cluster -test2 --clusterroile=cluster-admin --user=loki

# 在客户端上使用账号密码的方式进行使用    /tmp/kubectl -s="https://192.168.x.x:6443" --username="loki" --password="pwd1" get pods -n kube-system

:: 使用证书的方式登录

# 生成私钥 

openssl genrsa -out client.key 2048

# 生成证书请求文件

openssl req -new -key client.key -subj "/CN=vm1" -out client.csr

# 拷贝到CA 上进行授权

scp client.csr x.x.x.x:/tmp

 # 在CA上签名证书

openssl x509 -req -in /tmp/client.csr -CA ca.crt -CAcreateserial -out /tmp/client.crt -days 3650

# 拷贝回客户端服务器,最后进行测试

  /tmp/kubectl -s="https://x.x.x.x:6443" --certificate-authority=ca.crt --client-certificate=client.crt --client-key=client.key --username="loki" --password="pwd1" get pods -n kube-system

# 此方式已经淘汰于k8s 1.19之前版本,由于过于老旧仅做了解,详见

  

方法一: token authentication

  1) 通过openssl rand -hex 10  生成一段token

  2) 把token 值写入一个csv文件,并且写入Toke值用户名UID

  # 并且需要把这个csv文件放入到/etc/kubernetes/pki目录下面

  

  3) 修改api调用参数  /etc/kubernetes/manifests/kube-apiserver.yaml,增加下面内容:

- --token-auth-file=/etc/kubernetes/pki/loki.csv

  # 添加完毕后,重启一次  systemctl restart kubelet 

  4) 在一个非集群客户端安装kubectl 工具   yum install -y kubelet-1.20.1-0

  # 安装完毕后开始尝试登陆

 kubectl -s https://192.168.xx.xx:6443 --token="0c645bc3cd61963e1d9c" --insecure-skip-tls-verify=true get pods

 

# 会看到如下提示,就是说明loki这个用户是认证成功的,只是没有权限

 

 # 如果没有认证成功的提示如下:

  

  

方法二:

kubeconfig(系统默认用的就是这种认证方式)  

Note: 这里的kubeconfig文件,并非是说有一个名字固定叫kubeconfig的文件,而是只要用于认证的文件---例如:aa.txt,xxx,... 都称之为kubeconfig文件

# 在安装完k8s集群后,默认就会有一个操作让我们指定kubeconfig文件路径,如果删掉了的情况下,如果继续使用或者恢复

eg.1    kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes

eg.2  export KUBECONFIG=/etc/kubernetes/admin.conf; kubectl get nodes

# admin.conf  记录了所有的信息  <---  理论上直接copy这个文件到客户端,再客户端指定kubeconfig文件就可以直接使用(生产环境慎用!!!

 

自己创建一个kubeconfig文件

私钥  -->  证书请求文件  -->  CA权威机构申请证书  --> CA审核通过,授权颁发的证书

xx.key(私钥) -- > xx.crt证书请求文件) -- >  xx.csr(颁发的证书)

# 创建私钥

openssl genrsa -out loki.key 2048

# 生产证书请求文件 

openssl req -new -key loki.key -out loki.csr -subj "/CN=loki/O=CKA2021"    # 这里注意CN的值就是我们授权的用户名

# 对证书请求文件进行base64编码

cat loki.csr |base64 |tr -d "\n"

# 开始写申请证书的请求的yaml文件,模板如下:(模板参考官网

apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: loki
spec:
  request: LS0...以下省略500字...=   # request 里的是base64 编码之后的证书请求文件
  usages:
  - client auth

# 开始导入 

  

 # 查看导入结果

  

 # 批准证书

  

 # 查看获批的证书情况

  

 # 查看并导出证书       kubectl get csr/loki -o jsonpath='{.status.certificate}' | base64 -d > loki.crt

  

 # 给用户授权  kubectl create clusterrolebinding <权限名称> --clusterrole=cluster-admin --user=<用户名>

 

  

正式开始创建kubeconfig文件

 # 创建kubeconfig模板文件

apiVersion: v1
kind: Config
preferences: {}
clusters:                     # k8s集群的信息
- cluster:
  name: cluster1
users:                        # 指定用户 
- name: loki
contexts:                     # 指定上下文(包括用户默认所在的命名空间等信息)
- context:
  name: context1
  namespace: default
current-context: "context1"

 

# 拷贝CA证书

cp /etc/kubernetes/pki/ca.crt .

 

# 设置集群字段  

kubectl config --kubeconfig=kc_loki set-cluster cluster1 --server=<MASTER_HTTPS_ADDRESS> --certificate-authority=ca.crt --embed-certs=true

 --embed-certs=true 的意思是把证书内容写入到此kubeconfig 文件里

# 设置用户字段

kubectl config --kubeconfig=<KUBECONFIG_FILE> set-credentials loki  --client-certificate=loki.crt --client-key=loki.key --embed-certs=true

# 设置上下文字段

kubectl config --kubeconfig=kc_loki set-context context1  --cluster=cluster1 --namespace=default --user=loki

 

 这样,整个kubeconfig文件就创建完毕了。

 

验证kubeconfig文件

# 确认loki是否具有list当前命名空间里pod的权限

kubectl auth can-i list pods --as loki

# 确认loki是否具有list命名空间kube-system里pod的权限

kubectl auth can-i list pods -n kube-system --as loki 

 

 # 把kc_loki文件复制到,一个客户端[我这里用的是VM40机器](非集群内主机环境,需要安装kubectl命令工具包)

 

 

oauth2

自行研究 

 

授权

 

# 改变不同的授权方式,是修改 

/etc/kubernetes/manifests/kube-apiserver.yaml

- --authorization-mode=Node,RBAC

Node, RBAC  # 安装完默认(推荐

AlwaysAllow  # 允许所有请求

AlwaysDeny  # 拒绝所有请求

ABAC           # Attribute-based Access Control  基于属性的访问控制(不灵活,不考虑)

RBAC          # Role Based Access Control  基于角色的访问控制

Node            # Node 授权器主要用于各个node上的kubelet访问apiserver时使用的,其他一般均由RBAC授权器来授权

 

- --enable-admission-plugins=NodeRestriction  准入控制器    # CKS课程会进行讲解

 

# 查看管理员的所有权限

kubectl describe clusterrole admin

 

 

 # 基于命名空间

role

rolebinding

 

 

 # 整个集群

clusterrole

clusterolebinding

 

# 创建role  命令方式    kubectl create role <ROLE_NAME> --verb=<权限1,权限2,...>  --resource=<资源1,资源2>

 

 

# 创建rolebinding   kubectl create rolebinding <ROLEBINDING_NAME> --role=<ROLE_NAME> --user=<USER_NAME>

 

 

# 还可以导出成yaml的方式(方便修改)  kubectl create role <ROLE_NAME> --verb=<权限1,权限2,...> --resource=<资源1,资源2,...> --dry-run=client -o yaml > role1.yaml

 

 

# 生成的关于role的yaml文件内容如下:

# Node:这里的pods和services是共享下面的权限

 # 查看角色详细信息  kubectl describe role <ROLE_NAME>

 

# 如果是想要单独给权限,需要进行如下修改

 

 

 

# 针对deploy的授权 

 首先拥有kubeconfig文件,传到没有集群环境的主机,并进行角色和用户的绑定

ubectl create rolebinding rbind1 --role=role2 --user=loki

# 查看目前role2已经绑定的权限和资源

 

 

# 然后在vm4机器上,依然不能正常浏览loki用户对应的deploy 

 

 

# 增加如下值“apps”后,deployments 权限正常(这里需要注意deploy的apiGrous 父级组 “apps”)

# 查看当前deploy 的权限

 

 

# 再次进行测试,发现成功。

 

 

PS: 注意rolerolebinding 仅对当前命名空间生效 !!!

 

# 可以对所有命名空间生效的使用下面的命令

clusterrole

clusterolebinding

 

# 命令方式创建clusterrole

kubectl create clusterrole crole1 --verb=get,create,delete --resource=pods

 

 

 

 

 

 

 

 

continue...

 

推荐阅读