Kubernetes官方推荐我们使用各种Controller来管理Pod的生命周期,今天写一个最常用的Deployment的操作例子。
首先是创建Deployment:
with open(path.join(path.dirname(__file__), "lede_test1.yml")) as f:
dep = yaml.safe_load(f)
resp = self.appApi.create_namespaced_deployment(
body=dep, namespace="default")
print("Deployment created. status='%s'" % resp.metadata.name)
在创建过程出现了很多错误,主要的原因是yaml配置文件的问题。很奇怪的是在master节点上使用kubectl apply相同的yaml文件都可以正常创建,放到python API中就有问题了。出现问题不要紧,更够学会看错误信息就能修正错误。IDE中得到的错误信息是json格式的,但是没有缩进,所以看起来很恼火,这里推荐使用https://www.json.cn/,可实现自动缩进功能,查看错误信息也就很方便了。
第一次运行后cluster返回如下信息:
{
"kind":"Status",
"apiVersion":"v1",
"metadata":{
},
"status":"Failure",
"message":"the API version in the data (apps/v1beta1) does not match the expected API version (apps/v1)",
"reason":"BadRequest",
"code":400
}
查看message中的错误提示,yaml文件的apiVersion与实际使用的API版本不一致,于是修改为apps/v1。
然后重新执行又返回如下错误:
{
"kind":"Status",
"apiVersion":"v1",
"metadata":{
},
"status":"Failure",
"message":"Deployment.apps "lede-test1" is invalid: [spec.selector: Required value, spec.template.metadata.labels: Invalid value: map[string]string{"app":"lede"}: `selector` does not match template `labels`]",
"reason":"Invalid",
"details":{
"name":"lede-test1",
"group":"apps",
"kind":"Deployment",
"causes":[
{
"reason":"FieldValueRequired",
"message":"Required value",
"field":"spec.selector"
},
{
"reason":"FieldValueInvalid",
"message":"Invalid value: map[string]string{"app":"lede"}: `selector` does not match template `labels`",
"field":"spec.template.metadata.labels"
}
]
},
"code":422
}
关键信息是selector does not match template labels
,原来是因为需要加入selector相应的label匹配信息,而我并没有写入selector,修改后终于创建成功。
在master节点上也可以看到depolyment和相应的pod正在运行.。
其中我的YAML配置文件为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: lede-test1
spec:
selector:
matchLabels:
app: lede-test
replicas: 1
template:
metadata:
labels:
app: lede-test
spec:
containers:
- name: lede
image: lede-17.01.5:latest
command: ["/bin/ash", "-ce", "tail -f /dev/null"]
imagePullPolicy: Never
然后是Deployment的删除,代码如下:
resp = self.appApi.delete_namespaced_deployment(
name="lede-test1",
namespace="default",
body=client.V1DeleteOptions(
propagation_policy='Foreground',
grace_period_seconds=5))
print("Deployment deleted. status='%s'" % str(resp.status))
其中需要传入想删除Deployment的名字,运行成功后输出结果如下。
经过这次api的使用,告诉我们应该熟悉yaml配置文件的使用,要理解每个标签的含义,这样才能在以后的不同容器部署中,做出相应的配置。