“ az网络公共IP创建”和“ az网络公共IP列表”显示了两个不同的IP

时间:2020-04-04 20:51:45

标签: azure kubernetes azure-kubernetes

我被Kubernetes弄湿了,我正在使用AKS和Docker Hub。我有一个通过Docker Compose设置的REST应用程序,该应用程序由九种相互交谈的微服务组成。现在,我正在尝试将其部署到AKS,因为从Docker Compose到Kubernetes,似乎并没有一种直接的方法通过单个Minikube实例连接服务。

也就是说,我需要服务能够通过REST相互调用,这导致我试图在AKS上设置静态IP。 (到现在为止,我本来可以使事情复杂化,但是仍然会感到湿wet。)这使我执行了以下两个命令:

1. az network public-ip create --resource-group <resourceGroup> --name <sameAsValueOf_resourceGroup>
   --allocation-method static

2. az network public-ip list --resource-group <resourceGroup> --query [0].ipAddress --output tsv

假定list命令应该返回与create命令相同的东西,但就我而言,不是。例如,create可能会将10.x.x.x显示为publicIp.ipAddress的值,但是此后不久,list可能会返回52.y.y.y

这完全与Microsoft的文档不一致,并且当我尝试按以下方式在我的k8s yaml中包含任一IP时,它会导致EXTERNAL-IP被卡在<Pending>上:

apiVersion: v1
kind: Service
metadata:
  name: warehouse-microservice
spec:
  type: LoadBalancer
  loadBalancerIP: 10.x.x.x
  ports:
  - port: 80
  selector:
    app: warehouse-microservice

在上面的yaml中,包括spec.ports[0].nodePort显然完全破坏了事情。但是,如果我取出spec.loadBalancerIP,然后然后添加spec.ports[0].nodePort,则所有内容突然都可以正常使用, 通过外部IP服务;只是IP是随机选择的。

所以我的问题是:尽管MS有文档说明,为什么createlist会显示两个不同的IP,我如何才能使其正常工作以分配静态外部IP?

1 个答案:

答案 0 :(得分:3)

创建新的AKS群集时,在后台创建了多个网络资源(在MC_${RESOURCE_GROUP_NAME}${CLUSTER_NAME}${LOCATION}资源组内部)。资源之一是静态公共IP(类似于您使用Azure CLI命令创建的IP)。您可以在MC resource group => Load balancer => Frontend IP configuration中找到此静态IP。

问题出在az network public-ip list --resource-group <resourceGroup> --query [0].ipAddress --output tsv命令上。

此命令返回给定资源组下的第一个静态Ip。因为--query指向数组内的第一个对象-[0].ipAddress,所以您始终获得相同的IP地址,这是自动创建的IP地址。

但是,即使您选择了正确的IP,您仍然会遇到问题(<未决>),因为documentation提到了-When multiple addresses are configured on the Azure Load Balancer, egress uses the first IP on that load balancer (Frontend IP Configuration)

因此,我们必须使用创建集群时自动创建的第一个静态IP。

对我有用的端到端解决方案:

  1. 获取静态公共IP地址:(您无需创建新的IP地址)
EGRESS_IP=$(az network public-ip list --resource-group MC_${RESOURCE_GROUP_NAME}_${CLUSTER_NAME}_${LOCATION} --query '[0].ipAddress' --output tsv)
echo The egress ip address is: $EGRESS_IP
  1. 使用静态IP创建服务:
 cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: azure-egress
  namespace: ${NAMESPACE}
spec:
  loadBalancerIP: ${EGRESS_IP}
  type: LoadBalancer
  ports:
  - port: 80
EOF
  1. 确保该服务已启动并正在运行(请检查您是否收到了外部IP,并且没有卡死,这可能需要1-3分钟):
kubectl get svc -n ${NAMESPACE}
  1. 要验证出口服务是否按预期工作,我们将使用DNS查找服务:
kubectl run -it --rm aks-egress-ip-check -n ${NAMESPACE}--image=debian --generator=run-pod/v1
  1. 运行测试:
apt-get update && \
apt-get install curl -y && \
curl -s checkip.dyndns.org