使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口

文章目录

  • 使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口
  • 功能需求
  • 使用 kubectl 获取 Token
    • 命令解析
    • 输出示例
  • 完整代码实现
    • Kubernetes API 客户端类
      • 功能说明
    • Django 接口视图
      • 关键点解析
    • 路由配置
  • 接口测试
    • 请求示例
    • 响应结果
      • 成功
      • 错误
  • 优化建议
    • 1. 安全性
    • 2. 错误处理
    • 3. 扩展返回数据
  • 完整代码示例
    • Kubernetes API 客户端类
    • Django 接口视图
    • 路由配置
    • 完整代码说明
  • 总结


使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口

在 Kubernetes 集群运维和开发中,验证集群的连通性和资源访问权限是常见需求。本文将以 Django 框架为基础,构建一个只支持 POST 请求的接口,用于测试 Kubernetes 集群连接并获取默认命名空间中的 Pod 列表。


功能需求

  • 用户通过 HTTP 接口传递 Kubernetes API 地址、Token 和端口。
  • 系统验证请求参数的完整性并测试 Kubernetes 集群的连通性。
  • 返回默认命名空间的 Pod 列表或具体的错误信息。
  • 限制接口仅支持 POST 请求。

使用 kubectl 获取 Token

在 Kubernetes 中,Token 通常存储在 Secret 资源中,并且用于访问集群的 API。以下命令可以帮助您获取 Kubernetes 系统命名空间中的 Token:

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

命令解析

  1. kubectl -n kube-system get secret -n kube-system -o name: 该命令列出 kube-system 命名空间中的所有 Secret 资源,并只输出 Secret 的名字。
  2. grep namespace: 过滤出包含 namespace 字符串的 Secret 名称。通常,集群的服务账户 Token 存储在名为 namespace-xxxxx 的 Secret 中。
  3. kubectl -n kube-system describe <secret_name>: 通过 describe 命令获取该 Secret 的详细信息。
  4. grep token: 从 Secret 的详细信息中提取包含 Token 的部分。

输出示例

该命令会输出类似于以下内容的 Token:

token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

完整代码实现

以下代码基于 Python 和 Django 框架,分为 Kubernetes API 客户端类、接口视图函数以及路由配置三部分。

Kubernetes API 客户端类

我们定义了一个 KubernetesClient 类,封装与 Kubernetes API 的交互逻辑。

from kubernetes import clientclass KubernetesClient:def __init__(self, host, token):"""初始化 Kubernetes API 客户端"""# 配置 Kubernetes API 客户端k8s_config = client.Configuration()k8s_config.host = hostk8s_config.verify_ssl = False  # 禁用 SSL 验证(仅测试环境使用)k8s_config.api_key = {"authorization": "Bearer " + token}client.Configuration.set_default(k8s_config)# 初始化核心和应用 APIself.k8s_core_v1 = client.CoreV1Api()def get_pods(self, namespace="default"):"""获取指定命名空间中的 Pod 列表"""try:pods = self.k8s_core_v1.list_namespaced_pod(namespace=namespace)return [pod.metadata.name for pod in pods.items]except client.ApiException as e:raise Exception(f"获取 Pod 列表失败:{e}")

功能说明

  • 初始化时配置 Kubernetes API 地址和认证 Token。
  • get_pods 方法通过 list_namespaced_pod 获取 Pod 列表并返回 Pod 名称。

Django 接口视图

在 Django 中,我们通过视图函数实现接口逻辑,并限制只支持 POST 请求。

from django.http import JsonResponse
import jsondef test_join(request):"""测试 Kubernetes 集群的连接"""# 检查请求方法是否为 POSTif request.method != "POST":return JsonResponse({"code": 405, "message": "仅支持 POST 请求"})# 提取请求参数try:body = json.loads(request.body)ipaddr = body.get("ipaddr")token = body.get("secret_key")port = body.get("port")if not all([ipaddr, token, port]):return JsonResponse({"code": 400, "message": "请输入正确的参数"})except json.JSONDecodeError:return JsonResponse({"code": 400, "message": "请求数据格式错误"})# 构造 Kubernetes API 地址host = f"https://{ipaddr}:{port}"try:# 初始化 Kubernetes 客户端kube_client = KubernetesClient(host, token)pods = kube_client.get_pods()return JsonResponse({"code": 200, "message": "连接成功", "data": pods})except Exception as e:return JsonResponse({"code": 400, "message": f"连接失败: {str(e)}"})

关键点解析

  1. 请求方法限制:
    • 使用 request.method 检查请求类型,如果不是 POST 返回 HTTP 405 状态码。
  2. 参数验证:
    • 从请求体中解析 ipaddrtokenport,确保参数完整且格式正确。
  3. 连接测试:
    • 通过 KubernetesClient 测试连接并获取默认命名空间中的 Pod 列表。
  4. 错误处理:
    • 捕获参数错误、Kubernetes API 异常等,并返回详细的错误信息。

路由配置

将视图函数绑定到路由,使其可以通过 HTTP 调用:

from django.urls import path
from .views import test_joinurlpatterns = [path('join_test/', test_join),
]

接口测试

以下是测试接口的示例。

请求示例

使用 curl 工具发送 POST 请求:

curl -X POST http://127.0.0.1:8000/join_test/ \
-H "Content-Type: application/json" \
-d '{"ipaddr": "192.168.1.10","secret_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","port": 6443
}'

响应结果

成功

如果连接成功并获取到 Pod 列表,返回如下结果:

{"code": 200,"message": "连接成功","data": ["nginx-deployment-7c77f6df69-8wmdt", "redis-pod"]
}

错误

  • POST 请求:
    {"code": 405,"message": "仅支持 POST 请求"
    }
    
  • 参数缺失:
    {"code": 400,"message": "请输入正确的参数"
    }
    
  • 集群认证失败:
    {"code": 400,"message": "连接失败: Unauthorized"
    }
    

优化建议

1. 安全性

  • 启用 SSL 验证:将 verify_ssl 设置为 True,并配置证书路径。
  • 使用环境变量管理敏感信息(如 Token)。

2. 错误处理

  • 针对不同异常返回精确的错误码(如认证失败返回 401,资源未找到返回 404)。

3. 扩展返回数据

在返回的 Pod 列表中附加更多信息,例如 Pod 的状态、节点信息等:

return [{"name": pod.metadata.name,"status": pod.status.phase,"node": pod.spec.node_name
} for pod in pods.items]

完整代码示例

以下是完整的代码示例,包括 Kubernetes API 客户端类、Django 视图函数和路由配置,确保能够实现测试 Kubernetes 集群连接并返回 Pod 列表的功能:


Kubernetes API 客户端类

from kubernetes import clientclass KubernetesClient:def __init__(self, host, token):"""初始化 Kubernetes API 客户端"""# 配置 Kubernetes API 客户端k8s_config = client.Configuration()k8s_config.host = hostk8s_config.verify_ssl = False  # 禁用 SSL 验证(仅测试环境使用)k8s_config.api_key = {"authorization": "Bearer " + token}client.Configuration.set_default(k8s_config)# 初始化核心和应用 APIself.k8s_core_v1 = client.CoreV1Api()def get_pods(self, namespace="default"):"""获取指定命名空间中的 Pod 列表"""try:pods = self.k8s_core_v1.list_namespaced_pod(namespace=namespace)return [pod.metadata.name for pod in pods.items]except client.ApiException as e:raise Exception(f"获取 Pod 列表失败:{e}")

Django 接口视图

from django.http import JsonResponse
import json
from .kubernetes_client import KubernetesClientdef test_join(request):"""测试 Kubernetes 集群的连接"""# 检查请求方法是否为 POSTif request.method != "POST":return JsonResponse({"code": 405, "message": "仅支持 POST 请求"}, status=405)# 提取请求参数try:body = json.loads(request.body)ipaddr = body.get("ipaddr")token = body.get("secret_key")port = body.get("port")if not all([ipaddr, token, port]):return JsonResponse({"code": 400, "message": "请输入正确的参数"})except json.JSONDecodeError:return JsonResponse({"code": 400, "message": "请求数据格式错误"})# 构造 Kubernetes API 地址host = f"https://{ipaddr}:{port}"try:# 初始化 Kubernetes 客户端kube_client = KubernetesClient(host, token)pods = kube_client.get_pods()return JsonResponse({"code": 200, "message": "连接成功", "data": pods})except Exception as e:return JsonResponse({"code": 400, "message": f"连接失败: {str(e)}"})

路由配置

from django.urls import path
from .views import test_joinurlpatterns = [path('join_test/', test_join),
]

完整代码说明

  1. KubernetesClient 类:

    • KubernetesClient 类封装了与 Kubernetes 集群的连接和交互,特别是获取 Pod 列表的功能。
    • get_pods 方法通过 Kubernetes API 获取指定命名空间中的 Pod 列表。
  2. test_join 视图函数:

    • 视图函数仅支持 POST 请求,使用 request.method 检查请求类型。
    • 提取请求体中的 ipaddrsecret_keyport 参数,确保这些参数完整且正确。
    • 使用 KubernetesClient 测试 Kubernetes 集群连接并返回 Pod 列表。
  3. 路由配置:

    • 配置了路由,使得用户可以通过 POST 请求访问 /join_test/ 路径进行集群连接测试。

总结

本文详细介绍了如何通过 Django 构建一个只支持 POST 请求的接口,用于测试 Kubernetes 集群连接和获取 Pod 列表。通过请求方法限制、参数验证和异常处理,该接口在功能性和安全性上都有较好的保障。希望对您有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI日记】24.11.26 聚焦 kaggle 比赛

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容&#xff1a;研究 kaggle 比赛时间&#xff1a;3 小时 核心工作 2 内容&#xff1a;学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间&#xff1a;4 小时备注&#xff1a;这…

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…

【数据结构实战篇】用C语言实现你的私有队列

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构&#xff0c;本期内容我们将实现队列的数据结构 一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色&#xff0c;与整体不协调。 修改方式如下&#xff1a;

长三角文博会:Adobe国际认证体系推动设计人才评价新标准

2024年11月22日&#xff0c;由上海、江苏、浙江、安徽三省一市党委宣传部共同发起的第五届长三角文化博览会&#xff08;简称“长三角文博会”&#xff09;在上海国家会展中心盛大启幕。长三角文博会自2018年起已成功举办多届&#xff0c;已成为展示区域文化产业发展成果、推动…

安装数据库客户端工具

如果没有勾选下面的&#xff0c;可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件&#xff0c;找到数据库&#xff0c;并刷新

SQL 复杂查询

目录 复杂查询 一、目的和要求 二、实验内容 &#xff08;1&#xff09;查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。&#xff08;分别采用子查询和连接方式实现&#xff09; 查询出每个订单的消费者姓名及联系方式。 在…

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…

ES 和Kibana-v2 带用户登录验证

1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话&#xff0c;下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…

【踩坑】git中文乱码问题

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景说明 使用git diff显示中文乱码&#xff0c;如&#xff1a; 修复方法 执行一次&#xff1a; export LESSCHARSETutf-8 如果需要下次登录免输入…

go语言逆向-基础basic

文章目录 go 编译命令 ldflags -w -s的作用和问题使用 file 命令查看文件类型 go 语言逆向参考go ID版本GOROOT和GOPATHGOROOTGOPATHGOROOT和GOPATH的关系示例 go build和 go modpclntab &#xff08;Program Counter Line Table 程序计数器行数映射表&#xff09;Moduledata程…

D2761 适合在个人电脑、便携式音响等系统中作音频限幅用。

概述&#xff1a; D2761是为保护扬声器所设计的音频限幅器&#xff0c;其限幅值可通过外接电阻来调节&#xff0c;适合在个人电脑、便携式音响等系统中作音频限幅用。D2761采用SSOP10、MSOP10、TSSOP14的封装形式封装。 主要特点&#xff1a;  工作电压范围宽&#xff1a;2.7…

【Linux系统】—— 基本指令(四)

【Linux系统】—— 基本指令&#xff08;三&#xff09; 1「find」指令2 「grep」指令2.1 初识「grep」指令2.2 「grep」指令 选项 3 打包压缩基本知识4 「zip / unzip」指令5「tar」命令6 文件互传6.1 Linux 与 Windows 互传6.1.1 Linux向Windows传输6.1.2 Windows向Linux传输…

WordCloud去掉停用词(fit_words+generate)的2种用法

-------------词云图集合------------- WordCloud去掉停用词&#xff08;fit_wordsgenerate&#xff09;的2种用法 通过词频来绘制词云图&#xff08;jiebaWordCloud&#xff09; Python教程95&#xff1a;去掉停用词词频统计jieba.tokenize示例用法 将进酒—李白process_t…

洛谷刷题日记12||图的遍历

反向建边 dfs 按题目来每次考虑每个点可以到达点编号最大的点&#xff0c;不如考虑较大的点可以反向到达哪些点 循环从N到1&#xff0c;则每个点i能访问到的结点的A值都是i 每个点访问一次&#xff0c;这个A值就是最优的&#xff0c;因为之后如果再访问到这个结点那么答案肯…

替代Postman ,17.3K star!

现在&#xff0c;许多人都朝着全栈工程师的方向发展&#xff0c;API 接口的编写和调试已成为许多开发人员必备的技能之一。 工欲善其事&#xff0c;必先利其器。拥有一款优秀的 API 工具对于任何工程师来说都是极为重要的&#xff0c;它能够帮助我们高效地完成各种开发任务。 …

java:拆箱和装箱,缓存池概念简单介绍

1.基本数据类型及其包装类&#xff1a; 举例子&#xff1a; Integer i 10; //装箱int n i; //拆箱 概念&#xff1a; 装箱就是自动将基本数据类型转换为包装器类型&#xff1b; 拆箱就是自动将包装器类型转换为基本数据类型&#xff1b; public class Main {public s…

Node.js的url模块与querystring模块

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 4.3.1 http模块——创建HTTP服务器、客户端 要使用http模块&#xff0…

【Reinforcement Learning】强化学习下的多级反馈队列(MFQ)算法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

【linux】服务器加装硬盘后如何将其设置为独立硬盘使用

【linux】服务器加装硬盘后如何将其设置为独立硬盘使用 问题描述&#xff1a;本服务器原本使用了两个硬盘作为存储硬盘&#xff0c;同时对这两个硬盘设置了raid1阵列。现在内存不足要进行加载硬盘&#xff0c;新加载的硬盘不设置为raid1&#xff0c;而是将新加装的两个硬盘作为…