AWS EKS 部署更新现有部署



我正在 EKS AWS 上工作并陷入困境,因为每当我想在一些更改后再次部署相同的代码时,我必须删除以前的部署并使用新映像创建,在 ECR 中拉取新映像(kubectl 删除 abcproj.json)后,这会破坏旧的 pods(负载均衡器)并创建一个新的 Pod,结果它总是给我新的外部 IP。我想防止这个问题,但在互联网上找不到合适的解决方案。

提前感谢!

从 Kubernetes 的角度来看,你可以尝试执行以下操作:

  • 创建部署
  • 创建单独的服务对象类型LoadBalancer,该类型将指向您的应用程序
  • 测试它
  • 创建新部署来代替旧部署
  • 再次测试

YAML的示例:

创建部署

下面是 hello 应用程序的部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
selector:
matchLabels:
app: hello
version: 1.0.0
replicas: 1
template:
metadata:
labels:
app: hello
version: 1.0.0
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:1.0"
env:
- name: "PORT"
value: "50001"

具体看看matchLabels的部分内容。

创建将指向应用程序的LoadBalancer的服务对象类型

下面是将允许访问 hello 应用程序的示例服务:

apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- port: 50001
targetPort: 50001
type: LoadBalancer

再一次具体看看selector。它将按名为app的标签匹配 Pod,值为hello

您可以参考官方文档:这里!

测试它

应用这两个YAML定义并等待分配ExternalIP。之后,检查应用程序是否正常工作。

具有旧应用程序版本的Web浏览器的输出:

Hello, world!
Version: 1.0.0
Hostname: hello-549db57dfd-g746m

创建新部署来代替旧部署

在此步骤中,您可以尝试:

  • 在新版本上运行kubectl apply -f DEPLOYMENT.yaml以应用差异
  • 首先尝试删除Deployment并创建一个新来代替旧。

在此步骤中,请勿删除现有LoadBalancer

使用上面的示例Deployment,我们可以通过更改以下内容来模拟图像的版本更改:

image: "gcr.io/google-samples/hello-app:1.0"

自:

image: "gcr.io/google-samples/hello-app:2.0"

之后,您可以应用它或重新创建部署。

LoadBalancer不应该更改 IP 地址,因为它没有被重新创建。

再次测试

具有新应用程序版本的 Web 浏览器的输出:

Hello, world!
Version: 2.0.0
Hostname: hello-84d554cbdf-rbwgx

让我知道此解决方案是否对您有帮助。

最新更新