docker - Kubernetes和Docker:如何让两个服务正确通信

标签 docker kubernetes environment-variables load-balancing microservices

我有两个Java微服务( caller.jar ,调用被称为.jar )

我们可以通过 env-var CALLERPORT设置 call 者服务http端口,并通过env-var CALLEDADDRESS设置被叫服务的地址。
因此,调用方使用两个env-var。

我们还必须设置称为 service env-var CALLEDPORT的,以便设置被调用服务正在侦听HTTP请求的特定http端口。

我不知道确切如何从Dockerfile中公开这些变量,以便使用Kubernetes进行设置。

这是我制作两个Dockerfile的方法:

调用方的Dockerfile

FROM openjdk:8-jdk-alpine

# ENV CALLERPORT     (it's own port)
# ENV CALLEDADDRESS  (the other service address)

ADD caller.jar /

CMD ["java", "-jar", "caller.jar"]

名为的Dockerfile
FROM openjdk:8-jdk-alpine

# ENV CALLEDPORT (it's own port)

ADD called.jar /

CMD ["java", "-jar", "called.jar"]

通过这些,我制作了两个 Docker镜像:
  • 我的帐户/ call 者
  • myaccount /称为

  • 然后,我做了两个Deployments.yaml,以便让K8s使用副本和负载平衡器部署(在minikube上)两个微服务。

    Deployment-caller.yaml
    apiVersion: v1
    kind: Service              
    metadata:
      name: caller-loadbalancer
    spec:
      type: LoadBalancer       
      ports:
      - port: 8080               
        targetPort: 8080        
      selector:            
        app: caller    
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: caller
      labels:
        app: caller
    spec:
      replicas: 2                                             
      minReadySeconds: 15
      strategy:
        type: RollingUpdate                                   
        rollingUpdate: 
          maxUnavailable: 1                                   
          maxSurge: 1                                         
      selector:
        matchLabels:
          app: caller
          tier: caller
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: caller
            tier: caller
        spec:
          containers:
          - image: myaccount/caller
            name: caller
            env:
            - name: CALLERPORT
              value: "8080"
            - name: CALLEDADDRESS
              value: called-loadbalancer  # WHAT TO PUT HERE?!
            ports:
            - containerPort: 8080
              name: caller
    

    部署称为.yaml
    apiVersion: v1
    kind: Service              
    metadata:
      name: called-loadbalancer
    spec:
      type: LoadBalancer       
      ports:
      - port: 8081               
        targetPort: 8081        
      selector:            
        app: called    
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: called
      labels:
        app: called
    spec:
      replicas: 2                                             
      minReadySeconds: 15
      strategy:
        type: RollingUpdate                                   
        rollingUpdate: 
          maxUnavailable: 1                                   
          maxSurge: 1                                         
      selector:
        matchLabels:
          app: called
          tier: called
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: called
            tier: called
        spec:
          containers:
          - image: myaccount/called
            name: called
            env:
            - name: CALLEDPORT
              value: "8081"
            ports:
            - containerPort: 8081
              name: called
    

    重要提示:
    如果单独调用单个服务(例如调用运行状况检查端点),则可以很好地工作,但是,当调用涉及两个服务之间的通信的端点时,就会出现此错误:

    java.net.UnknownHostException: called



    Pod正确运行且处于 Activity 状态,但是我想问题是Deployment.yaml的一部分,在其中必须定义如何查找指向的服务,因此在这里:
    spec:
      containers:
        - image: myaccount/caller
          name: caller
          env:
            - name: CALLERPORT
              value: "8080"
            - name: CALLEDADDRESS
              value: called-loadbalancer  # WHAT TO PUT HERE?!
            ports:
            - containerPort: 8080
              name: caller
    

    都没有
    called
    

    也不
    called-loadbalancer
    

    也不
    http://caller 
    
    
    kubectl get pods,svc -o wide
    
    NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE       NOMINATED NODE   READINESS GATES
    pod/called-855cc4d89b-4gf97   1/1       Running   0          3m23s     172.17.0.4   minikube   <none>           <none>
    pod/called-855cc4d89b-6268l   1/1       Running   0          3m23s     172.17.0.5   minikube   <none>           <none>
    pod/caller-696956867b-9n7zc   1/1       Running   0          106s      172.17.0.6   minikube   <none>           <none>
    pod/caller-696956867b-djwsn   1/1       Running   0          106s      172.17.0.7   minikube   <none>           <none>
    
    NAME                          TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE       SELECTOR
    service/called-loadbalancer   LoadBalancer   10.99.14.91    <pending>     8081:30161/TCP   171m      app=called
    service/caller-loadbalancer   LoadBalancer   10.107.9.108   <pending>     8080:30078/TCP   65m       app=caller
    service/kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          177m      <none>
    

    如果放在deploy.yaml的这一行中,则可以正常工作。
    那该放在那一行呢?

    最佳答案

    关于docker - Kubernetes和Docker:如何让两个服务正确通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54249672/

    相关文章:

    amazon-web-services - 无法为作为 AWS::CloudFormation::CustomResource 执行的 aws lambda 函数设置环境变量

    docker - 将 “aaa.bbb”变量传递给Docker容器进程

    elasticsearch - 官方Dockerfile使用apt-get命令

    php - 在PHP Web应用程序中无法访问Docker环境变量

    docker - 运行多个 docker compose

    docker - kubernetes 上的 hyperledger - kubernetes 如何知道链码容器

    kubernetes - GKE 中的容器无法 ping 同一网络上的计算实例

    R环境和函数调用栈

    docker - 在 Dockerfile 和 docker-compose.yml 之间同步数字用户 ID?

    kubernetes - 通过 RBAC 限制对 Kubernetes secret 的访问