58、Kubernetes 流量管理与高级技术实践

Kubernetes 流量管理与高级技术实践

1. 部署 Nginx Ingress 控制器

在 AWS 中,可使用网络负载均衡器(NLB)来暴露 Nginx Ingress 控制器,通过将其配置为类型为 LoadBalancer 的服务:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/aws/deploy.yaml

若没有云环境或基于云的 Kubernetes 部署,可在 minikube 集群中部署 Ingress 控制器:

1.1 部署多节点 minikube Kubernetes 集群

$ minikube start --cni calico --nodes 3 --kubernetes-version=v1.31.0

1.2 启用 Ingress

$ minikube addons enable ingress

1.3 验证 Pods

$ kubectl get pods -n ingress-nginx

输出示例:

NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-rsznt        0/1     Completed   0          78s
ingress-nginx-admission-patch-4c7xh         0/1     Completed   0          78s
ingress-nginx-controller-6fc95558f4-zdhp7   1/1     Running     0          78s

2. 部署 Ingress 资源

在 Kubernetes 中部署应用,可参考以下 YAML 文件:
- 00-ingress-demo-ns.yaml :创建 ingress-demo 命名空间。
- video-portal.yaml :创建带有 ConfigMap、Deployment 和 Service 的视频门户。
- blog-portal.yaml :创建带有 ConfigMap、Deployment 和 Service 的博客门户。
- shopping-portal.yaml :创建带有 ConfigMap、Deployment 和 Service 的购物门户。
- portal-ingress.yaml :创建基于路径的 ingress 资源。

2.1 portal-ingress.yaml 规则示例

# ingress/portal-ingress.yaml
spec:
  rules:
    - host: k8sbible.local
      http:
        paths:
          - path: /video
            pathType: Prefix
            backend:
              service:
                name: video-service
                port:
                  number: 8080
          - path: /shopping
            pathType: Prefix
            backend:
              service:
                name: shopping-service
                port:
                  number: 8080
          - path: /
            pathType: Prefix
            backend:
              service:
                name: blog-service
                port:
                  number: 8080

2.2 应用 YAML 文件

$ kubectl apply -f ingress/

2.3 检查资源

$ kubectl get po,svc,ingress -n ingress-demo

输出示例:
| 资源类型 | 名称 | 就绪状态 | 状态 | 重启次数 | 年龄 |
| — | — | — | — | — | — |
| Pod | blog-675df44d5-5s8sg | 1/1 | Running | 0 | 88s |
| Pod | shopping-6f88c5f485-lw6ts | 1/1 | Running | 0 | 88s |
| Pod | video-7d945d8c9f-wkxc5 | 1/1 | Running | 0 | 88s |
| Service | blog-service | ClusterIP | 10.111.70.32 | | 8080/TCP 88s |
| Service | shopping-service | ClusterIP | 10.99.103.137 | | 8080/TCP 88s |
| Service | video-service | ClusterIP | 10.109.3.177 | | 8080/TCP 88s |
| Ingress | portal-ingress | nginx | k8sbible.local | 192.168.39.18 | 80 88s |

若使用基于云的 Kubernetes 集群,需将 k8sbible.local 指向云负载均衡器的 IP 地址。若没有注册的域名,可在本地 /etc/hosts 文件中模拟:

# k8sbible minikube
192.168.39.18 k8sbible.local

现在可通过 http://k8sbible.local 访问门户。

3. ingressClass 和多 Ingress 控制器

在某些情况下,可能需要为 Ingress 控制器设置不同的配置。可使用 ingressClass 机制在单个 Kubernetes 集群中部署多个 Ingress 控制器,常见场景如下:
- 不同需求的 Ingress 类 :Kubernetes ingress 控制器可使用特定的 Ingress 类进行注释,如 nginx-public nginx-private ,以引导不同类型的流量。
- 多协议支持 :不同应用可能需要支持多种协议,可通过为每个协议使用不同的 ingress 控制器来处理。

3.1 查看 IngressClass

$ kubectl get IngressClass -o yaml

输出示例:

apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: IngressClass
  metadata:
    name: nginx
    annotations:
      ingressclass.kubernetes.io/is-default-class: "true"
  spec:
    controller: k8s.io/ingress-nginx

4. Azure Application Gateway Ingress Controller for AKS

使用 nginx Ingress 控制器在 Azure Kubernetes Service (AKS) 中进行流量路由可能会因多层负载均衡而变得复杂。AKS 提供了原生的 L7 负载均衡器服务 Azure Application Gateway Ingress Controller (AGIC),其优势如下:
- 简化负载均衡 :AGIC 无需使用单独的 Azure 负载均衡器,可直接将流量转发到 Pods,减少负载均衡层,降低故障点。
- 直接 Pod 通信 :AGIC 利用 Azure SDN 功能,无需 kube-proxy 管理服务路由,可直接与 Pods 通信。

4.1 创建 AKS 集群

$ az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 2 --network-plugin azure --enable-managed-identity -a ingress-appgw --appgw-name MyAppGateway --appgw-subnet-cidr "10.2.0.0/16" --generate-ssh-keys

4.2 生成 kubeconfig

$ az aks get-credentials --resource-group k8sforbeginners-rg --name k8sforbeginners-aks-agic

4.3 修改 Ingress 资源定义

# aks-agic/portal-ingress.yaml
spec:
  ingressClassName: azure-application-gateway

4.4 应用 YAML 文件

$ kubectl apply -f aks_agic/

4.5 获取外部 IP 地址

$ kubectl get ingress

4.6 测试配置

  • 服务 1: http://<external-IP>/video 将由 video-service Pods 提供服务。
  • 服务 2: http://<external-IP>/shopping 将由 shopping-service Pods 提供服务。
  • 默认服务: http://<external-IP>/ 将由 blog-service Pods 提供服务。

5. Gateway API

Kubernetes Gateway API 是一组不断发展的资源,旨在最终取代 Ingress API,提供更强大、灵活的网络流量路由配置机制。主要 API 资源如下:
- GatewayClass :代表一类共享相同配置集的 Gateways,由实现该资源的同一控制器操作。
- Gateway :是通过控制器控制流量的环境实例,如云负载均衡器。
- HTTPRoute :定义从 Gateway 监听器到后端网络端点(通常表示为 Services)的 HTTP 特定路由规则。

5.1 典型 GatewayClass 示例

# gateway_api/gatewayclass.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: dev-cluster-gateway
spec:
  controllerName: "example.net/gateway-controller"

5.2 典型 Gateway 示例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: dev-gateway
  namespace: gateway-api-demo
spec:
  gatewayClassName: dev-cluster-gateway
  listeners:
    - name: http
      protocol: HTTP
      port: 80

5.3 典型 HTTPRoute 示例

# gateway-api/httproute.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: dev-httproute
  namespace: gateway-api-demo
spec:
  parentRefs:
    - name: dev-cluster-gateway
      kind: Gateway
      namespace: gateway-api-demo
  hostnames:
    - "k8sbible.local"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /video
      backendRefs:
        - name: video-service
          port: 80

6. 了解 Endpoints 和 EndpointSlices

传统上,Kubernetes 通过 Pods 部署应用,Services 作为可靠的网络中介,维护相应的 Endpoints 对象记录匹配选择器标准的活动、健康 Pods。但当规模增大时,这种方式扩展性不佳。EndpointSlices 将单一的 Endpoints 对象分割成更小的片段,每个 EndpointSlice 默认容纳 100 个端点,可减少网络流量和节点负载,提高可扩展性和性能。

7. 现代 Kubernetes 高级技术

Kubernetes 处于集成和支持一系列重塑 IT 格局的高级技术的前沿,可轻松集成现代和前沿的解决方案,如 Knative、OpenFaas、KubeVirt 和 Kubeflow 等,帮助组织更高效地采用新范式。

7.1 Serverless with Knative and OpenFaaS

无服务器计算改变了应用程序的构建和部署模式,在 Kubernetes 环境中使用 Knative 和 OpenFaaS 可实现强大的无服务器功能,包括部署、扩展和管理函数即服务。

8. 高级技术集成与实践流程总结

8.1 整体流程 mermaid 图

graph LR
    A[部署 Nginx Ingress 控制器] --> B[部署 Ingress 资源]
    B --> C[配置 ingressClass 和多 Ingress 控制器]
    C --> D[使用 AGIC for AKS]
    D --> E[探索 Gateway API]
    E --> F[理解 Endpoints 和 EndpointSlices]
    F --> G[集成现代高级技术]

8.2 各步骤关键操作总结

步骤 关键操作 命令示例
部署 Nginx Ingress 控制器 在 AWS 部署;在 minikube 部署 kubectl apply -f ... minikube start ... minikube addons enable ingress
部署 Ingress 资源 应用 YAML 文件;检查资源 kubectl apply -f ingress/ kubectl get po,svc,ingress -n ingress-demo
配置 ingressClass 和多 Ingress 控制器 查看 IngressClass kubectl get IngressClass -o yaml
使用 AGIC for AKS 创建 AKS 集群;生成 kubeconfig;修改 Ingress 资源;应用 YAML 文件;获取外部 IP;测试配置 az aks create ... az aks get-credentials ... ;修改 aks-agic/portal-ingress.yaml kubectl apply -f aks_agic/ kubectl get ingress
探索 Gateway API 定义 GatewayClass、Gateway、HTTPRoute 参考 gateway_api/gatewayclass.yaml gateway-api/gateway.yaml gateway-api/httproute.yaml
理解 Endpoints 和 EndpointSlices 了解原理 参考文档 https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/
集成现代高级技术 使用 Knative 和 OpenFaaS 实现无服务器计算

9. 常见问题与解决方案

9.1 部署问题

  • 问题 :在 AWS 部署 Nginx Ingress 控制器时,网络负载均衡器配置失败。
    • 解决方案 :检查网络权限和安全组设置,确保允许相关端口的流量通过。
  • 问题 :在 minikube 中启用 Ingress 失败。
    • 解决方案 :检查 minikube 版本和 Kubernetes 版本是否兼容,可尝试更新 minikube 到最新版本。

9.2 资源访问问题

  • 问题 :无法通过 http://k8sbible.local 访问门户。
    • 解决方案 :检查 /etc/hosts 文件配置是否正确;检查 Ingress 资源和服务是否正常运行。
  • 问题 :使用 AGIC for AKS 时,无法获取外部 IP 地址。
    • 解决方案 :检查 AKS 集群和 Azure Application Gateway 的配置,确保网络连接正常。

9.3 配置问题

  • 问题 :在配置 ingressClass 时,无法正确识别默认 IngressClass。
    • 解决方案 :检查 IngressClass 的注释是否正确,确保 ingressclass.kubernetes.io/is-default-class 设置为 "true"
  • 问题 :在使用 Gateway API 时,HTTPRoute 规则不生效。
    • 解决方案 :检查 Gateway 和 HTTPRoute 的配置,确保 parentRefs hostnames 等字段设置正确。

10. 未来展望

随着 Kubernetes 的不断发展,其在高级技术集成方面将有更广阔的前景。无服务器计算、机器学习等领域与 Kubernetes 的结合将更加紧密,为企业提供更高效、灵活的解决方案。同时,Gateway API 等新技术的不断完善,将进一步提升 Kubernetes 集群的网络流量管理能力。未来,我们可以期待更多创新的应用场景和解决方案在 Kubernetes 平台上涌现。

11. 总结

本文详细介绍了 Kubernetes 中的流量管理和高级技术实践,包括 Nginx Ingress 控制器的部署、Ingress 资源的创建、ingressClass 和多 Ingress 控制器的配置、Azure Application Gateway Ingress Controller for AKS 的使用、Gateway API 的探索、Endpoints 和 EndpointSlices 的理解,以及现代高级技术的集成。通过实际操作和示例代码,展示了如何在 Kubernetes 集群中实现高效的流量路由和功能扩展。希望本文能帮助读者更好地掌握 Kubernetes 的高级应用,为实际项目提供有价值的参考。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值