python - 如何使用 Kubernetes python 客户端库部署 Knative 服务

标签 python kubernetes knative

我们正在尝试使用 knative 和 Kubernetes 的 python 客户端库来部署服务。我们使用以下 yaml 文件:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: test-{{ test_id }}
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: test-deployment:latest
          resources:
            limits:
              cpu: 50m
              memory: 128Mi
            requests:
              cpu: 50m
              memory: 128Mi
      containerConcurrency: 1

如果我们使用kubernetes的命令行工具进行部署,是可以正常工作的。

kubectl create -f test.yaml

通过 python 客户端库,我们正在做:

import kubernetes
import yaml
import uuid

from jinja2 import Template
from urllib3 import exceptions as urllib_exceptions

api = kubernetes.client.CoreV1Api(api_client=kubernetes.config.load_kube_config(context=cluster))

with open(deployment_yaml_path, 'r') as file_reader:
    file_content = file_reader.read()

deployment_template = Template(file_content)

deployment_template = yaml.safe_load(template.render({
    'test_id': str(uuid.uuid4())
}))

deployment = kubernetes.client.V1Service(
    api_version=deployment_template['apiVersion'],
    kind="Service",
    metadata=deployment_template['metadata'],
    spec=deployment_template['spec']
)

try:
    response = api.create_namespaced_service(body=deployment, namespace='default')
except (kubernetes.client.rest.ApiException, urllib_exceptions.HTTPError):
    raise TestError

但是,我们收到此错误:

Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Audit-Id': 'a1968276-e16b-44f4-a40d-5eb5eaee9d47', 'Content-Type': 'application/json', 'Date': 'Thu, 23 Apr 2020 08:29:36 GMT', 'Content-Length': '347'})
HTTP response body: {
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "Service in version \"v1\" cannot be handled as a Service: no kind \"Service\" is registered for version \"serving.knative.dev/v1\" in scheme \"k8s.io/kubernetes/pkg/api/legacyscheme/scheme.go:30\"",
  "reason": "BadRequest",
  "code": 400
}

有没有办法用knative部署服务?据我了解,knative 服务与普通的 Kubernetes 服务不同。我不知道问题是否在于我尝试以错误的方式部署服务,或者 Kubernetes python 客户端库是否还不支持此部署。

编辑:

Python Client Library: kubernetes==11.0.0

Kubernetes: 
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.4", GitCommit:"67d2fcf276fcd9cf743ad4be9a9ef5828adc082f", GitTreeState:"clean", BuildDate:"2019-09-18T14:51:13Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15+", GitVersion:"v1.15.11-gke.5", GitCommit:"a5bf731ea129336a3cf32c3375317b3a626919d7", GitTreeState:"clean", BuildDate:"2020-03-31T02:49:49Z", GoVersion:"go1.12.17b4", Compiler:"gc", Platform:"linux/amd64"}

最佳答案

kubernetes.client.V1Service引用了 Kubernetes“服务”概念,它是跨 pod 的选择器,显示为网络端点,而不是 Knative“服务”概念,它是通过网络提供功能的整个应用程序。

基于this example from the kubernetes-client/python repo ,您需要执行以下操作来获取并使用 Knative 服务的客户端:

api = kubernetes.client.CustomObjectsApi()
try:
    resource = api.create_namespaced_custom_object(
        group="serving.knative.dev",
        version="v1",
        plural="services",
        namespace="default",
        body=deployment_template)
except (kubernetes.client.rest.ApiException, urllib_exceptions.HTTPError):
    raise TestError

如果您要经常这样做,您可能需要创建一个接受类似于 create_namespaced_service 的参数的助手。 ,也可能是类似于 kubernetes.client.V1Service 的包装对象简化 Knative 服务的创建。

关于python - 如何使用 Kubernetes python 客户端库部署 Knative 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61384188/

相关文章:

nginx - 如何增加knative服务的应用的执行时间?

linux - Knative 设置的确切系统要求是什么?为什么基本设置指南导致我资源耗尽?

python - Scrapy 输出提要国际 unicode 字符(例如日语字符)

kubernetes - 有没有一种方法可以加快水平Pod自动缩放器指标的扫描速度?现在,升级新 pods 需要两分钟

kubernetes - 如何解析 kubectl describe 输出并获取所需的字段值

kubernetes - 使用 RBAC 的 EKS Kubernetes 用户被视为系统 :anonymous

python - 使用django认证系统

python - 如何列出 pypy cffi 的 ffi 中的每个可用标识符?

python - 每次运行时清除函数中的列表

docker - KNative Service无法从Docker HUB下载Hello World镜像