k8s权限控制的 kubeconfig
  TAICzbZl2ew1 2023年11月02日 51 0

一.kubectl 安装

kubectl是用于针对Kubernetes集群运行命令的命令行接口。你可以通过kubectl部署集群应用,检查和管理集群资源,查看日志等。

1.下载
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

使kubectl二进制可执行。

chmod +x ./kubectl

将二进制文件移动到PATH中。

sudo mv ./kubectl /usr/local/bin/kubectl
2.验证

kubectl version

k8s权限控制的 kubeconfig_k8s

 

二.kubectl配置

1.配置文件

k8s权限控制的 kubeconfig_k8s_02

2.配置生效

将复制的配置复制到$HOME/.kube/config文件

export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config

3.配置验证

kubectl config view

kubectl cluster-info

kubectl get node

三.创建namespace

首先创建一个使用者名字的命名空间

kubectl create ns well
1.创建 ServiceAccount

在用户命名空间下创建 SA

apiVersion: v1
kind: ServiceAccount
metadata:
  name: well-sa
  namespace: well
2.创建一个 Role

在用户命名空间下创建 Role,这里将你希望给使用者的资源和权限放进去。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: well-role
  namespace: well
rules:
- apiGroups: [""]
  resources: 
  - pods
  - deployments
  - configmaps
  - services
  verbs: 
  - get
  - list
  - watch
  - create
  - update
  - delete
3.创建 RoleBinding

将刚刚创建的 SA 和 Role 绑在一起。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: well-binding
  namespace: well
subjects:
- kind: ServiceAccount
  name: well-sa
roleRef:
  kind: Role
  name: well-role
  apiGroup: rbac.authorization.k8s.io

现在 well-sa 这个 ServiceAccount 就可以访问 well 命名空间下的相应资源了。接下来需要把 SA 对应的钥匙给使用者。

4.生产 kubeconfig

kubeconfig 模版如下:

apiVersion: v1
kind: Config
users:
- name: well
  user:
    token: <token>
clusters:
- cluster:
    certificate-authority-data: <certificate-authority-data>
    server: <api-server>
  name: well-cluster
contexts:
- context:
    cluster: well-cluster
    namespace: well
    user: well
  name: well-cluster
current-context: well-cluster

现在只需要将上面相应的内容替换成实际的内容。

这些参数的获取路径如下:

  • 通过命令 kubectl config view --flatten --minify  可以拿到 certificate-authority-data 和 api-server 信息 。
  • 通过命令 kubectl describe sa well-sa -n well  拿到 secret 的 key。
  • 通过命令 kubectl describe secret <key> -n well 拿到 token 信息。

替换完成后将kubeconfig 存成文件发放给使用者即可。

四.自动化

上述过程可以自动化完成,下面是实现这一过程的完整 Shell 脚本。

首先你需要有一个权限足够的 kubeconfig 在你的 kubectl 当前上下文。

拷贝此脚本命名文件名为 create-key.sh,给执行权限。

#!/bin/bash

echo "欢迎使用 kubeconfig 生成器,此脚本可以产生一个有限权限的密钥。"
echo "执行此脚本需要您首先拥有集群最大权限的默认钥匙。"
echo 
echo "使用方法:"
echo "./create-key.sh"
echo "或者"
echo "./create-key.sh <yourname>"
echo

# 检查 ns
function userExists() {
  checkUser=`kubectl get ns | grep -w $1` 
  if [ -z "$checkUser" ]
  then
    echo 0
  else
    echo 1
  fi
}


USER=$1

if [ -z "$USER" ];then
  while true; do
    read -p "请输入用户标识:" USER

    if [ -z "$USER" ];then # 啥也不输入
      echo "您得输入点啥,或者 ctrl + c 退出,请重新输入。"
      echo
    else
      checkUser=`userExists $USER`
      if [ "$checkUser" == "0" ];
      then
        break
      else
        echo "$USER 被占用,请重新输入或者 ctrl + c 退出。"
        echo
      fi
    fi
  done
else
    checkUser=`userExists $USER`
    if [ "$checkUser" = "1" ];then
        echo "$USER 被占用。" >>/dev/stderr
        exit
    fi
fi


kubectl create ns $USER

# 创建 SA
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: $USER-sa
  namespace: $USER
EOF

# 创建一个角色,并控制资源,调整这部分分配您需要的资源权限
cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: $USER-role
  namespace: $USER
rules:
- apiGroups: [""]
  resources: 
  - pods
  - deployments
  - configmaps
  - services
  verbs: 
  - get
  - list
  - watch
  - create
  - update
  - delete
EOF

# 创建 Role Binding
cat <<EOF | kubectl apply -f -
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: $USER-binding
  namespace: $USER
subjects:
- kind: ServiceAccount
  name: $USER-sa
roleRef:
  kind: Role
  name: $USER-role
  apiGroup: rbac.authorization.k8s.io
EOF

KUBE_APISERVER=`kubectl config view --minify -o=jsonpath="{.clusters[*].cluster.server}"`
TOKEN_KEY=`kubectl get sa $USER-sa -n $USER -o=jsonpath="{.secrets[0].name}"`
TOKEN=`kubectl get secrets $TOKEN_KEY -n $USER -o=jsonpath="{.data.token}"`
CLUSTER_AUTH=`kubectl config view --flatten --minify -o=jsonpath="{.clusters[0].cluster.certificate-authority-data}"`
TOKEN_DECODE=`echo $TOKEN | base64 --decode`

# 生产 kubeconfig 文件
cat > $USER.config  <<EOF
apiVersion: v1
kind: Config
users:
- name: $USER
  user:
    token: $TOKEN_DECODE
clusters:
- cluster:
    certificate-authority-data: $CLUSTER_AUTH
    server: $KUBE_APISERVER
  name: $USER-cluster
contexts:
- context:
    cluster: $USER-cluster
    namespace: $USER
    user: $USER
  name: $USER-cluster
current-context: $USER-cluster
EOF

cat $USER.config | pbcopy

echo
echo "成功了!!!!"
echo
echo
echo "kubeconfig 文件已经保存为 ./$USER.config,并已经拷贝至您的剪切板中了。"
echo "当前 kubeconfig 仅允许访问命名空间 $USER 下的特定资源。"
echo
echo "执行如下的命令试试看:"
echo "kubectl get po --kubeconfig=./$USER.config"
echo "kubectl get secret --kubeconfig=./$USER.config"
echo "kubectl get po --kubeconfig=./$USER.config -n default"
  • 执行 ./create-key.sh 或者 ./create-key.sh well 都可以。
  • 执行完成会在当前目录下保存一个 well.config 的文件,这个就是 kubeconfig 文件,发给使用这就好。或者将剪切板里的内容贴给使用者。
  • 本脚本给了测试用例,其中,kubectl get po 有权限,kubectl get secret 没有权限,kubectl get po -n default 没有权限。
  • 修改 Role 的部分,可以精细控制权限,也可以创建多个 Role 和 Binding,对不同的资源分权限控制。
  • 需要释放资源,直接删除命名空间,方便快捷。kubectl delete ns well





【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: CDN原理以及图解 下一篇: Linux快捷键
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  uvM09mQNI0hF   2023年11月19日   22   0   0 promtaillokik8s
  cO5zyEmh8RH6   2023年12月09日   23   0   0 k8s证书