繁体   English   中英

如何在 kubernetes 中向其他 pod 公开服务?

[英]How can I expose a service to other pods in 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 向其中任何一个发送请求。 如果一个崩溃,我希望仍然能够发送此请求。 过去我为此使用了负载平衡器。 负载均衡器的问题在于它们开放了一个公共 IP,在这个特定的场景中,我不再想要一个公共 IP。 我希望这个服务直接被其他 pod 调用,不需要公共 IP。

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

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 : 10.60.0.0/16 不同的子网我得到这个永无止境的<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 来服务通信吗?

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

故障排除

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

在此处输入图片说明

解决方案

从 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

使用仅创建集群内部 IP 而没有公共 IP 的 ClusterIP 服务(默认类型):

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

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

curl nginx-service

如果要从中访问 Service 的 Pod 位于不同的命名空间中,则必须使用 Service 的完全限定域名:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM