Service与Ingress:四层和七层负载均衡的实现

举报
数字扫地僧 发表于 2025/03/27 18:36:38 2025/03/27
【摘要】 一、项目背景在现代云计算和容器化应用开发中,Kubernetes 已经成为管理容器化应用的事实标准。随着应用规模的扩大和用户访问量的增加,如何高效地分配和管理进入容器化应用的流量成为了一个关键问题。Kubernetes 提供了 Service 和 Ingress 两种机制来实现负载均衡,分别对应四层和七层的负载均衡功能。本文将深入探讨这两种机制的原理、配置方法以及实战部署,帮助读者理解如何...

一、项目背景

在现代云计算和容器化应用开发中,Kubernetes 已经成为管理容器化应用的事实标准。随着应用规模的扩大和用户访问量的增加,如何高效地分配和管理进入容器化应用的流量成为了一个关键问题。Kubernetes 提供了 Service 和 Ingress 两种机制来实现负载均衡,分别对应四层和七层的负载均衡功能。本文将深入探讨这两种机制的原理、配置方法以及实战部署,帮助读者理解如何在 Kubernetes 中实现高效的流量管理。

二、前期准备

环境准备

确保已搭建好 Kubernetes 集群,并且可以使用 kubectl 进行操作。如果尚未搭建集群,可以使用 Minikube 或 Kind 等工具快速创建一个本地测试环境。

工具安装

安装 Kubernetes 命令行工具 kubectl:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

验证安装是否成功:

kubectl version --client

三、实战部署

四层负载均衡:Kubernetes Service

创建部署

首先,创建一个简单的部署,包含两个副本的 Web 应用。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: nginx:latest
        ports:
        - containerPort: 80

应用部署配置:

kubectl apply -f deployment.yaml

创建 Service

创建一个 Service 来暴露上述部署的端口,并实现四层负载均衡。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  type: LoadBalancer
  selector:
    app: webapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

应用 Service 配置:

kubectl apply -f service.yaml

验证 Service

获取 Service 的外部 IP,并验证是否能够访问 Web 应用。

kubectl get services

输出示例:

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
webapp-service     LoadBalancer   10.108.120.5   a1234567890.us-west-2.elb.amazonaws.com   80:30001/TCP   5m

使用外部 IP 访问 Web 应用:

curl http://a1234567890.us-west-2.elb.amazonaws.com

七层负载均衡:Kubernetes Ingress

部署 Ingress Controller

在开始之前,需要部署一个 Ingress Controller,例如 Nginx Ingress Controller。

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

创建 Ingress 资源

创建一个 Ingress 资源来定义路由规则,实现七层负载均衡。

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /webapp
        pathType: Prefix
        backend:
          service:
            name: webapp-service
            port:
              number: 80

应用 Ingress 配置:

kubectl apply -f ingress.yaml

验证 Ingress

获取 Ingress 的外部 IP,并验证是否能够通过定义的路由访问 Web 应用。

kubectl get ingress

输出示例:

NAME              CLASS    HOSTS   ADDRESS                                      PORTS   AGE
webapp-ingress    <none>   *       a1234567890.us-west-2.elb.amazonaws.com   80      5m

使用定义的路由访问 Web 应用:

curl http://a1234567890.us-west-2.elb.amazonaws.com/webapp

四、实例分析

实例一:多服务负载均衡

假设我们有两个服务,分别提供不同的功能,需要通过 Ingress 实现统一的入口访问。

# service1.yaml
apiVersion: v1
kind: Service
metadata:
  name: service1
spec:
  type: ClusterIP
  selector:
    app: service1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

# deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service1-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service1
  template:
    metadata:
      labels:
        app: service1
    spec:
      containers:
      - name: service1
        image: my-service1-image:latest
        ports:
        - containerPort: 8080

# service2.yaml
apiVersion: v1
kind: Service
metadata:
  name: service2
spec:
  type: ClusterIP
  selector:
    app: service2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9090

# deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service2-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service2
  template:
    metadata:
      labels:
        app: service2
    spec:
      containers:
      - name: service2
        image: my-service2-image:latest
        ports:
        - containerPort: 9090

# ingress-multi-service.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-service-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /service1
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
      - path: /service2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

应用所有配置:

kubectl apply -f service1.yaml
kubectl apply -f deployment1.yaml
kubectl apply -f service2.yaml
kubectl apply -f deployment2.yaml
kubectl apply -f ingress-multi-service.yaml

验证访问:

curl http://<ingress-ip>/service1
curl http://<ingress-ip>/service2

实例二:基于主机名的路由

在某些场景下,可能需要根据主机名来路由请求到不同的服务。

# ingress-host-based.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: host-based-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: service1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: service2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

应用 Ingress 配置:

kubectl apply -f ingress-host-based.yaml

验证访问:

curl -H "Host: service1.example.com" http://<ingress-ip>
curl -H "Host: service2.example.com" http://<ingress-ip>

五、项目发展

随着应用的复杂性和需求的增长,可能需要对负载均衡策略进行扩展和优化。

高级路由规则

使用 Ingress 的高级路由注解,可以实现更复杂的路由逻辑,如基于请求头、查询参数等的路由。

# ingress-advanced.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: advanced-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($http_custom_header = 'service1') {
        rewrite ^ /service1$request_uri?;
      }
      if ($http_custom_header = 'service2') {
        rewrite ^ /service2$request_uri?;
      }
spec:
  rules:
  - http:
      paths:
      - path: /service1
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
      - path: /service2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80

监控和性能优化

通过集成监控工具,如 Prometheus 和 Grafana,可以实时监控负载均衡器的性能和状态。

# 部署 Prometheus
kubectl apply -f https://raw.githubusercontent.com/prometheus/prometheus/main/prometheus.yml

# 部署 Grafana
kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/main/grafana.yml

六、总结

本文深入探讨了 Kubernetes 中 Service 和 Ingress 的实现负载均衡的方法,结合实战部署和实例分析,展示了四层和七层负载均衡在不同场景下的应用和优势。从创建部署、Service 和 Ingress,到结合实际案例进行分析,Kubernetes 提供了强大的功能和灵活的配置选项,满足企业多样化的流量管理需求。通过合理规划和持续优化,企业可以构建一个既高效又可靠的流量管理系统,为业务的持续发展提供坚实的技术支持。

七、参考文献

  • [Kubernetes官方文档]

八、常见问题解答

问题 解答
Service无法访问 首先检查 Service 的选择器是否正确匹配了 Pod 的标签。其次,确认 Pod 是否正常运行,并且容器的端口配置正确。最后,检查防火墙和网络安全组是否允许相应的流量
Ingress路由不生效 查看 Ingress 资源的配置,确保路径和主机名设置正确。检查 Ingress Controller 是否正常运行,并且配置了正确的监听端口
如何实现HTTPS支持 可以在 Ingress 资源中添加 TLS 配置,绑定 SSL 证书,实现 HTTPS 访问
负载均衡算法如何选择 Kubernetes Service 默认使用轮询算法,Ingress 可以通过注解配置不同的负载均衡策略,如最少连接数、IP 哈希等
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。