【问题标题】:Kubernetes java-api update container imageKubernetes java-api 更新容器镜像
【发布时间】:2016-03-08 17:03:08
【问题描述】:

我正在尝试使用 Gradle 和 Fabric8 Java kubernetes-client 在 CI 中自动部署测试构建。

我正在尝试找到正确的语法来使用新的 Docker 映像标记(不是:最新)更新 RC。

类似...

client.replacationControllers()
      .inNamespace('default')
      .withName('mycirc')
      .edit()
      .editSpec()
      .editTemplate()
        .editSpec()
          .withContainer('mycontainername')
            .withImage('myimage:newtag')
          .endContainer()   // <--- Not sure how to do this previous line
        .endSpec()
      .endTemplate()
      .endSpec()
      .done()

我们能否在不必完全删除和重建容器的情况下更新容器?

【问题讨论】:

  • 你可以在 RC 中更新镜像(试试kubectl edit rc &lt;name&gt;),除非你杀死所有容器,否则它不会生效。滚动更新将慢慢推出新图像。我对 Gradle 了解不多,无法发表评论,所以我给你 Kubernetes 的答案。

标签: java api client kubernetes fabric8


【解决方案1】:

这里有一个更新图像的示例: https://github.com/fabric8io/kubernetes-client/blob/master/kubernetes-examples/src/main/java/io/fabric8/kubernetes/examples/FullExample.java#L136

            // Update the RC - change the image to apache
            client.replicationControllers().inNamespace("thisisatest").withName("nginx-controller").edit().editSpec().editTemplate().withNewSpec()
                    .addNewContainer().withName("nginx").withImage("httpd")
                    .addNewPort().withContainerPort(80).endPort()
                    .endContainer()
                    .endSpec()
                    .endTemplate()
                    .endSpec().done();

尽管正如 cmets 中所指出的,这可能不会立即更新 pod,除非客户端正在这样做。

看起来客户端也支持滚动更新,这将更新 pod: client.replicationControllers().inNamespace("thisisatest").withName("nginx-controller").rolling().updateImage("nginx");

【讨论】:

    【解决方案2】:

    您还可以通过以下代码对副本集进行滚动更新

        private static void updateRc(KubernetesClient client){
            System.out.println("updating rollinh");
           // client.replicationControllers().inNamespace("default").withName("my-nginx").rolling().updateImage("nginx:latest");
            client.extensions().replicaSets().inNamespace("default").withName("fgrg-73-nginxcontainer1-74-97775d4d8").rolling().updateImage("nginx:latest");
            System.out.println("done");
        }

    【讨论】:

    • 通过api进行滚动更新的一种方法是首先检查deployment.spec.updateStrategy是否为RollingUpdate,如果不是,则在此之后更新它,只需使用新的图像标签编辑部署。
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多