Istio服务网格 上部署Metallb

Istio起步 ,如果是在自建的 baremetal 服务器集群,就会出现无法自动获取 Exteneral-IP 的现象。原因无他,就是因为Kubernetes默认是在云计算厂商平台部署,采用调用云厂商的Loadbalance来实现对外服务输出。而在 barmetal 裸金属服务器上部署的应用,则需要实现一个外部负载均衡,如 Kubernetes MetalLB 负载均衡

安装

  • 我在 Kubespray快速起步 采用了默认安装,也就是依然采用 kube-proxy 。按照 安装MetalLB 官方说明,必须严格激活 strict ARP ,所以编辑当前集群的 kube-proxy 配置:

通过编辑 kube-proxy 配置激活 strict ARP
kubectl edit configmap -n kube-system kube-proxy

设置:

设置 ipvs 模式中 strictARP: true
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true
  • 执行以下 manifest 完成MetalLB安装 :

使用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: 该组件负责选择可以到达服务的协议

  • 用于 controllerspeaker 的系统服务账号,归属于RBAC的功能组件

  • 检查部署pods:

检查 metallb-system 中的组件pods
kubectl -n metallb-system get pods -o wide

可以看到如下pods分布在每个节点上:

检查 metallb-system 中的组件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 服务:

检查 Istio起步 创建的 istio-ingressgateway 的service(svc)
kubectl get svc istio-ingressgateway -n istio-system

此时看到 istio-ingressgatewayEXTERNAL-IPpending 状态:

检查上文创建的名为 istio-ingressgateway 的service(svc): 输出显示 EXTERNAL-IP 没有分配
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资源池来对外提供服务:

创建 y-k8s-ip-pool.yaml 设置对外提供负载均衡服务的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
  • 然后执行创建:

创建名为 y-k8s-ip-pool 的MetalLB地址池
kubectl create -f y-k8s-ip-pool.yaml
  • 一旦完成 MetalLB 的负载均衡服务的IP地址池,再次检查 Ingress 服务:

再次检查 istio-ingressgateway 的service(svc)
kubectl get svc istio-ingressgateway -n istio-system

Binggo ,现在可以看到对外服务的IP地址已经分配:

可以看到完成 MetalLB 地址池配置后, istio-ingressgateway 的service(svc) 正确获得了对外服务负载均衡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上访问

参考