从 Kubernetes Python 客户端登录到 GitLab 存储库

2024-05-15

我有一个 Django 应用程序,它使用python 的官方 Kubernetes 客户端 https://github.com/kubernetes-client/python并且工作正常,但它只部署(正确)公共注册表。

有没有办法执行登录后让Kubernetes客户端自由拉取私有镜像?我不想直接执行cmd用于登录和图像拉取的命令..谢谢!


实际上,使用官方 Kubernetes Python 客户端很容易做到。您需要执行两个步骤:

  • 创建类型的秘密dockerconfigjson(可以通过命令行或使用 Python 客户端完成)- 您将您的凭据放在这里
  • 使用以下命令将此秘密添加到您的部署/pod 定义中imagePullSecrets这样 Kubernetes 客户端就可以从私有存储库中拉取镜像

创建类型的秘密dockerconfigjson:

Replace <something>与您的数据。

命令行:

kubectl create secret docker-registry private-registry \
 --docker-server=<your-registry-server> --docker-username=<your-name> \
 --docker-password=<your-pword> --docker-email=<your-email>

与 Kubernetes Python Client 中的等效(记住以安全方式传递变量password,例如检查this https://stackoverflow.com/questions/15209978/where-to-store-secret-keys-django):

import base64
import json
from kubernetes import client, config

config.load_kube_config()
v1 = client.CoreV1Api()

# Credentials
username = <your-name>
password = <your-pword>
mail = <your-email>
secret_name = "private-registry"
namespace = "default"

# Address of Docker repository - in case of Docker Hub just use https://index.docker.io/v1/
docker_server = <your-registry-server>

# Create auth token
auth_decoded = username + ":" + password
auth_decoded_bytes = auth_decoded.encode('ascii')
base64_auth_message_bytes = base64.b64encode(auth_decoded_bytes)
base64_auth_message = base64_auth_message_bytes.decode('ascii')

cred_payload = {
    "auths": {
        docker_server: {
            "username": username,
            "password": password,
            "email": mail,
            "auth": base64_auth_message
        }
    }
}

data = {
    ".dockerconfigjson": base64.b64encode(
        json.dumps(cred_payload).encode()
    ).decode()
}

secret = client.V1Secret(
    api_version="v1",
    data=data,
    kind="Secret",
    metadata=dict(name=secret_name, namespace=namespace),
    type="kubernetes.io/dockerconfigjson",
)

v1.create_namespaced_secret(namespace, body=secret)

使用以下命令将此秘密添加到您的部署/pod 定义中imagePullSecrets: option

现在,让我们开始使用新创建的秘密 - 取决于你想要如何部署 pod/部署,在 Python 代码中有两种方法:yaml文件或直接在代码中创建 pod/部署清单。我将展示这两种方法。和以前一样,替换<something>与您的数据。

Example yaml file:

apiVersion: v1
kind: Pod
metadata:
  name: private-registry-pod
spec:
  containers:
  - name: private-registry-container
    image: <your-private-image>
  imagePullSecrets:
  - name: private-registry

在最后一行我们指的是秘密docker-registry在上一步中创建。

让我们应用这个yaml使用 Kubernetes Python 客户端创建文件:

from os import path
import yaml
from kubernetes import client, config

config.load_kube_config()
v1 = client.CoreV1Api()

config_yaml = "pod.yaml"

with open(path.join(path.dirname(__file__), config_yaml)) as f:
        dep = yaml.safe_load(f)
        resp = v1.create_namespaced_pod(body=dep, namespace="default")
        print("Deployment created. status='%s'" % str(resp.status))

全部用 Python 代码编写 - pod 定义和应用过程:

from kubernetes import client, config
import time

config.load_kube_config()
v1 = client.CoreV1Api()

pod_name = "private-registry-pod"
secret_name = "private-registry"
namespace = "default"
container_name = "private-registry-container"
image = <your-private-image>

# Create a pod
print("Creating pod...")

pod_manifest= {
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": pod_name
  },
  "spec": {
    "containers": [
      {
        "name": container_name,
        "image": image
      }
    ],
    "imagePullSecrets": [
      {
        "name": secret_name
      }
    ]
  }
}

resp = v1.create_namespaced_pod(body=pod_manifest, namespace=namespace)

# Wait for a pod
while True:
    resp = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
    if resp.status.phase != 'Pending':
        break
    time.sleep(1)
    
print("Done.")

Sources:

  • Github 线程 https://github.com/kubernetes-client/python/issues/501
  • Stackoverflow 主题 https://stackoverflow.com/questions/56673919/kubernetes-python-api-client-execute-full-yaml-file
  • 官方 Kubernetes Python 客户端示例 https://github.com/kubernetes-client/python/blob/master/examples/pod_exec.py
  • 库伯内特斯文档 https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#inspecting-the-secret-regcred
  • 另一个 Kubernetes 文档 https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
  • Github 主题 https://github.com/kubeflow/kubeflow/issues/1748
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Kubernetes Python 客户端登录到 GitLab 存储库 的相关文章

  • on_delete=models.PROTECT 和 on_delete=models.CASCADE 在 Django 模型上有什么作用?

    我对 Django 很熟悉 但最近注意到有一个on delete models CASCADE and on delete models PROTECT模型的选项 on delete models CASCADE and on delete
  • 从字符串到类型的词法转换

    最近 我尝试用Python存储和读取文件中的信息 遇到了一个小问题 我想从文本文件中读取类型信息 从 string 到 int 或 float 的类型转换非常有效 但从 string 到 type 的类型转换似乎是另一个问题 当然 我尝试了
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • 如何使用Python将WebP图像转换为Gif?

    我已经尝试过这个 from PIL import Image im Image open this webp im save that gif gif save all True 这给了我这个错误 类型错误 不支持的操作数类型 tuple
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • 获取 Pod 处于挂起状态的平均时间

    我正在尝试使用 prometheus 计算 pod 在 grafana 中处于挂起状态的平均时间 我可以使用此查询生成一个图表 以获取一段时间内处于挂起状态的 Pod 数量 sum kube pod status phase phase P
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 错误:permission_manager_qt.cpp(82) 不支持的权限类型:13

    我正在开发具有内置浏览器功能的 python 代码 PyQt 5 13 import sys from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 QtWidgets imp
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 如何通过双击在浏览器中打开 ipynb 文件

    以前 我安装了 Canopy 当时 我只需双击 ipynb 文件并在浏览器中打开它们即可 但是 后来我需要Anaconda 一旦我安装了它 这个功能就没有了 现在我只希望能够简单地双击 ipynb 文件 然后该文件就会在 Firefox 中
  • matplotlib matshow 标签

    我一个月前开始使用 matplotlib 所以我仍在学习 我正在尝试用 matshow 制作热图 我的代码如下 data numpy array a reshape 4 4 cax ax matshow data interpolation
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide

随机推荐

  • 浅拷贝、深拷贝

    const Inner function Text this Text Text this Alert gt alert this Text Message const Outer function this Text Message Hi
  • 集群一致性哈希池为相同映射生成新的路由

    我有一个包含 2 个命令行项目的解决方案 它创建一个带有种子和客户端进程的 akka net 集群 种子启动集群 然后实例化一个一致哈希集群路由器 该路由器对实现我的接口 IHasRouting 的任何消息执行哈希映射 因此 任何 IHas
  • 如何用Block简化回调逻辑?

    假设我需要与一个提供协议的类进行通信 并在操作完成时调用委托方法 如下所示 protocol SomeObjectDelegate required void stuffDone id anObject void stuffFailed e
  • 当自定义子视图处理触摸时防止 UITableView 滚动

    在我的 iOS 应用程序中 有一个 UITableView 其中一个单元格中包含一个自定义子视图 该单元格是一个交互式视图 它处理触摸事件 touchesBegan touchesEnded touchesMoved 以更新自身 问题是 当
  • 如何表示未使用的函数参数?

    当 解构 元组时 我可以使用 表示我不感兴趣的元组元素 例如 gt gt gt a 1 2 3 gt gt gt a 1 使用 Python 2 x 如何用函数参数表达相同的内容 我尝试使用下划线 gt gt gt def f a retu
  • 全局变量 V.S. C++ 中的文件变量

    C 中的全局变量和文件变量有什么区别 Thanks 在 C 和 C 中 您可以通过在声明前面使用 static 关键字来使全局变量只能从声明它的文件中访问 不使用 static 关键字的全局变量可以从编译到程序中的任何 C 或 C 文件访问
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • Tkinter 框架滚动条

    我的目标是向其中有多个标签的框架添加一个垂直滚动条 一旦框架内的标签超过框架的高度 滚动条就会自动启用 经过一番搜索 我发现this https stackoverflow com questions 3085696 adding a sc
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • 如何在 Django 中将 pdf 作为电子邮件附件发送

    您好 我正在使用以下 2 个函数来创建并通过邮件即时发送 pdf 我究竟做错了什么 导出pdf功能在浏览器中显示时可以正常工作 我得到的错误是 类型错误 ContentFile 对象不支持索引 我做错了什么 几乎所有这些代码都来自一些博客
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 错误:超出最大更新深度。反应状态

    我收到此错误 我猜是由于反应状态爆发 但我不知道这里出了什么问题 所以我有父子关系组件 如下所示 父组件 class App extends Component constructor props super props this stat
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • X-Amz-Expires 是向 AWS 发出的请求所需的标头/参数吗?

    Is X Amz Expires必需的标头 参数 官方文档不一致 用在一些例子 http docs aws amazon com AmazonS3 latest API sigv4 query string auth html 虽然不在ot
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • OSError: [Errno 22] 当我尝试 .read() json 文件时

    我只是想用 Python 读取我的 json 文件 当我这样做时 我位于正确的文件夹中 我在 下载 中 我的文件名为 Books 5 json 但是 当我尝试使用 read 函数时 出现错误 OSError Errno 22 Invalid
  • 为什么 std::queue 使用 std::dequeue 作为底层默认容器?

    继续阅读cplusplus com http www cplusplus com reference queue queue std queue实现如下 队列被实现为容器适配器 这些类 使用特定容器类的封装对象作为其 底层容器 提供一组特定
  • HornetQ OutOfMemory 启动时带有大日志

    使用 HornetQ 2 0 0 CR2 独立 非集群服务器的默认配置 当我尝试使用大日志 gt 1Gb 启动服务器时 出现 OutOfMemory 异常 main 12 59 43 505 INFO org hornetq integra
  • 从 Kubernetes Python 客户端登录到 GitLab 存储库

    我有一个 Django 应用程序 它使用python 的官方 Kubernetes 客户端 https github com kubernetes client python并且工作正常 但它只部署 正确 公共注册表 有没有办法执行登录后让