在 Istio服务网格 上部署Metallb¶
在 Istio起步 ,如果是在自建的 baremetal
服务器集群,就会出现无法自动获取 Exteneral-IP
的现象。原因无他,就是因为Kubernetes默认是在云计算厂商平台部署,采用调用云厂商的Loadbalance来实现对外服务输出。而在 barmetal
裸金属服务器上部署的应用,则需要实现一个外部负载均衡,如 Kubernetes MetalLB 负载均衡 。
安装¶
我在 Kubespray快速起步 采用了默认安装,也就是依然采用
kube-proxy
。按照 安装MetalLB 官方说明,必须严格激活strict ARP
,所以编辑当前集群的kube-proxy
配置:
kubectl edit configmap -n kube-system kube-proxy
设置:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
执行以下
manifest
完成MetalLB安装 :
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
上述操作在集群中的 metallb-system
namespace 部署了MetalLB,在 manifest 中的组件包括:
metallb-system/controller
deployment: 这是用于处理IP地址分配的集群范围控制器metallb-system/speaker
daemonset: 该组件负责选择可以到达服务的协议用于
controller
和speaker
的系统服务账号,归属于RBAC的功能组件检查部署pods:
kubectl -n metallb-system get pods -o wide
可以看到如下pods分布在每个节点上:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
controller-5fd797fbf7-6x8lm 1/1 Running 0 2m56s 10.233.89.145 y-k8s-n-1 <none> <none>
speaker-9lxd5 1/1 Running 0 2m56s 192.168.8.119 y-k8s-n-1 <none> <none>
speaker-fmlzw 1/1 Running 0 2m56s 192.168.8.116 y-k8s-m-1 <none> <none>
speaker-g6f9d 1/1 Running 0 2m56s 192.168.8.118 y-k8s-m-3 <none> <none>
speaker-mpx6m 1/1 Running 0 2m56s 192.168.8.117 y-k8s-m-2 <none> <none>
speaker-x8k7x 1/1 Running 0 2m56s 192.168.8.120 y-k8s-n-2 <none> <none>
配置¶
在 Istio起步 已经部署了 Istio Bookinfo案例应用
在没有部署 MetalLB
对外IP地址池的时候,检查 Ingress 服务:
kubectl get svc istio-ingressgateway -n istio-system
此时看到 istio-ingressgateway
的 EXTERNAL-IP
是 pending
状态:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.233.8.166 <pending> 15021:31210/TCP,80:31659/TCP,443:30721/TCP,31400:32337/TCP,15443:30050/TCP 6h28m
创建
MetalLB
的IP资源池来对外提供服务:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: y-k8s-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.8.151-192.168.8.198
然后执行创建:
kubectl create -f y-k8s-ip-pool.yaml
一旦完成
MetalLB
的负载均衡服务的IP地址池,再次检查 Ingress 服务:
kubectl get svc istio-ingressgateway -n istio-system
Binggo ,现在可以看到对外服务的IP地址已经分配:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.233.8.166 192.168.8.151 15021:31210/TCP,80:31659/TCP,443:30721/TCP,31400:32337/TCP,15443:30050/TCP 24h
注意,这里我的模拟环境采用了一个内部IP地址
192.168.8.151
,我还加了一个 Nginx反向代理 将public
网络接口访问映射为内部IP上访问