Kubernetes 多服务冲突
Kubernetes Multiple Service Conflict
我是 Kubernetes 的新手。我在 Amazon EKS 上创建了一个 Kubernetes 集群。
我正在尝试为一个集群中的 运行 多个 ASP.NET 应用程序设置多个 kubernetes 服务。但是面临一个奇怪的问题。
当只有 1 项服务时,一切 运行 都很好。但是每当我为第二个应用程序创建第二个服务时,它就会产生冲突。冲突有时是服务 1 url 加载服务 2 应用程序,有时它加载服务 1 应用程序,服务 2 url 在简单页面重新加载时也会发生同样的情况。
我已经尝试过 Amazon Classic ELB(具有 LoadBalancer 服务类型)和 Nginx Ingress 控制器(具有 ClusterIp 服务类型)。此错误在两种方法中都很常见。
服务和部署都运行在端口 80 上,我什至为服务和部署尝试了不同的端口以避免端口冲突但同样的问题。
我检查了部署和服务状态,pod 日志一切正常。完全没有错误或警告
请指导我如何修复此错误。
这是 nginx ingress
两个服务的 yaml 文件
# Service 1 for deployment 1 (container port: 1120)
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2018-12-05T14:54:21Z
labels:
run: load-balancer-example
name: app1-svc
namespace: default
resourceVersion: "463919"
selfLink: /api/v1/namespaces/default/services/app1-svc
uid: a*****-****-****-****-**********c
spec:
clusterIP: 10.100.102.224
ports:
- port: 1120
protocol: TCP
targetPort: 1120
selector:
run: load-balancer-example
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
第二次服务
# Service 2 for deployment 2 (container port: 80)
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2018-12-05T10:13:33Z
labels:
run: load-balancer-example
name: app2-svc
namespace: default
resourceVersion: "437188"
selfLink: /api/v1/namespaces/default/services/app2-svc
uid: 6******-****-****-****-************0
spec:
clusterIP: 10.100.65.46
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: load-balancer-example
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
谢谢
问题出在服务中的 选择器 上。他们都有相同的 selector ,这就是你面临这个问题的原因。所以他们都将指向同一组 pods.
The set of Pods targeted by a Service is (usually) determined by a Label Selector
由于 deployemnt 1 和 deployment 2 不同(我认为),您应该在其中使用不同的选择器。然后公开部署。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
--
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
labels:
app: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: nightfury1204/hello_server
args:
- serve
ports:
- containerPort: 8080
以上两个部署 nginx-deployment
和 hello-deployment
有不同的选择器。所以将它们暴露在服务中不会相互冲突。
当您使用 kubectl expose deployment app1-deployment --type=ClusterIP --name=app1-svc
公开部署时,该服务将具有与部署相同的选择器。
我是 Kubernetes 的新手。我在 Amazon EKS 上创建了一个 Kubernetes 集群。 我正在尝试为一个集群中的 运行 多个 ASP.NET 应用程序设置多个 kubernetes 服务。但是面临一个奇怪的问题。
当只有 1 项服务时,一切 运行 都很好。但是每当我为第二个应用程序创建第二个服务时,它就会产生冲突。冲突有时是服务 1 url 加载服务 2 应用程序,有时它加载服务 1 应用程序,服务 2 url 在简单页面重新加载时也会发生同样的情况。
我已经尝试过 Amazon Classic ELB(具有 LoadBalancer 服务类型)和 Nginx Ingress 控制器(具有 ClusterIp 服务类型)。此错误在两种方法中都很常见。
服务和部署都运行在端口 80 上,我什至为服务和部署尝试了不同的端口以避免端口冲突但同样的问题。
我检查了部署和服务状态,pod 日志一切正常。完全没有错误或警告
请指导我如何修复此错误。 这是 nginx ingress
两个服务的 yaml 文件# Service 1 for deployment 1 (container port: 1120)
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2018-12-05T14:54:21Z
labels:
run: load-balancer-example
name: app1-svc
namespace: default
resourceVersion: "463919"
selfLink: /api/v1/namespaces/default/services/app1-svc
uid: a*****-****-****-****-**********c
spec:
clusterIP: 10.100.102.224
ports:
- port: 1120
protocol: TCP
targetPort: 1120
selector:
run: load-balancer-example
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
第二次服务
# Service 2 for deployment 2 (container port: 80)
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2018-12-05T10:13:33Z
labels:
run: load-balancer-example
name: app2-svc
namespace: default
resourceVersion: "437188"
selfLink: /api/v1/namespaces/default/services/app2-svc
uid: 6******-****-****-****-************0
spec:
clusterIP: 10.100.65.46
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: load-balancer-example
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
谢谢
问题出在服务中的 选择器 上。他们都有相同的 selector ,这就是你面临这个问题的原因。所以他们都将指向同一组 pods.
The set of Pods targeted by a Service is (usually) determined by a Label Selector
由于 deployemnt 1 和 deployment 2 不同(我认为),您应该在其中使用不同的选择器。然后公开部署。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
--
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
labels:
app: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: nightfury1204/hello_server
args:
- serve
ports:
- containerPort: 8080
以上两个部署 nginx-deployment
和 hello-deployment
有不同的选择器。所以将它们暴露在服务中不会相互冲突。
当您使用 kubectl expose deployment app1-deployment --type=ClusterIP --name=app1-svc
公开部署时,该服务将具有与部署相同的选择器。