【发布时间】:2019-11-11 06:45:16
【问题描述】:
我正在关注 Google Cloud Platform 的本教程:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app。基本上,我从 Github 上克隆了示例 hello-app 项目在 Google Cloud(使用 Google Cloud Shell)和本地机器上,因为我想使用云方法和本地机器(使用 Google Cloud SDK)练习完成本教程- 然后我会将 Docker 映像推送到云端,然后在 Kubernetes 上构建并运行它。
1- 我的第一次,当我进入第 8 步时,我将源代码字符串从“Hello, World”更改为“Hello, world!版本 2”,以及 Go 文件中的字符串“版本:1.0.0”到“版本:2.0.0”,基本上是以下行:
fmt.Fprintf(w, "Hello, world! Version 2\n")
fmt.Fprintf(w, "Version: 2.0.0\n")
我意识到我更改了本地机器上的源代码(不是云端的那个)。然后我去了控制台中的 Google Cloud Shell,使用v2 标签重新构建了一个 Docker 映像,然后将其推送到 Google Container Registry(没有意识到我正在从存储在云,而不是我本地机器上的那个)。当我使用 kubectl 对现有部署应用滚动更新并使用映像更新时,毫不奇怪,它不起作用。
所以基本上要解决这个问题,我需要从本地机器上的(更改的)源代码项目构建一个映像,并将该映像推送到 Google Container Registry(使用 Google Cloud SDK shell)。这就是理论(我至少根据我的理解假设)。我创建了一个具有完全相同标签(即 v2)的映像,记住已经在 Container Registry 中存储了一个 v2 映像(具有未更改的代码),这是我上一步完成的。我想知道它是否会简单地覆盖 Container Registry 中的现有映像,它确实做到了(查看 Container Registry > Images 部分,我可以看到几秒钟前显示的带有更新的 v2 映像)。
现在一切都为最后一步做好了准备,即通过映像更新对现有部署应用滚动更新:
kubectl set image deployment/hello-web hello-web=gcr.io/${PROJECT_ID}/hello-app:v2
当我收到回复时,这很成功:
deployment.extensions/hello-web image updated
但是,当我导航到 Kubernetes Engine > Workloads 以查看在 Kubernetes 上部署的应用程序时,虽然状态显示 = OK,但在 Managed pods 部分它显示了从昨天和前一天运行的 Pod(在Created on 日期列),而不是今天(6 月 29 日)的部署:
1 (a) - 这让我想到了一个问题(仍然与第一个问题有关),上表中的 Revision 列,这是否意味着我从映像部署新 pod 的次数?因为确实我确实尝试了几次这一步,但徒劳地试图解决这个问题(我想可能是 4 次)。
回到主要问题,同样,如果我尝试使用负载均衡器服务的外部 IP 来加载站点,它不会显示更改的代码。此外,当我检查 Container Registry 中推送的最新映像时,通过导航到 Container Registry > Images,我可以看到几分钟前上传的映像的 v2。所以 Container Registry 确实有我上传的最新镜像(意味着它覆盖了 Container Registry 中相同镜像名称的先前版本 2。否则如果无法覆盖它应该会失败)。所以我不太明白,最后一步(下面)不应该是从 Container Registry 部署最后一个镜像 v2 吗?:
kubectl set image deployment/hello-web hello-web=gcr.io/${PROJECT_ID}/hello-app:v2
我不确定我错过了什么。
2- 由于我是 Docker 新手,我想知道有没有办法从 Container Registry 中提取镜像,并查看镜像中的源代码。否则,如何验证哪个 Image 包含哪个版本的源代码?这可能会导致很多混乱,许多版本的图像以及同样多版本的源代码历史更改。你怎么知道哪个源代码提交对应于哪个 Docker 镜像?
3- 最后,任何人都可以就不同场景下管理 Kubernetes 的最佳实践提出建议。假设您从更新的映像版本部署了容器,但在出现问题或缺少功能后才意识到,因此您希望回滚到以前的部署。那么是否有管理此类场景的最佳实践。
对于冗长的文字表示歉意,并在此先感谢您。
【问题讨论】:
标签: docker kubernetes google-cloud-platform google-kubernetes-engine