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 的高级应用,为实际项目提供有价值的参考。

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值