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"。
-
解决方案
:检查 IngressClass 的注释是否正确,确保
-
问题
:在使用 Gateway API 时,HTTPRoute 规则不生效。
-
解决方案
:检查 Gateway 和 HTTPRoute 的配置,确保
parentRefs和hostnames等字段设置正确。
-
解决方案
:检查 Gateway 和 HTTPRoute 的配置,确保
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 的高级应用,为实际项目提供有价值的参考。
超级会员免费看
75

被折叠的 条评论
为什么被折叠?



