Kubernetes新手迁移:如何用Istio实现VIP轮询负载均衡?
嘿,很高兴看到你已经迈出了从VM迁移到K8s+Istio的第一步!从你描述的VM VIP轮询负载均衡模式,转到Istio其实非常契合,我来给你梳理下具体怎么实现类似的功能:
核心概念对应先搞清楚
先把你熟悉的VM架构和Istio组件做个对应,帮你快速理解:
- VM里的VIP → Istio里的Gateway(对外暴露的统一入口)
- VIP的轮询负载逻辑 → Istio的DestinationRule(配置后端服务的负载均衡策略)
- 后端服务节点池 → K8s的Deployment/StatefulSet(你的可缩放服务)
具体实现步骤(基于你已有的minikube+可缩放服务)
假设你已经部署了名为my-service的服务(有多个Pod副本),接下来只需要三步配置Istio规则:
1. 部署Istio Gateway(对应VM的VIP入口)
Gateway相当于对外的统一访问入口,就像你VM里的VIP地址,所有客户端流量先打到这里。创建一个gateway.yaml文件:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-service-gateway spec: selector: istio: ingressgateway # 用Istio默认的 ingressgateway 组件 servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" # 允许所有域名访问,你也可以改成具体域名比如my-service.example.com
执行命令部署:
kubectl apply -f gateway.yaml
2. 创建VirtualService(路由流量到后端服务)
VirtualService负责把Gateway进来的流量转发到你的my-service,相当于VIP的转发规则:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-service-vs spec: hosts: - "*" # 和Gateway的hosts对应 gateways: - my-service-gateway # 关联刚才创建的Gateway http: - route: - destination: host: my-service # 你的服务名称(K8s Service的名称) port: number: 80 # 服务暴露的端口
部署命令:
kubectl apply -f virtualservice.yaml
3. 配置DestinationRule(启用轮询负载均衡)
Istio默认的负载均衡策略就是轮询(ROUND_ROBIN),但咱们明确配置一下更稳妥,确保和你VM里的逻辑完全一致:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-service-dr spec: host: my-service # 目标服务名称 trafficPolicy: loadBalancer: simple: ROUND_ROBIN # 指定轮询策略
部署命令:
kubectl apply -f destinationrule.yaml
验证功能是否生效
现在你可以测试轮询效果了:
- 先获取Istio IngressGateway的地址(minikube环境下用这个命令):
minikube service istio-ingressgateway --url
- 多次用curl访问这个地址,比如:
for i in {1..5}; do curl <INGRESS_GATEWAY_URL>; echo; done
- 查看
my-service的Pod日志,或者让服务返回自身的Pod名称,你会看到请求被均匀轮询到不同的Pod上,和你之前VM里VIP的效果一模一样!
额外实用提示
- 当你缩放
my-service的Pod副本数时,Istio会自动识别新的Pod,不需要手动更新负载均衡规则,就像你在VM里添加新节点到VIP池一样方便。 - 如果之后需要更复杂的负载策略(比如按权重分配、最少连接数),只需要修改DestinationRule里的
loadBalancer.simple字段即可,Istio支持多种策略。
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

