安装metaillb,参考:Kubernetes的负载均衡方案:MetalLB - 文章详情
wget https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml -O metallb.yaml
kubectl apply -f metallb-frr.yaml
配置负载均衡ip池
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
# 对外开放的ip池
- 192.168.1.109-192.168.1.114
---
# 配置网络
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
namespace: metallb-system
name: metallbl2
spec:
ipAddressPools:
- first-pool
---
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
namespace: metallb-system
name: metallbbgp
- 配置模式
1、Layer2模式配置
这里选择Layer2模式配置进行配置
创建IPAddressPool,并指定用于分配的IP池。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.214.50-192.168.214.80 #分配给LB的IP池
创建广播声明,此处未指定IP池,则默认会使用所有IP池地址。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2adver
namespace: metallb-system
2、BGP模式配置
对于具有一个BGP路由器和一个IP地址范围的基本配置,您需要4条信息:
- MetalLB应该连接的路由器IP地址,
- 路由器的AS号,
- MetalLB应该使用的AS号,
- 以CIDR前缀表示的IP地址范围。
示例:现在分配给MetalLB的AS编号为64500和192.168.10.0/24的IP地址池,并将其连接到AS编号为64501的地址为10.0.0.1的路由器,则配置如下所示:
创建BGPPeer
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: sample
namespace: metallb-system
spec:
myASN: 64500
peerASN: 64501
peerAddress: 10.0.0.1
配置IP地址池
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.10.0/24
创建广播声明
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
name: bgpadver
namespace: metallb-system
功能验证
gatewayapi
我们通过实际操作展示在 Istio 中通过 Kubernetes Gateway API 将一个服务暴露到集群外部。
安装 Kubernetes Gateway API CRD
大多数 Kubernetes 集群中没有默认安装 Gateway API,因此需要手动安装 Gateway API 的 CRD:
如果能连外网的话,可以直接使用下面命令安装:
$ kubectl get crd gateways.gateway.networking.k8s.io || kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.5.1" | kubectl apply -f -;
否则:
wget https://github.com/kubernetes-sigs/gateway-api/archive/refs/heads/main.zip -O gateway-api-main.zip
unzip gateway-api-main.zip
kubectl kustomize gateway-api-main/config/crd >> gateway-api-main.yaml
kubectl apply -f gateway-api-main.yaml
使用最小配置安装 Istio, 因为我们不再需要istio-ingressgateway
$ istioctl install --set profile=minimal -y
复制
安装完成后,Istio 会自动创建一个 GatewayClass,Controller 为istio.io/gateway-controller
$ kubectl get gatewayclass
NAME CONTROLLER ACCEPTED AGE
istio istio.io/gateway-controller True 6s
复制
创建服务并配置 Gateway
需要加以区分的是,这里的
Gateway
指的是 Kuberentes Gateway APIgateway.networking.k8s.io/v1beta1
中的 Gateway 资源,而不是 Istio APInetworking.istio.io/v1beta1
中的Gateway
。
wget https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-linux-amd64.tar.gz
tar -zxvf istio-1.18.2-linux-amd64.tar.gz -C /data/
cd istio-1.18.2/
mv bin/istioctl /usr/bin
istioctl profile list
istioctl install
kubectl get pods -n istio-system
卸载命令:
istioctl uninstall --purge
4.1 Sidercar 注入
# 手动注入
kubectl apply -f <(istioctl kube-inject -f xxx.yaml)
或者
istioctl kube-inject -f xxx.yaml|kubectl apply -f -
# 自动注入
kubectl label namespace xxx istio-injection=enabled
#项目空间中所有应用进行重启
#需要注意,有状态部署的应用需要手动注入,比如Apollo配置中心的server端
这里直接对namespace=default 的进行标注自动注入
kubectl label namespace default istio-injection=enabled
启动一个httpbin service 验证
在 istio-1.18.2 目录下,有个samples目录,放着各个istio使用的例子
参考链接:Istio / 入口网关
1、启动httpbin service
kubectl apply -f samples/httpbin/httpbin.yaml
2、创建istio gateway
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "httpbin.example.com"
EOF
3、通过gateway 配置路由
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "httpbin.example.com"
EOF
将以下环境变量设置到您集群中 Istio Ingress Gateway 所用的名称及其所在的命名空间:
export INGRESS_NAME=istio-ingressgateway
export INGRESS_NS=istio-system
执行如下指令,确定您的 Kubernetes 集群是否运行在支持外部负载均衡器的环境中:
kubectl get svc "$INGRESS_NAME" -n "$INGRESS_NS"
正常会出现下面结果
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 172.21.109.129 130.211.10.121 ... 17h
如果 EXTERNAL-IP
值已设置,说明环境正在使用外部负载均衡器,可以用其为 Ingress Gateway 提供服务。 如果 EXTERNAL-IP
值为 <none>
(或持续显示 <pending>
),说明环境没有为 Ingress Gateway 提供外部负载均衡器,无法使用 Ingress Gateway。
如果上面 EXTERNAL-IP 为None或者pendding,说明没有负载均衡器,按照上面方式安装 metallb ,重新启动gateway 服务。
设置host 环境变量
export INGRESS_HOST=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export SECURE_INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
export TCP_INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
echo $INGRESS_HOST 输出应该为上面的istio-ingressgateway 的EXTERNAL-IP,如果输出位空,确保负载均衡器是生效的
访问 Ingress 服务
-
使用 curl 访问 httpbin 服务:
curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200"
HTTP/1.1 200 OK server: istio-envoy ...
注意上文命令使用
-H
标识将 HTTP 头部参数 Host 设置为 "httpbin.example.com"。 该操作是必需的,因为 IngressGateway
已被配置用来处理 "httpbin.example.com" 的服务请求, 而在测试环境中并没有为该主机绑定 DNS,而是简单直接地向 Ingress IP 发送请求。 -
访问其他没有被显式暴露的 URL 时,将看到 HTTP 404 错误:
curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/headers"
HTTP/1.1 404 Not Found ...
通过浏览器访问 Ingress 服务
在浏览器中输入 httpbin
服务的 URL 不能获得有效的响应,因为无法像 curl
那样,将请求头部参数 Host 传给浏览器。 在现实场景中,这并不是问题,因为您需要合理配置被请求的主机及可解析的 DNS,从而在 URL 中使用主机的域名, 例如 https://httpbin.example.com/status/200
。
您可以在简单的测试和演示中按下述方法绕过这个问题:
Istio APIsGateway API
在 Gateway
和 VirtualService
配置中使用通配符 *
。例如如下修改 Ingress 配置:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- "*"
gateways:
- httpbin-gateway
http:
- match:
- uri:
prefix: /headers
route:
- destination:
port:
number: 8000
host: httpbin
EOF
此时,便可以在浏览器中输入包含 $INGRESS_HOST:$INGRESS_PORT
的 URL。 譬如,输入 http://$INGRESS_HOST:$INGRESS_PORT/headers
,将显示浏览器发送的所有 Header 信息。