我正在 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
让我知道此解决方案是否对您有帮助。