当前位置:   article > 正文

metallb , istio ingress 部署httpbin使用例子_istio-ingressgateway lb metallb

istio-ingressgateway lb metallb

安装metaillb,参考:Kubernetes的负载均衡方案:MetalLB - 文章详情

修改 kube-proxy 参考:k8s部署metallb – Janrs.com | 杨建勇

MetalLB 需要使用严格的 ARP 模式。需要设置 strictARP 参数为 true

配置文件文件:

  1. vim /etc/kubernetes/config/kube-proxy.yaml

或者执行以下命令打开:

kubectl edit configmap -n kube-system kube-proxy

修改如下配置:

将strictARP: false 改为 strictARP: true

  1. ...
  2. iptables:
  3. masqueradeAll: false
  4. masqueradeBit: 14
  5. minSyncPeriod: 0s
  6. syncPeriod: 30s
  7. ipvs:
  8. excludeCIDRs: null
  9. minSyncPeriod: 0s
  10. scheduler: ""
  11. #strictARP: false
  12. # 修改为 true
  13. strictARP: true
  14. syncPeriod: 30s
  15. nodePortAddresses: null
  16. oomScoreAdj: -999
  17. ...

修改后重启 kube-proxy

systemctl restart kube-proxy
  1. wget https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml -O metallb.yaml
  2. kubectl apply -f metallb-frr.yaml

配置负载均衡ip池

  1. apiVersion: metallb.io/v1beta1
  2. kind: IPAddressPool
  3. metadata:
  4. name: first-pool
  5. namespace: metallb-system
  6. spec:
  7. addresses:
  8. # 对外开放的ip池
  9. - 192.168.1.109-192.168.1.114
  10. ---
  11. # 配置网络
  12. apiVersion: metallb.io/v1beta1
  13. kind: L2Advertisement
  14. metadata:
  15. namespace: metallb-system
  16. name: metallbl2
  17. spec:
  18. ipAddressPools:
  19. - first-pool
  20. ---
  21. apiVersion: metallb.io/v1beta1
  22. kind: BGPAdvertisement
  23. metadata:
  24. namespace: metallb-system
  25. name: metallbbgp

3. 配置模式

1、Layer2模式配置 

这里选择Layer2模式配置 进行配置

创建IPAddressPool,并指定用于分配的IP池。

  1. apiVersion: metallb.io/v1beta1
  2. kind: IPAddressPool
  3. metadata:
  4. name: ip-pool
  5. namespace: metallb-system
  6. spec:
  7. addresses:
  8. - 192.168.214.50-192.168.214.80 #分配给LB的IP池

创建广播声明,此处未指定IP池,则默认会使用所有IP池地址。

  1. apiVersion: metallb.io/v1beta1
  2. kind: L2Advertisement
  3. metadata:
  4. name: l2adver
  5. 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

  1. apiVersion: metallb.io/v1beta2
  2. kind: BGPPeer
  3. metadata:
  4. name: sample
  5. namespace: metallb-system
  6. spec:
  7. myASN: 64500
  8. peerASN: 64501
  9. peerAddress: 10.0.0.1

配置IP地址池

  1. apiVersion: metallb.io/v1beta1
  2. kind: IPAddressPool
  3. metadata:
  4. name: first-pool
  5. namespace: metallb-system
  6. spec:
  7. addresses:
  8. - 192.168.10.0/24

创建广播声明

  1. apiVersion: metallb.io/v1beta1
  2. kind: BGPAdvertisement
  3. metadata:
  4. name: bgpadver
  5. namespace: metallb-system

功能验证

Istio / 使用 Istioctl 安装

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 -;

否则:

  1. wget https://github.com/kubernetes-sigs/gateway-api/archive/refs/heads/main.zip -O gateway-api-main.zip
  2. ​unzip gateway-api-main.zip
  3. kubectl kustomize gateway-api-main/config/crd >> gateway-api-main.yaml
  4. kubectl apply -f gateway-api-main.yaml

使用最小配置安装 Istio, 因为我们不再需要istio-ingressgateway

$ istioctl install --set profile=minimal -y

复制

安装完成后,Istio 会自动创建一个 GatewayClass,Controller 为istio.io/gateway-controller

  1. $ kubectl get gatewayclass
  2. NAME CONTROLLER ACCEPTED AGE
  3. istio istio.io/gateway-controller True 6s

复制

创建服务并配置 Gateway

需要加以区分的是,这里的Gateway指的是 Kuberentes Gateway APIgateway.networking.k8s.io/v1beta1 中的 Gateway 资源,而不是 Istio API networking.istio.io/v1beta1 中的Gateway

  1. wget https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-linux-amd64.tar.gz
  2. tar -zxvf istio-1.18.2-linux-amd64.tar.gz -C /data/
  3. cd istio-1.18.2/
  4. mv bin/istioctl /usr/bin
  5. istioctl profile list

  1. istioctl install -y
  2. kubectl get pods -n istio-system

卸载命令:

istioctl uninstall --purge

4.1 Sidercar 注入

  1. # 手动注入
  2. kubectl apply -f <(istioctl kube-inject -f xxx.yaml)
  3. 或者
  4. istioctl kube-inject -f xxx.yaml|kubectl apply -f -
  5. # 自动注入
  6. kubectl label namespace xxx istio-injection=enabled
  7. #项目空间中所有应用进行重启
  8. #需要注意,有状态部署的应用需要手动注入,比如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

  1. kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: Gateway
  4. metadata:
  5. name: httpbin-gateway
  6. spec:
  7. selector:
  8. istio: ingressgateway # use Istio default gateway implementation
  9. servers:
  10. - port:
  11. number: 80
  12. name: http
  13. protocol: HTTP
  14. hosts:
  15. - "httpbin.example.com"
  16. EOF

3、通过gateway 配置路由

  1. kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: Gateway
  4. metadata:
  5. name: httpbin-gateway
  6. spec:
  7. selector:
  8. istio: ingressgateway # use Istio default gateway implementation
  9. servers:
  10. - port:
  11. number: 80
  12. name: http
  13. protocol: HTTP
  14. hosts:
  15. - "httpbin.example.com"
  16. EOF

将以下环境变量设置到您集群中 Istio Ingress Gateway 所用的名称及其所在的命名空间:

  1. export INGRESS_NAME=istio-ingressgateway
  2. export INGRESS_NS=istio-system

执行如下指令,确定您的 Kubernetes 集群是否运行在支持外部负载均衡器的环境中:

kubectl get svc "$INGRESS_NAME" -n "$INGRESS_NS"

正常会出现下面结果

  1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. 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 环境变量

  1. export INGRESS_HOST=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  2. export INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
  3. export SECURE_INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
  4. 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 服务

  1. 使用 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 发送请求。

  2. 访问其他没有被显式暴露的 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 配置:

 
  1. kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: Gateway
  4. metadata:
  5. name: httpbin-gateway
  6. spec:
  7. selector:
  8. istio: ingressgateway # use Istio default gateway implementation
  9. servers:
  10. - port:
  11. number: 80
  12. name: http
  13. protocol: HTTP
  14. hosts:
  15. - "*"
  16. ---
  17. apiVersion: networking.istio.io/v1alpha3
  18. kind: VirtualService
  19. metadata:
  20. name: httpbin
  21. spec:
  22. hosts:
  23. - "*"
  24. gateways:
  25. - httpbin-gateway
  26. http:
  27. - match:
  28. - uri:
  29. prefix: /headers
  30. route:
  31. - destination:
  32. port:
  33. number: 8000
  34. host: httpbin
  35. EOF

此时,便可以在浏览器中输入包含 $INGRESS_HOST:$INGRESS_PORT 的 URL。 譬如,输入 http://$INGRESS_HOST:$INGRESS_PORT/headers,将显示浏览器发送的所有 Header 信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/915698
推荐阅读
相关标签
  

闽ICP备14008679号