在Azure Kubernetes(AKS)中,如果pod将流量发送到群集之外,则会将其Natted到节点IP地址。例如,如果pod nettools(来自节点aks-agentpool-35359625-1)将流量发送到群集之外的Azure目标,它将被设置为10.240.0.35。有没有办法保留原始来源(10.240.0.48)?
以联网插件azure和透明联网模式运行的群集
/AKS/cluster1 $ kubectl get nodes -o wide
kubectl get pods -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
aks-agentpool-35359625-0 Ready agent 6h13m v1.15.10 10.240.0.66 <none> Ubuntu 16.04.6 LTS 4.15.0-1071-azure docker://3.0.10+azure
aks-agentpool-35359625-1 Ready agent 6h13m v1.15.10 10.240.0.35 <none> Ubuntu 16.04.6 LTS 4.15.0-1071-azure docker://3.0.10+azure
aks-agentpool-35359625-2 Ready agent 6h13m v1.15.10 10.240.0.4 <none> Ubuntu 16.04.6 LTS 4.15.0-1071-azure docker://3.0.10+azure
/AKS/cluster1 $ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nettools 1/1 Running 0 21m 10.240.0.48 aks-agentpool-35359625-1 <none> <none>
/AKS/cluster1 $ az aks show -g $rg --name $cluster --query "networkProfile"
{
"dnsServiceIp": "10.0.0.10",
"dockerBridgeCidr": "172.17.0.1/16",
"loadBalancerProfile": null,
"loadBalancerSku": "Basic",
"networkMode": "transparent",
"networkPlugin": "azure",
"networkPolicy": null,
"outboundType": "UDR",
"podCidr": null,
"serviceCidr": "10.0.0.0/16"
}
答案 0 :(得分:0)
您实际上无法做到这一点,每次销毁一个Pod并创建一个新Pod时,都会为其分配一个新IP。荚是短暂的,它们的IP也是如此。
我相信要实现您想要的目标,您需要使用服务。
Kubernetes中的服务是“将运行在一组Pod上的应用程序公开为网络服务的抽象方法”。 (k8s documentation)
同样,您可以通过Kubernetes为其提供的IP和端口访问您的Pod,但这不是一个好习惯,因为Pod可能会死亡,并且将创建另一个Pod(如果由Deployment / ReplicaSet控制)。新IP,您应用中的所有内容都会开始失效。
如果公开部署或Pod,则创建的服务也将具有IP,并且销毁Pod的次数无关紧要,因为您仍然可以通过Service IP访问它(当然当新的Pod启动并运行时,但我想您已经明白了。
答案 1 :(得分:0)
您可以编辑 azure-ip-masq-agent configmap 以添加您不希望它被伪装的目标私有 IP CIDR。
kubectl get pods --namespace kube-system -l "k8s-app=azure-ip-masq-agent" -o wide
kubectl describe configmap azure-ip-masq-agent-config --namespace kube-system
# Add x.x.x.x/x to the nonMasq CIDRs
kubectl edit configmap azure-ip-masq-agent-config --namespace kube-system