如何将服务公开给kubernetes中的其他Pod?

时间:2019-11-25 18:40:01

标签: azure docker kubernetes azure-kubernetes

我有一个简单的服务

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

这是我的集群的外观。很简单。

$kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE                      NOMINATED NODE   READINESS GATES
my-shell-95cb5df57-cdj4z            1/1     Running   0          23m   10.60.1.32   aks-nodepool-19248108-0   <none>           <none>
nginx-deployment-76bf4969df-58d66   1/1     Running   0          36m   10.60.1.10   aks-nodepool-19248108-0   <none>           <none>
nginx-deployment-76bf4969df-jfkq7   1/1     Running   0          36m   10.60.1.21   aks-nodepool-19248108-0   <none>           <none>
$kubectl get services -o wide
NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE     SELECTOR
internal-ingress   LoadBalancer   10.0.0.194   10.60.1.35    80:30157/TCP   5m28s   app=nginx-deployment
kubernetes         ClusterIP      10.0.0.1     <none>        443/TCP        147m    <none>
$kubectl get rs -o wide
NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES        SELECTOR
my-shell-95cb5df57            1         1         1       23m   my-shell     ubuntu        pod-template-hash=95cb5df57,run=my-shell
nginx-deployment-76bf4969df   2         2         2       37m   nginx        nginx:1.7.9   app=nginx,pod-template-hash=76bf4969df

我看到我的Nginx应用有2个Pod。我希望能够从任何其他新Pod向其中一个发送请求。如果发生崩溃,我希望仍然能够发送此请求。 过去,我为此使用了负载平衡器。负载平衡器的问题在于它们开放了公共IP并在此特定情况下运行,我不再需要公共IP。我希望该服务在没有公共IP的情况下直接由其他Pod调用。

我尝试使用内部负载均衡器。

apiVersion: v1
kind: Service
metadata:
  name: internal-ingress
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "my-subnet"
spec:
  type: LoadBalancer
  loadBalancerIP: 10.60.1.45
  ports:
  - port: 80
  selector:
    app: nginx-deployment

问题在于,它在我的10.60.0.0/16网络中没有获得IP,如此处所述:https://docs.microsoft.com/en-us/azure/aks/internal-lb#specify-a-different-subnet 我得到了永无止境的<pending>

kubectl get services -o wide
NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE    SELECTOR
internal-ingress   LoadBalancer   10.0.0.230   <pending>     80:30638/TCP   15s    app=nginx-deployment
kubernetes         ClusterIP      10.0.0.1     <none>        443/TCP        136m   <none>

我想念什么?如何排除故障?甚至可以使用Pod进行服务通信吗?

2 个答案:

答案 0 :(得分:2)

根据您提供的消息,您似乎想要使用一个特殊的私有IP地址,该地址在子网中与AKS群集使用的相同。我认为可能的原因是您要使用的特殊IP地址已经由AKS分配,这意味着您无法使用它。

问题排查

因此,您需要引导至AKS群集使用的Vnet,并检查IP地址是否已在使用中。这是屏幕截图:

enter image description here

解决方案

从AKS使用的子网中选择AKS未分配的IP地址。 或者不要使用特殊的,让AKS动态分配您的负载均衡器。然后按如下所示更改您的YAML文件:

apiVersion: v1
kind: Service
metadata:
  name: internal-ingress
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx-deployment

答案 1 :(得分:0)

使用ClusterIP服务(默认类型),该服务仅创建群集内部IP,而不创建公用IP:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

然后,您可以使用服务名称作为DNS名称,从同一命名空间中的任何其他Pod访问服务(及其后的Pod):

curl nginx-service

如果要从中访问服务的Pod位于其他名称空间中,则必须使用服务的完全限定域名:

curl nginx-service.my-namespace.svc.cluster.local