【问题标题】:Kubernetes Multiple Service ConflictKubernetes 多服务冲突
【发布时间】:2018-12-05 17:23:50
【问题描述】:

我是 Kubernetes 的新手。我在 Amazon EKS 上创建了一个 Kubernetes 集群。 我正在尝试设置多个 kubernetes 服务以在一个集群中运行多个 ASP.NET 应用程序。但面临一个奇怪的问题。

只有 1 项服务时一切正常。但是,每当我为第二个应用程序创建第二个服务时,它都会产生冲突。冲突有时是服务 1 url 加载服务 2 应用程序,有时它会加载服务 1 应用程序,并且在简单页面重新加载时服务 2 url 也会发生同样的情况。

我已经尝试过 Amazon Classic ELB(使用 LoadBalancer 服务类型)和 Nginx Ingress 控制器(使用 ClusterIp 服务类型)。此错误在两种方法中都很常见。

服务和部署都在端口 80 上运行,我什至为服务和部署尝试了不同的端口以避免端口冲突但同样的问题。

我检查了部署和服务状态,并且 pod 日志一切正常。完全没有错误或警告

请指导我如何解决此错误。 这是 nginx 入口的两个服务的 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: {}

谢谢

【问题讨论】:

  • 可以提供服务yamls吗?
  • 感谢您的回复。这是我用来创建服务的命令。 kubectl expose deployment app1-deployment --type=ClusterIP --name=app1-svc
  • 我想知道服务和部署中使用的标签选择器。这就是为什么要求 yamls,而不是命令。
  • 对不起,我刚刚用 yamls 更新了问题。如果您还需要什么,请告诉我。

标签: amazon-web-services asp.net-core kubernetes kubernetes-ingress amazon-eks


【解决方案1】:

问题在于服务中的选择器。他们都有相同的选择器,这就是你面临这个问题的原因。所以它们都将指向同一组 pod。

Service 所针对的 Pod 集(通常)由标签选择器确定

由于 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-deploymenthello-deployment有不同的选择器。所以将它们暴露给服务不会相互冲突。

当您使用kubectl expose deployment app1-deployment --type=ClusterIP --name=app1-svc 公开部署时,服务将具有与部署相同的选择器。

【讨论】:

  • 非常感谢您的简短回答。它真的很有帮助。真的真的很感激。再次感谢 :-) 干杯
猜你喜欢
  • 2019-04-15
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多