赞
踩
安装metaillb,参考:Kubernetes的负载均衡方案:MetalLB - 文章详情
MetalLB
需要使用严格的 ARP
模式。需要设置 strictARP
参数为 true
。
配置文件文件:
-
- vim /etc/kubernetes/config/kube-proxy.yaml
或者执行以下命令打开:
kubectl edit configmap -n kube-system kube-proxy
修改如下配置:
将strictARP: false 改为 strictARP: true
- ...
-
- iptables:
- masqueradeAll: false
- masqueradeBit: 14
- minSyncPeriod: 0s
- syncPeriod: 30s
- ipvs:
- excludeCIDRs: null
- minSyncPeriod: 0s
- scheduler: ""
- #strictARP: false
- # 修改为 true
- strictARP: true
- syncPeriod: 30s
- nodePortAddresses: null
- oomScoreAdj: -999
-
- ...
修改后重启 kube-proxy
。
systemctl restart kube-proxy
- 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
3. 配置模式
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的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
安装 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 -y
- kubectl get pods -n istio-system
卸载命令:
istioctl uninstall --purge
- # 手动注入
- 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,如果输出位空,确保负载均衡器是生效的
使用 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”。 该操作是必需的,因为 Ingress Gateway
已被配置用来处理 “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 ...
在浏览器中输入 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 信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。