如何使用 Kubernetes python 客户端库部署 Knative 服务
How to deploy a Knative service with Kubernetes python client library
我们正在尝试使用 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"}
尝试使用 create_namespaced_custom_object
这里的服务是Knative特有的自定义资源。
kubernetes.client.V1Service
是对 Kubernetes“服务”概念的引用,它是跨 pods 的选择器,显示为网络端点,而不是 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 服务。
我们正在尝试使用 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"}
尝试使用 create_namespaced_custom_object
这里的服务是Knative特有的自定义资源。
kubernetes.client.V1Service
是对 Kubernetes“服务”概念的引用,它是跨 pods 的选择器,显示为网络端点,而不是 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 服务。