为什么不存在的映像可以在Kubernetes部署中工作

时间:2020-06-01 13:26:03

标签: docker kubernetes microservices

首先,我创建了以下两个不同版本的图像

docker image ls

REPOSITORY     |    TAG      |    IMAGE ID
isaac88/posts  |    0.0.1    |    xxx
isaac88/posts  |    0.0.5    |    yyy

然后我创建了一个如下所示的kubernetes部署文件

posts-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
        - name: posts
          image: isaac88/posts:0.0.1

如果您注意到了,我在部署yaml文件中指定了映像的版本。通过在0.0.10.0.5之间交换版本,并在以下命令中执行以查看差异

  1. kubectl apply -f posts-depl.yaml
  2. kubectl get pods
  3. kubectl logs xxxxxxxxx

到目前为止一切正常。

现在,我尝试从部署Yaml中删除0.0.1,我想知道它的行为,因为我没有将最新版本标记到我的Docker映像中。我已经使用docker image ls

进行了验证

下面是我最新的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
        - name: posts
          image: isaac88/posts

删除版本后,我运行了kubectl apply -f posts-depl.yaml,令人惊讶的是它能够成功创建部署,并且我继续对创建的最新Pod执行kubectl logs xxxxx,我看到了属于版本0.0.1。我不明白背后的原因

2 个答案:

答案 0 :(得分:3)

这是因为您的部署无法获取带有最新标签的图像 并回滚到您指定标签0.0.1

的部署的先前版本

滚动更新是更新应用程序运行版本的默认策略。

您可以详细了解here

答案 1 :(得分:2)

这可能是因为部署仍在使用旧映像。通过使用kubectl get events检查是否存在失败的图像提取事件,并通过kubectl rollout history deployment.v1.apps/posts-depl检查部署历史。

通过kubectl describe deployment posts-depl

检查部署中当前正在使用的映像