azure - "az network public-ip create"和"az network public-ip list"显示两个不同的IP

标签 azure kubernetes azure-aks

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

也就是说,我需要服务能够通过 REST 相互调用,这导致我尝试在 AKS 上设置静态 IP。 (到目前为止,我可能已经把事情变得过于复杂了,但我仍然在尝试。)这让我想到了这两个命令:

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是随机选择的。

所以我的问题是:为什么 createlist尽管有 MS 的文档,但仍显示两个不同的 IP,我怎样才能让它工作得足够好以分配静态外部 IP?

最佳答案

创建新的 AKS 群集时,会在后台创建多个网络资源(在 MC_${RESOURCE_GROUP_NAME}${CLUSTER_NAME}${LOCATION} 资源组内)。其中一项资源是静态公共(public) IP(类似于使用 Azure CLI 命令创建的资源)。您可以在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. 获取静态公共(public) 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
  • 使用静态 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
    
  • 确保服务已启动并正在运行(检查您是否收到外部 IP 并且没有卡住,这可能需要 1-3 分钟):
  • kubectl get svc -n ${NAMESPACE}
    
  • 为了验证导出服务是否按预期工作,我们将使用 DNS 查找服务:
  • kubectl run -it --rm aks-egress-ip-check -n ${NAMESPACE}--image=debian --generator=run-pod/v1
    
  • 运行测试:
  • apt-get update && \
    apt-get install curl -y && \
    curl -s checkip.dyndns.org
    

    关于azure - "az network public-ip create"和"az network public-ip list"显示两个不同的IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61034623/

    相关文章:

    Azure 门户 - 添加角色组无法正常工作

    kubernetes - 用于部署的 Kubectl 命令式命令

    azure - 如何在 Azure Kubernetes 服务上模拟可用区中断?

    Azure Kubernetes 服务 - 何时需要在其他 Azure 资源上设置 AKS 服务原则才能建立连接?

    .net - 服务总线处置对象

    azure - 使用python实现多个Azure kinect相机同步

    docker - 我是否在容器上运行?

    kubernetes - 从 kubectl 描述节点获取特定属性

    Azure网站没有web.config文件

    azure - Kubernetes 虚拟节点池虚拟机意外费用