如何为Azure Kubernetes Services启用Internal Loadbalancer
熟悉Azure Kubernetes Services(AKS)的小伙伴都知道,默认情况下,当我们创建Azure Kubernetes Services群集时,创建的都是Public的AKS群集,也就是可以提供Internet访问的AKS群集。Public AKS群集会默认附带一个Public类型的Load Balancer以用于我们创建发布Services使用。Public LoadBalancer具有分配给他的公网IP地址并且可以通过Internel进行服务访问。
但是在很多情况下,我们会存在一个群集内的某些服务是对内的,需要提供内网访问。那这个时候,使用Public LoadBalancer就不是很适用于这种场景了。此时需要使用Internal LoadBalancer来帮助我们在多个Pod之间进行流量分配。Internal LoadBalancer具有与 Pod 虚拟网络关联的内部 IP 地址。它没有与之关联的公共 IP 地址。这意味着无法通过互联网访问内部负载均衡器。它只能在 Kubernetes 集群内使用。
一般情况下,当我们创建负载均衡器时,会使用类似于如下格式的YAML文件,此时我们所创建的即为Public LoadBalancer类型的负载均衡器:
apiVersion: v1kind: Service
kind: Service
metadata:
name: Public-IP-address
spec:
type: LoadBalancer
ports:
— port: 80
selector:
app: internal-app
对于Public类型的LoadBalancer,创建完成以后,可以使用kubectl get svc来查看具体的IP地址信息。
那如果我们想要去创建一个Internal的负载均衡器,应该如何操作呢。细心的朋友可能会发现,在K8S的服务定义中,并没有提供Internal LoadBalancer的特定属性。要配置内部负载均衡器,可以使用注释,这是 AKS 特有的。注释是可以添加到任何资源的附加元数据信息。AKS 使用此元数据信息来预配内部负载均衡器而不是公共负载均衡器。
接下来这个YAML文件,会给大家展示了如何在AKS中创建Internal LoadBalancer,这里大家需要注意,这个YAML文件的“annotations”部分。你会发现,annotations定义了 service.beta.kubernetes.io/azure-load-balancer- internal: "true"这个属性来告诉AKS需要创建的是一个Internal LoadBalancer类型的Services资源。
apiVersion: v1 kind: Service
kind: Service
metadata:
name: internal-app
annotations:
service.beta.kubernetes.io/azure-load-balancer- internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: internal-app
上述YAML文件执行以后如下图所示,可以看到,会创建出一个Internal LoadBalancer类型的资源:
创建好以后,回到Azure Portal,可以看到已经部署了一个Internal LoadBalancer类型的资源:
如果各位在部署Internal LoadBalancer资源的时候想要指定IP,可以在Yaml文件的 annotations中设置service.beta.kubernetes.io/azure-load-balancer-ipv4注解,具体可参考如下YAML文件:
apiVersion: v1
kind: Service
metadata:
name: internal-app
annotations:
service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.2.1.100
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: internal-app
需要注意的是,指定IP地址的前提是IP地址没有被其他资源所占用,所以大家在使用之前要提前做好规划哈。