我正在尝试使用 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是随机选择的。
所以我的问题是:为什么 create
和list
尽管有 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。
对我有用的端到端解决方案:
- 获取静态公共(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/