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配置文件的使用,要理解每个标签的含义,这样才能在以后的不同容器部署中,做出相应的配置。

Logo

开源、云原生的融合云平台

更多推荐