当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯如何部署更新图像

惠泳
2023-03-14

我确实部署了单吊舱,自定义docker映像如下:

containers:
  - name: mycontainer
    image: myimage:latest

在开发过程中,我希望推送新的最新版本并更新部署。如果不明确定义标记/版本并为每个构建增加它,就找不到如何做到这一点,并且

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1

共有3个答案

钱运浩
2023-03-14
kubectl rollout restart deployment myapp

这是触发滚动更新并保留旧副本集的当前方式,用于kubectl卷展栏提供的其他操作,如回滚。

章昊
2023-03-14

更新2019-06-24

基于@Jodiug注释,如果您有1.15版本,您可以使用以下命令:

kubectl rollout restart deployment/demo

阅读更多关于这个问题的信息:

https://github.com/kubernetes/kubernetes/issues/13488

在kubernetes GitHub项目中有一个关于这个主题的有趣的讨论。见本期:https://github.com/kubernetes/kubernetes/issues/33664

根据这里描述的解决方案,我建议从两个方案中选择一个。

1.准备部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2.部署

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml
kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

当然,这两种情况都需要imagePullPolicy:Always

唐威
2023-03-14

您可以使用宽限期(例如30秒或更长时间,取决于容器启动时间和映像大小)配置您的pod,并设置“imagePullPolicy:”Always“。然后使用kubectl delete pod\u name。将创建一个新容器并自动下载最新映像,然后终止旧容器。

例子:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

我目前正在使用Jenkins进行自动构建和图像标记,它看起来像这样:

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

另一个技巧是初始运行:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

然后:

kubectl set image deployment/my-deployment mycontainer=myimage

它实际上会触发滚动更新,但请确保您还设置了ImagePull策略:"始终"

更新:

我发现的另一个不必更改图像名称的技巧是更改将触发滚动更新的字段的值,如terminationGracePeriodSeconds。您可以使用kubectl edit deployment your_deploymentkubectl apply-f your_deployment来执行此操作。yaml或使用如下修补程序:

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

只需确保始终更改数值即可。

 类似资料:
  • 我遵循了一些指南,我已经用谷歌容器引擎和谷歌容器注册表设置了CI。问题是我的更新没有应用到部署中。 这就是我的部署。yml包含Kubernetes服务和部署: 作为CI过程的一部分,我运行了一个脚本来更新google cloud registry中的图像,然后运行。这两项任务都成功了,我收到通知,部署和服务已更新: 由于我在图像中添加了标记,我以为每次更新部署时都会下载图像。根据文档a也应该是默认

  • 我正在尝试在Kubernetes集群(Azure AKS)中部署Flink作业。作业群集在启动后立即中止,但任务管理器运行正常。 docker镜像创建成功,没有任何异常。我可以运行docker镜像,也可以SSHdocker镜像。 我已经按照以下链接中提到的步骤: https://github.com/apache/flink/tree/release-1.9/flink-container/kub

  • 我有以下代码: 我创建了一个包含上述Python代码的映像的部署。 当我使用my Python代码不会创建sig文件指示,也不会打印“完成”消息。 点击此链接:https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace我看到k8s发送SIG

  • 我们已经让我们的数据库在谷歌云中的库伯内特斯集群(部署到我们的专用网络)上运行了几个月。上周我们注意到由于某种原因,所有底层节点(VM)的IP地址都发生了变化。这导致了中断。我们一直在使用库伯内特斯的NodePort配置为我们的服务访问我们的数据库(https://kubernetes.io/docs/concepts/services-networking/service/#nodeport)。

  • 我怎样才能使用入口呢?我尝试使用NodePort和--Target etPort=1001,我在servicePort中添加了80在。 kubectl公开部署测试--Target-port=1001--type=NodePort 我得到了错误 找不到后端-404 我使用的是正确的方法还是需要遵循其他方法?

  • 我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url