我被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有文档说明,为什么create
和list
会显示两个不同的IP,我如何才能使其正常工作以分配静态外部IP?
答案 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。
对我有用的端到端解决方案:
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
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
kubectl get svc -n ${NAMESPACE}
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