要在Kubernetes (k8s) 中使用Python创建一个Pod,你可以使用Kubernetes Python客户端库(通常称为kuberneteskubernetes-client)。以下是一个简单的步骤和示例代码,说明如何使用Python在Kubernetes集群中创建一个Pod。

步骤

两种方式

在pycharm中创建pod

  1. 添加k8s模块

用国内的仓库源可以加快python下载包的速度,国内源如下:
阿里云 https://mirrors.aliyun.com/pypi/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
豆瓣(douban) https://pypi.douban.com/simple/
中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple/
from kubernetes import client, config
from kubernetes.client.rest import ApiException config.load_kube_config(r'C:\Users\4407\Desktop\config')
# 反斜杠\是一个转义字符。**在字符串前加上r**,这样Python就不会解释反斜杠为转义字符了
# **使用双反斜杠**,将每个单反斜杠替换为双反斜杠。
# 使用**正斜杠**:在Windows中也可以使用正斜杠(尽管它们通常用于Unix和Linux系统),Python会理解它们为路径分隔符。 pod_manifest = {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "my-pod",
"labels": {
"app": "my-app"
}
},
"spec": {
"containers": [
{
"name": "my-container",
"image": "nginx:1.19.1",
"ports": [
{"containerPort": 80}
]
}
]
}
} # api_instance = client.CoreV1Api()
v1 = client.CoreV1Api()
resp = v1.create_namespaced_pod(body=pod_manifest, namespace='default')
print("Pod created. status='%s'" % str(resp.status))

在k8s集群中使用python创建pod

  1. 安装python3 pip3 并且加载 Kubernetes 模块

使用pip安装:


pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple kubernetes pip3 install --upgrade pip
  1. 获取Kubernetes集群的访问凭据

你可能需要配置Kubernetes集群的访问凭据。这通常是通过设置环境变量(如KUBECONFIG)或使用~/.kube/config文件来完成的。

3. 编写Python代码来创建Pod

使用Kubernetes Python客户端库来定义Pod并发送到Kubernetes API服务器。

示例代码

以下是一个简单的Python脚本,用于在Kubernetes集群中创建一个Pod:

[root@master python]# cat pod.py
#!/usr/bin/python3
from kubernetes import client, config, watch
from kubernetes.client.rest import ApiException config.load_kube_config() pod_manifest = {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "my-pod",
"labels": {
"app": "my-app"
}
},
"spec": {
"containers": [
{
"name": "my-container",
"image": "nginx:1.19.1",
"ports": [
{"containerPort": 80}
]
}
]
}
} #api_instance = client.CoreV1Api()
v1 = client.CoreV1Api()
resp = v1.create_namespaced_pod(body=pod_manifest, namespace='default')
print("Pod created. status='%s'" % str(resp.status))

运行此脚本将在Kubernetes集群的默认命名空间中创建一个名为“my-pod”的Pod,该Pod运行“nginx:1.19.1”镜像。你可以根据需要修改Pod的规格和命名空间。

详细解释上面代码

当然可以,以下是对您提供的 pod.py Python 脚本的详细解释:

  1. Shebang
#!/usr/bin/python3

这一行是 shebang(也称为 hashbang 或 hashbang line)。它告诉系统应该使用哪个解释器来执行这个脚本。在这里,它指定了使用 /usr/bin/python3 作为解释器,即 Python 3。

  1. 导入必要的库
from kubernetes import client, config, watch
from kubernetes.client.rest import ApiException

这里从 kubernetes 包中导入了三个模块:clientconfigwatch。同时,还从 kubernetes.client.rest 中导入了 ApiException,这是 Kubernetes Python 客户端库中的一个异常类,用于处理与 Kubernetes API 交互时可能出现的错误。

  1. 加载 Kubernetes 配置
config.load_kube_config()

这一行代码调用了 config.load_kube_config() 方法,它会加载 Kubernetes 的配置文件(通常是 ~/.kube/config),以便脚本能够与 Kubernetes 集群进行交互。

  1. 定义 Pod 清单
pod_manifest = {
"apiVersion": "v1",
"kind": "Pod",
# ... 其他字段 ...
}

这里定义了一个 Python 字典 pod_manifest,它描述了要创建的 Pod 的属性和配置。这个字典遵循 Kubernetes 的 API 规范,用于定义 Pod 的各种属性,如名称、标签、容器配置等。

  1. 创建 Pod
v1 = client.CoreV1Api()
resp = v1.create_namespaced_pod(body=pod_manifest, namespace='default')

首先,创建了一个 CoreV1Api 的实例 v1,它是 Kubernetes Python 客户端库中的一个类,用于与 Kubernetes API 的核心 v1 版本进行交互。

然后,调用了 v1.create_namespaced_pod() 方法来在指定的命名空间(在这个例子中是 'default')中创建一个新的 Pod。这个方法需要两个参数:bodynamespacebody 参数是一个包含 Pod 定义的字典(在这里是 pod_manifest),而 namespace 参数指定了要在哪个命名空间中创建 Pod。

create_namespaced_pod() 方法返回一个响应对象 resp,该对象包含了关于创建的 Pod 的信息。

  1. 打印 Pod 创建状态
print("Pod created. status='%s'" % str(resp.status))

最后,这一行代码打印出 Pod 创建的状态。然而,这里有一点需要注意:resp.status 可能不是直接包含 Pod 状态的字段。通常,Kubernetes API 的响应包含一个状态码(例如 HTTP 201 表示成功创建)和一个包含 Pod 详细信息的对象。如果想要打印 Pod 的实际状态(如 RunningPending 等),可能需要从响应对象中提取更多信息。

使用

  • 运行脚本
[root@master python]# python3 pod.py
//此处不可用python,会报错,因为脚本中指定了python3
  • 查看Pod状态
[root@master python]# kubectl get po
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 0 29m

总结

为了独立写出上面的代码,需要掌握Python的一些基本概念和库的使用。

关键点和技能:

  1. Python基础知识

    • 变量和数据类型(如字典、列表、字符串等)
    • 控制流(条件语句、循环语句)
    • 函数定义和调用
    • 导入模块和库
  2. Python字典

    • 字典的创建
    • 字典的访问和修改
    • 字典的嵌套
  3. Python异常处理

    • try-except语句的使用
    • 捕获和处理特定类型的异常(如上面的ApiException
  4. Python第三方库的安装和使用

    • 使用pip命令安装库(如kubernetes
    • 导入和使用第三方库中的类和函数
  5. Kubernetes基本概念

    • 了解Kubernetes集群的组成(如Master节点、Worker节点)
    • 理解Pod、容器、命名空间等Kubernetes资源
    • 了解Kubernetes API的基本操作和用途
  6. Kubernetes Python客户端库的使用

    • 加载Kubernetes集群配置(如使用load_kube_config()
    • 创建和配置Kubernetes资源对象(如V1Pod
    • 调用Kubernetes API进行资源的创建、读取、更新和删除操作
  7. JSON或YAML到Python对象的转换

    • 虽然上面的示例中直接使用了Python字典来定义Pod规格,但通常Kubernetes资源配置文件是以YAML或JSON格式编写的。因此,了解如何将YAML或JSON文件解析为Python对象(如使用PyYAMLjson库)也是很重要的。
  8. 错误处理和日志记录

    • 在实际代码中,您可能需要添加更详细的错误处理和日志记录功能,以便在出现问题时能够更快地定位和解决问题。
  9. 文档和社区支持

    • 阅读Kubernetes和Kubernetes Python客户端库的官方文档
    • 搜索和参与相关的社区讨论和问答,以获取帮助和解决方案
  10. 版本管理

    • 了解如何使用版本控制工具(如Git)来管理您的代码和配置文件

通过学习和实践上述技能和知识点,您将能够独立地编写出类似上面的Python脚本来与Kubernetes集群进行交互。

参数详解

config.load_kube_config() 是 Kubernetes Python 客户端库中的一个函数,用于加载 Kubernetes 的配置信息,以便 Python 脚本能够与 Kubernetes 集群进行交互。这个函数在大多数情况下不需要任何参数,因为它会默认从用户的家目录下的 .kube/config 文件中加载配置。

不过,为了更全面地解释 config.load_kube_config(),我们可以考虑一些可能的参数(尽管在标准的 Kubernetes Python 客户端库中这个函数通常不接受任何参数):

  • 默认的参数和行为

  • 无参数:当你不给 load_kube_config() 提供任何参数时,它会尝试从默认的 kubeconfig 路径(通常是 ~/.kube/config)加载配置。

  • 加载上下文:kubeconfig 文件可能包含多个集群、用户和上下文(contexts)。默认情况下,它会加载当前上下文(current-context),这个上下文定义了应该使用哪个集群和用户凭据。

  • 可能的参数(取决于具体实现)

虽然标准的 Kubernetes Python 客户端库中的 load_kube_config() 函数通常不接受参数,但某些扩展或修改版可能允许你传递额外的参数。这些参数可能包括:

  • kubeconfig 文件的路径:允许你指定一个非默认的 kubeconfig 文件路径。
  • 上下文名称:允许你指定一个特定的上下文来加载,而不是默认的当前上下文。
  • 用户代理:允许你设置用于 HTTP 请求的用户代理字符串。
  • 其他认证选项:在某些情况下,可能允许你通过参数直接提供认证凭据(如令牌、证书等),而不是从 kubeconfig 文件中加载。

实际使用中的注意事项

  • 权限:加载 kubeconfig 文件需要适当的文件系统权限。如果脚本没有足够的权限来读取该文件,load_kube_config() 将会失败。
  • 上下文:确保 kubeconfig 文件中的当前上下文是你想要与之交互的 Kubernetes 集群的正确上下文。如果需要,你可以使用 kubectl config 命令来修改或设置当前上下文。
  • 环境变量:在某些情况下,环境变量(如 KUBECONFIG)可能会影响 kubeconfig 文件的加载行为。确保这些环境变量被正确设置,以符合你的需求。
  • 错误处理:在调用 load_kube_config() 时,最好包含适当的错误处理逻辑,以便在加载配置失败时能够优雅地处理错误。

总结:

config.load_kube_config() 是 Kubernetes Python 客户端库中用于加载 Kubernetes 配置的关键函数。通过加载 kubeconfig 文件,Python 脚本可以获得与 Kubernetes 集群进行交互所需的认证信息和集群信息。

原理

使用Python创建Kubernetes Pod的原理主要涉及以下几个步骤和概念:

  1. Kubernetes API:

    Kubernetes提供了一个RESTful API,允许用户通过HTTP请求与集群进行交互。这个API支持对集群中的资源(如Pod、Service、Deployment等)进行增删改查等操作。

  2. Kubernetes Python客户端库:

    为了简化与Kubernetes API的交互,开发者们创建了多种语言的客户端库,包括Python。这些库封装了底层的HTTP请求,使得开发者可以使用更高级别的API来操作Kubernetes资源。在Python中,kubernetes客户端库就是这样一个工具。

  3. 认证和授权:

    在与Kubernetes API交互之前,你需要提供适当的认证凭据,以证明你有权限执行所请求的操作。这通常通过Kubernetes的配置文件(通常是~/.kube/config)或环境变量来完成。这些凭据可以是API令牌、客户端证书等。

  4. 定义Pod规格:

    在创建Pod之前,你需要定义Pod的规格(Specification)。这通常是一个包含Pod元数据和配置信息的字典或对象。规格中指定了Pod的名称、命名空间、容器列表(每个容器有名称、镜像、端口等配置)、存储需求等。

  5. 使用Python客户端库发送请求:

    一旦你有了Pod的规格和适当的认证凭据,你就可以使用Kubernetes Python客户端库来发送HTTP请求到Kubernetes API服务器。这个请求告诉Kubernetes API服务器你想要创建一个新的Pod,并提供了Pod的规格作为请求体。

  6. Kubernetes API服务器处理请求:

    当Kubernetes API服务器接收到你的请求时,它会验证你的认证凭据和请求的有效性。如果一切正常,API服务器就会根据你提供的Pod规格在集群中创建一个新的Pod。这通常涉及调度Pod到合适的节点上,并在该节点上启动Pod中的容器。

  7. 监视Pod的状态:

    一旦Pod被创建,你可以继续使用Kubernetes API(和Python客户端库)来监视Pod的状态。例如,你可以检查Pod是否已经被调度到某个节点上,或者容器是否已经启动并正在运行。

总的来说,使用Python创建Kubernetes Pod的原理就是通过Kubernetes API与集群进行交互,并使用Python客户端库来发送包含Pod规格的请求到API服务器。API服务器处理这些请求,并在集群中创建和管理Pod。

帮助文档

考试要求 创建pod,deployment,job(开发)

1.安装Openstack框架

模糊查询软件包名称

[root@controller ~]# yum list *-openstack-train

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com

    Available Packages

    centos-release-openstack-train.noarch 1-1.el7.centos extras

安装

[root@controller ~]# yum -y install centos-release-openstack-train

2.升级所有的软件包

自动检查所有可升级的软件包并升级

[root@controller ~]# yum upgrade -y

3.安装openstack客户端

[root@controller ~]# yum install -y python-openstackclient

4.查看openstack的版本号

[root@controller ~]# openstack --version

openstack 4.0.2

1.上传openStack-train.iso文件到/opt目录下

[root@controller opt]# du -sh *

0 mydriver

16G openStack-train.iso

2.将镜像文件挂载到文件夹中,即可访问镜像文件内容

[root@controller opt]# mkdir openstack

[root@controller opt]# ls

mydriver openstack openStack-train.iso

挂载命令:将镜像文件挂载到/opt/openstack

[root@controller opt]# mount openStack-train.iso openstack/

mount: /dev/loop0 is write-protected, mounting read-only

[root@controller opt]# df -H

...略

/dev/loop0 17G 17G 0 100% /opt/openstack

3.备份原有的yum的配置文件

[root@controller openstack]# cd /etc/yum.repos.d/

[root@controller yum.repos.d]# ls

CentOS-Base.repo CentOS-OpenStack-train.repo repo.bak

将阿里源改名,避免覆盖官方源备份

[root@controller yum.repos.d]# mv CentOS-Base.repo CentOS-ALIBABA-Base.repo

移动repo文件到备份目录

[root@controller yum.repos.d]# mv *.repo repo.bak/

4.编写本地YUM源文件,指向本地文件

[root@controller yum.repos.d]# vi OpenStack.repo

[base]

name=base

baseurl=file:///opt/openstack/base/

enable=1

gpgcheck=0

[extras]

name=extras

baseurl=file:///opt/openstack/extras/

enable=1

gpgcheck=0

[updates]

name=updates

baseurl=file:///opt/openstack/updates/

enable=1

gpgcheck=0

[train]

name=train

baseurl=file:///opt/openstack/train/

enable=1

gpgcheck=0

[virt]

name=virt

baseurl=file:///opt/openstack/virt/

enable=1

gpgcheck=0

5.清除原有的YUM源缓存并重建缓存

[root@controller ~]# yum clean all

重建缓存

[root@controller ~]# yum makecache

检查yum源

[root@controller ~]# yum repolist

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

repo id repo name status

base base 10,039

extras extras 500

train train 3,168

updates updates 3,182

virt virt 63

repolist: 16,952

长期挂载,避免重启丢失

[root@controller ~]# vi /etc/fstab

在最后添加如下内容

/opt/openStack-train.iso /opt/openstack/ iso9660 defaults,loop 0 0

使用python在k8s中创建一个pod的更多相关文章

  1. 【Kubernetes】在K8s中创建StatefulSet

    在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...

  2. 在K8s中创建StatefulSet

    在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...

  3. kubenetes创建一个pod应用

    Pod是可以创建和管理Kubernetes计算的最小可部署单元.一个Pod代表着集群中运行的一个进程.每个pod都有一个唯一的ip. 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker) ...

  4. 创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来

    /*4.创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来*/ #import <Foundation/Foundation.h>#defin ...

  5. Ionic 2 中创建一个照片倾斜浏览组件

    内容简介 今天介绍一个新的UI元素,就是当我们改变设备的方向时,我们可以看到照片的不同部分,有一种身临其境的感觉,类似于360全景视图在移动设备上的应用. 倾斜照片浏览 Ionic 2 实例开发 新增 ...

  6. iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 四.创建任意时间之前开始的提醒 现在我们找到了指定源中的指定日 ...

  7. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  8. Eclipse中创建一个新的SpringBoot项目

    在Eclipse中创建一个新的spring Boot项目: 1. 首先在Eclipse中安装STS插件:在Eclipse主窗口中点击 Help -> Eclipse Marketplace... ...

  9. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  10. 父类是在子类创建对象时候 在子类中创建一个super内存空间

    父类是在子类创建对象时候 在子类中创建一个super内存空间

随机推荐

  1. 实训篇-Html-表格练习2

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. threading的定时器模块,python,每间隔一段时间执行一次任务

    工作中常有一些定时任务要处理,比如使用百度的接口,它的access_token是一个更新一次的,每次使用时总是请求会很慢,所以我们把它保存起来,用定时器模块,定时在过期之前请求一次,或者定时数据同步, ...

  3. kubernetes集群最新版安装

    原文地址:https://haiyux.cc/2022/09/21/k8s-install/ 虚拟机准备 我这里准备了三台虚拟机,分别部署一个master和两个node,操作系统位ubuntu 20. ...

  4. 【Oracle】PL/SQL制作唯一标识,固定字段+日期+流水码,流水码每日重置

    [Oracle]PL/SQL制作唯一标识,固定字段+日期+流水码,流水码每日重置 首先创建序列 create sequence sequence_name minvalue 0 maxvalue 99 ...

  5. CPU静默数据错误:存储系统数据不丢不错的设计思考

    简介: 对于数据存储系统来说,保障数据不丢不错是底线,也是数据存储系统最难的部分.据统计,丢失数据中心10天的企业,93%会在1年内破产.那么如果想要做到数据不丢不错,我们可以采取怎样的措施呢? 作者 ...

  6. [FAQ] 快速上手 Final Cut Pro X 的入门教程

    FinalCutPro视频剪辑 基本操作教学,看下面的视频作为一个大致了解.另外遇到其它问题再针对性搜索解决即可. > 在线CF靶场 射击消除烦闷 Link:https://www.cnblog ...

  7. WPF 对接 Vortice 调用 WIC 加载图片

    本文将告诉大家如何通过 Vortice 库从底层的方式使用 WIC 层加载本地图片文件,解码为 IWICBitmap 图片,然后将 IWICBitmap 图片交给 WPF 进行渲染 本文的前置博客:W ...

  8. dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量

    如果使用某个变量去获取某个类型的对象创建,但是在这个类型的构造函数调用时抛出异常,请问此变量是否可以拿到对应的对象 如下面代码 private void F1() { Foo foo = null; ...

  9. Pod进阶篇:污点-容忍度-亲和性-Affinity-调度(5)

    一.Pod资源清单详细解读 apiVersion: v1 #版本号,例如 v1 kind: Pod #资源类型,如 Pod metadata: #元数据 name: string # Pod 名字 n ...

  10. 51k+ Star!动画图解、一键运行的数据结构与算法教程!

    大家好,我是 Java陈序员. 我们都知道,<数据结构与算法> -- 是程序员的必修课. 无论是使用什么编程语音,亦或者是前后端开发,都需要修好<数据结构与算法>这门课! 在各 ...