Kubernetes 如何进行 Deployment 来更新镜像

新手上路,请多包涵

我确实使用单个 pod 进行了部署,我的自定义 docker 映像如下:

 containers:
  - name: mycontainer
    image: myimage:latest

在开发过程中,我想推送新的最新版本并更新部署。找不到如何做到这一点,没有明确定义标签/版本并为每个构建增加它,然后做

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

原文由 Andriy Kopachevskyy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 725
2 个回答

您可以为 pod 配置宽限期(例如 30 秒或更长时间,具体取决于容器启动时间和映像大小)并设置 "imagePullPolicy: "Always" 。并使用 kubectl delete pod pod_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

它实际上会触发滚动更新,但请确保您还设置了 imagePullPolicy: "Always"

更新:

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

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

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

原文由 Camil 发布,翻译遵循 CC BY-SA 3.0 许可协议

更新 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

原文由 Przemek Nowak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题