• Kubernetes Python Client 初体验之Deployment


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

  • 相关阅读:
    【转】Mongo初体验
    公益图书馆-学习笔记六 volist嵌套
    公益图书馆-学习笔记五-jquery来动态设置div高度
    公益图书馆-学习笔记四-复选框及jquery的onchange函数
    JQuery学习
    公益图书馆-学习笔记三
    公益图书馆-OnshelfController-代码学习
    公益图书馆-学习笔记二
    相似图像搜索从训练到服务全过程
    pickle 基础用法
  • 原文地址:https://www.cnblogs.com/lippon/p/14117726.html
Copyright © 2020-2023  润新知