Kubernetes控制平面组件:APIServer 基于 静态Token 的认证机制

news/2025/2/24 13:06:20

云原生学习路线导航页(持续更新中)

  • kubernetes学习系列快捷链接
    • Kubernetes架构原则和对象设计(一)
    • Kubernetes架构原则和对象设计(二)
    • Kubernetes架构原则和对象设计(三)
    • Kubernetes控制平面组件:etcd(一)
    • Kubernetes控制平面组件:etcd(二)
    • Kubernetes控制平面组件:etcd常用配置参数
    • Kubernetes控制平面组件:etcd高可用集群搭建
    • Kubernetes控制平面组件:etcd高可用解决方案
    • Kubernetes控制平面组件:Kubernetes如何使用etcd
    • kubectl 和 kubeconfig 基本原理
    • kubeadm 升级 k8s集群 1.17到1.20
    • Kubernetes常见问题解答
    • 查看云机器的一些常用配置

本文主要对kubernetes API Server 认证机制中的 Token>静态Token认证进行介绍,包括 Token>静态Token的设计理念、认证流程,并给出 Kubernetes 中的认证实操演练

在这里插入图片描述

Token_22">1.Token>静态Token认证方式简介

  • 静态 Token 认证(Static Token File)
    • 是 Kubernetes 提供的一种基于 Bearer Token 的简单认证方式。
    • 通过预定义的 Token 文件实现用户身份认证
  • 特性
    • 需预先在 --token-auth-file 中配置 Token
    • Token 以明文形式存储
    • 不支持动态管理(需重启 API Server)
    • 适用于测试环境,生产环境不推荐

Token_31">2.实操演练:Token>静态Token认证

Token__32">2.1.创建 Token 文件

  • 文件格式(CSV):
    token,username,uid,"group1,group2,..."
    # 比如
    31ada4fd.ade128006b1723da,devuser,1000,"developers,qa"
    
  • 创建文件 /etc/kubernetes/pki/tokens.csv
    sudo mkdir -p /etc/kubernetes/pki
    echo "31ada4fd.ade128006b1723da,devuser,1000,\"developers,qa\"" | sudo tee /etc/kubernetes/pki/tokens.csv
    

2.2.配置 API Server

  • 找到 kube-apiserver 静态pod配置
    • 如果是kubeadm启动的kubernetes集群,那么api-server会以静态pod的方式启动
    • 静态pod默认路径 /etc/kubernetes/manifests,可以在这里找到 kube-apiserver 的pod配置
  • 修改 kube-apiserver 静态pod配置
      # 文件路径:/etc/kubernetes/manifests/kube-apiserver.yaml
      spec:
        containers:
        - command:
          - kube-apiserver
          - --token-auth-file=/etc/kubernetes/pki/tokens.csv  # 添加此参数
      # 其他参数不用改
    
    • 因为我们把token文件放在了 /etc/kubernetes/pki 目录下,该目录默认已经被挂载到 api-server的容器中了,所以我们可以直接在参数中写这个目录,容器可以拿到该文件
      在这里插入图片描述

2.3.重启 API Server

kubernetescurl_66">2.4.验证使用token访问kubernetes集群:直接curl

  • 获取不到pod,因为该token只是通过了认证,但是没有授权,属于正常现象
    curl https://<API_SERVER_IP>:6443/api/v1/pods \
      --header "Authorization: Bearer 31ada4fd.ade128006b1723da" \
      --insecure
    
    # 示例
    [root@VM-226-235-tencentos ~]# curl https://xxx.xxx.xxx.xxx:6443/api/v1/pods \
    > --header "Authorization: Bearer 31ada4fd.ade128006b1723da" \
    > --insecure
    {
      "kind": "Status",
      "apiVersion": "v1",
      "metadata": {
        
      },
      "status": "Failure",
      "message": "pods is forbidden: User \"devuser\" cannot list resource \"pods\" in API group \"\" at the cluster scope",
      "reason": "Forbidden",
      "details": {
        "kind": "pods"
      },
      "code": 403
    }
    
  • 或者也可以通过 kubectl get pods -v 9 看看正常的get pod curl请求是什么样,加一个header参数即可
    • 从响应最后的json看,apiserver已经知道我是devuser了,但是没有权限访问pod
    # 获取真实的curl请求
    [root@VM-226-235-tencentos ~]# kubectl get pods -v 9
    .......
    I0218 22:36:48.698775   29701 round_trippers.go:424] curl -k -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.19.16 (linux/amd64) kubernetes/e37e4ab" 'https://xxx.xxx.xxx.xxx:6443/api/v1/namespaces/default/pods?limit=500'
    
    # 添加一个header后,发送请求
    [root@VM-226-235-tencentos ~]# curl -k -v -XGET -H "Authorization: Bearer 31ada4fd.ade128006b1723da" -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.19.16 (linux/amd64) kubernetes/e37e4ab" 'https://xxx.xxx.xxx.xxx:6443/api/v1/namespaces/default/pods?limit=500'
    * About to connect() to xxx.xxx.xxx.xxx port 6443 (#0)
    *   Trying xxx.xxx.xxx.xxx...
    * Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port 6443 (#0)
    * Initializing NSS with certpath: sql:/etc/pki/nssdb
    * skipping SSL peer certificate verification
    * NSS: client certificate not found (nickname not specified)
    * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    * Server certificate:
    *       subject: CN=kube-apiserver
    *       start date: Apr 17 08:00:10 2024 GMT
    *       expire date: Apr 21 07:13:02 2025 GMT
    *       common name: kube-apiserver
    *       issuer: CN=kubernetes
    > GET /api/v1/namespaces/default/pods?limit=500 HTTP/1.1
    > Host: xxx.xxx.xxx.xxx:6443
    > Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json
    > User-Agent: kubectl/v1.19.16 (linux/amd64) kubernetes/e37e4ab
    > Authorization: Bearer 31ada4fd.ade128006b1723da
    > 
    < HTTP/1.1 403 Forbidden
    < Cache-Control: no-cache, private
    < Content-Type: application/json
    < X-Content-Type-Options: nosniff
    < Date: Tue, 18 Feb 2025 14:38:17 GMT
    < Content-Length: 252
    < 
    {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"pods is forbidden: User \"devuser\" cannot list resource \"pods\" in API group \"\" in the namespace \"default\"","reason":"Forbidden","details":{"kind":"pods"},"code":403}
    * Connection #0 to host xxx.xxx.xxx.xxx left intact
    

kuberneteskubectl_132">2.5.验证使用token访问kubernetes集群:配置kubectl

# 基于静态token生成一个user
kubectl config set-credentials devuser --token=31ada4fd.ade128006b1723da
# 为user创建一个context
kubectl config set-context dev-context --cluster=<your-cluster> --user=devuser
# 切换上下文
kubectl config use-context dev-context
# 验证。若显示 "Forbidden",说明user没有权限,需配置 RBAC 授权
kubectl get pods

[root@VM-226-235-tencentos ~]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "devuser" cannot list resource "pods" in API group "" in the namespace "default"
  • 上面的操作将会修改到kubeconfig中,可以查看 ~/.kube/config 的内容

    ......
    contexts:
    - context:
        cluster: kubernetes
        user: devuser
      name: dev-context
    - context:
        cluster: kubernetes
        user: kubernetes-admin
      name: kubernetes-admin@kubernetes
    - context:
        cluster: kubernetes
        user: myuser
      name: myuser@kubernetes
    current-context: dev-context
    kind: Config
    preferences: {}
    users:
    - name: devuser
      user:
        token: 31ada4fd.ade128006b1723da
    - name: ......
    
  • RBAC授权

    • 注意需要先切换回原来的上下文,我们新建的dev-context没有Role权限的
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: default
      name: read-pods
    subjects:
    - kind: User
      name: devuser
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    

3.注意事项

  • 生产环境建议使用更安全的认证方式(如 OIDC、X509 证书)
  • Token 文件变更后需要重启 API Server
  • 文件权限应设置为 600
  • 结合 RBAC 进行细粒度权限控制
  • 定期轮换 Token(需手动操作)

4.用途

  • 比如有几个人要共享一个集群,可以每个人分配一个静态token,对授权做一些限制,就不怕别人访问或删除你的资源了

http://www.niftyadmin.cn/n/5864356.html

相关文章

Docker仿真宇树狗GO1

1. 启动容器 docker run -it --rm humble_suo bash2. 安装Go1 的仿真包 apt update apt install -y git cmake build-essential git clone https://github.com/unitreerobotics/unitree_ros.git cd unitree_ros colcon build source install/setup.bash3. 启动仿真环境 ros2…

MongoDB#常用脚本

批量插入数据脚本 const oneDayAgo new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);const documents []; for (let i 1; i < 100; i) {documents.push({id: i, // 递增的 idcreateTime: oneDayAgo, // 1天前的日期data: Sample data ${i} // 其他字段&#xff08;可选…

垂类大模型微调(一):认识LLaMA-Factory

LlamaFactory 是一个专注于 高效微调大型语言模型(LLMs) 的开源工具框架,尤其以支持 LLaMA(Meta 的大型语言模型系列)及其衍生模型(如 Chinese-LLaMA、Alpaca 等)而闻名。它的目标是简化模型微调流程,降低用户使用门槛; 官方文档 一、介绍 高效微调支持 支持多种微调…

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…

响应式数据ref()和reactive()的使用

官方网址&#xff1a;响应式基础 | Vue.js 在 Vue 3 中&#xff0c;ref 和 reactive 是用于创建响应式数据的两个核心 API。它们的用法和适用场景有所不同&#xff0c;以下是它们的详细说明和使用方法。 ref ref 用于创建一个响应式的基本类型或对象类型的数据。它会将数据包装…

Git版本控制系统---本地操作(万字详解!)

目录 git基本配置 认识工作区、暂存区、版本库 添加文件--情况一&#xff1a; 添加文件-情况二: 修改文件: 版本回退&#xff1a; git基本配置 1.初始化本地仓库&#xff0c;注意&#xff1a;一定要在一个目录下进行&#xff0c;一般都是新建一个文件夹&#xff0c;在文件…

MySQL -安装与初识

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 安装1. 更新系统包列表2. 安装MySQL服务器3. 启动并验证MySQL服务4. 运行安全配置向导5. 验证MySQL登录6. 设置root用户密码7. 配置远程访问&#xff08;可选&…

ArcGIS Pro在洪水淹没分析中的应用与实践

如何使用ArcGIS Pro进行洪水淹没分析 洪水作为一种自然灾害&#xff0c;对人类社会和自然环境造成的威胁日益显著。 为了更好地理解和预测洪水事件&#xff0c;洪水淹没分析显得尤为重要。 ArcGIS Pro作为一款强大的地理信息系统&#xff08;GIS&#xff09;软件&#xff0c…