【问题标题】:Kubernetes: communication between containers located in different podsKubernetes:位于不同 pod 中的容器之间的通信
【发布时间】:2019-08-12 13:24:15
【问题描述】:

我有两个通过 http 协议进行通信的微服务。

  • AC6K:从阿特拉斯·科普柯 6000 设备获取数据的 C# 微服务。

  • LocalWriter:从 AC6K 获取数据并将信息存储在数据库中的 python 应用程序

我已经在 Windows 和 Linux 环境中对其进行了测试,并且运行良好。当我对每个微服务进行竞争并进行部署时,没有通信。请在此处找到用于容器化和部署应用程序的相应 docker 和 yaml 文件

ac6k docker 文件:

FROM microsoft/aspnetcore-build

EXPOSE 5010

WORKDIR /app

COPY . .

RUN dotnet restore

ENTRYPOINT ["dotnet", "ac6kcore.dll"]




-  ac6kUp.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: ac6kcore
      labels:
        run: ac6kcore  
    spec:
      type: NodePort
      ports: 
      - port: 5010
        name: ac6kcore
        targetPort: 5010
        nodePort: 32766
        protocol: TCP
      selector:
        run: ac6kcore
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: ac6kcore
    spec:
      selector:
        matchLabels:
          run: ac6kcore
      replicas: 1
      template:
        metadata:
          labels:
            run: ac6kcore
        spec:
          hostNetwork: true
          containers:
          - image: afierro/ac6kcore:lw
            name: ac6kcore
            ports:
            - containerPort: 5010
          restartPolicy: Always

本地写入器 docker 文件:

FROM python:3.6

RUN mkdir -p /mongodbapp

WORKDIR /mongodbapp

COPY requirements.txt /mongodbapp

RUN pip install --no-cache-dir -r requirements.txt

ADD . /mongodbapp

EXPOSE 9090

CMD ["python", "runapp.py"]

- LocalWriter.yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: localwriter
  labels:
    app: localwriter
spec:
  type: NodePort
  ports:
  - port: 9090
    name: localwriter
    targetPort: 9090
    nodePort: 32756
    protocol: TCP
  selector:
    app: localwriter
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: localwriter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: localwriter
  template:
    metadata:
      labels:
        app: localwriter
    spec:
      containers:
      - name: flasknode
        image: afierro/localwriter:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 9090

提前致谢

【问题讨论】:

  • 您是否尝试过不使用 K8s 而在 Docker 中运行您的服务?
  • 根据您的描述,您的微服务在单个集群中运行,因此您必须通过将 ServiceType 设置为 type: ClusterIP 来将服务暴露在集群内部 IP 上。另外,能否请您显示kubectl get svc -o wide 的输出

标签: kubernetes containers microservices


【解决方案1】:

您使用服务将一个部署中的 pod 与另一个部署中的 pod 通信。

在这里查看服务:

https://kubernetes.io/docs/concepts/services-networking/service/

确保您在服务中有正确的选择器。

您可以使用 pod 内的环境变量来调用其他服务。 Kubernetes 使用服务 ip 和端口作为环境变量启动 pod,要检查这一点,您可以在 pod 中 ssh 并使用命令 printenv。

【讨论】:

  • 根据 Leandro Donizetti Soares 的说法,我输入了以下命令来查看环境变量,结果在我看来是多余的。
【解决方案2】:

根据 Leandro Donizetti Soares 的建议,我输入了以下命令查看环境变量,结果在我看来是多余的。

kubectl get pods

NAME                           READY   STATUS    RESTARTS   AGE
ac6kcore-77bc4c4987-dxn29      1/1     Running   0          14m
localwriter-55467c5495-px8m4   1/1     Running   0          14m
mongo                          1/1     Running   0          14m

kubectl exec ac6kcore-77bc4c4987-dxn29 -- printenv | grep SERVICE   

AC6KCORE_SERVICE_PORT_AC6KCORE=5010
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT_HTTPS=443
AC6KCORE_SERVICE_PORT=5010
AC6KCORE_SERVICE_HOST=10.107.208.212
LOCALWRITER_SERVICE_HOST=10.100.103.114
LOCALWRITER_SERVICE_PORT=9090
LOCALWRITER_SERVICE_PORT_LOCALWRITER=9090
KUBERNETES_SERVICE_PORT=443

kubectl exec localwriter-55467c5495-px8m4 -- printenv | grep SERVICE    

KUBERNETES_SERVICE_HOST=10.96.0.1
LOCALWRITER_SERVICE_PORT_LOCALWRITER=9090
AC6KCORE_SERVICE_PORT_AC6KCORE=5010
KUBERNETES_SERVICE_PORT=443
AC6KCORE_SERVICE_HOST=10.107.208.212
LOCALWRITER_SERVICE_PORT=9090
KUBERNETES_SERVICE_PORT_HTTPS=443
AC6KCORE_SERVICE_PORT=5010
LOCALWRITER_SERVICE_HOST=10.100.103.114

【讨论】:

  • 您想与哪个服务商联系?你有AC6CORE的服务端口和服务主机,你可以curl它,或者wget on AC6KCORE_SERVICE_HOST:AC6KCORE_SERVICE_PORT_AC6KCORE。您也可以通过 dns 访问服务,格式为:my-svc.my-namespace.svc.cluster.local 在您的情况下:ac6kcore.default..svc.cluster.local
  • 这里的重点是:ac6k用http协议发出一条消息,我希望它被本地写入器通过“localwriter”服务读取。
  • service 只是 pod 的抽象。与 ac6k 服务进行通信的是 localwriter pod。
  • 正确。我无法将来自 ac6k 的 http 消息发送到 k8s 集群中的 localwriter。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多