在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制

 

在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制

前言

在 Kubernetes 环境中,随着微服务架构的普及,服务之间的通信变得更加复杂。Ingress Controller 作为 Kubernetes 内置的流量管理工具,能够实现外部流量的入站路由、负载均衡和安全控制。Nginx Ingress Controller 是最常用的实现之一,因其高效、稳定、易于扩展等特点,在生产环境中得到了广泛的应用。

本文将详细介绍如何在 Kubernetes 中部署 Nginx Ingress Controller,并讲解如何配置流量路由、SSL/TLS 终端、访问控制等功能。通过本教程,你将掌握如何优化和管理 Kubernetes 中的服务流量。


一、Nginx Ingress Controller 原理与架构

1. Ingress Controller 的基本概念

Ingress 是 Kubernetes 中的一种 API 对象,允许你通过 HTTP 或 HTTPS 协议访问集群中的服务。它通常用于管理外部流量进入 Kubernetes 集群,负责将流量根据规则路由到不同的服务。

Ingress Controller 是一个实际的实现,用于处理和管理 Ingress 资源。Nginx Ingress Controller 是最常用的 Ingress Controller 之一,能够将外部 HTTP/S 请求根据配置规则转发到对应的服务。

2. Nginx Ingress Controller 的组件

  • • Ingress Resource:定义了如何将外部 HTTP 请求路由到 Kubernetes 服务的规则,包括主机名、路径、后端服务等信息。
  • • Nginx Ingress Controller:监听 Kubernetes 中的 Ingress 资源,根据定义的路由规则将流量转发到目标服务。
  • • Nginx 配置模板:Nginx Ingress Controller 使用动态配置模板,支持高效的负载均衡、路由策略和健康检查等功能。

二、在 Kubernetes 中安装 Nginx Ingress Controller

1. 安装 Nginx Ingress Controller

首先,确保你的 Kubernetes 集群已成功创建并配置了 kubectl。接下来,通过 Helm 安装 Nginx Ingress Controller:


helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace kube-system --create-namespace

这个命令会将 Nginx Ingress Controller 部署到 Kubernetes 集群的 kube-system 命名空间中。

2. 验证 Nginx Ingress Controller 状态

检查 Ingress Controller 的 Pod 是否正常运行:


kubectl get pods -n kube-system -l app.kubernetes.io/name=ingress-nginx

输出示例:


NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-xxxxxx-xxxxx       1/1     Running   0          10m
ingress-nginx-controller-xxxxxx-xxxxx       1/1     Running   0          10m

3. 配置 LoadBalancer 服务

如果你希望在生产环境中使用 LoadBalancer,可以将 Ingress Controller 的 Service 类型修改为 LoadBalancer,并为它分配公网 IP。

编辑 nginx-ingress-controller-service.yaml 文件:


apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: kube-system
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
    - protocol: TCP
      port: 443
      targetPort: 443

应用该配置:


kubectl apply -f nginx-ingress-controller-service.yaml

三、配置流量管理与负载均衡

1. 创建 Ingress 资源

在 Kubernetes 中,你可以通过定义 Ingress 资源来指定流量路由规则。例如,我们创建一个简单的 Ingress 资源,将流量根据路径路由到不同的服务。

首先,创建一个测试服务 my-app


apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-app
  namespace: default
spec:
  ports:
    - port: 80
  selector:
    app: my-app

然后,创建一个对应的 Ingress 资源来路由流量:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: myapp.local
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: my-app
              port:
                number: 80

应用 Ingress 配置:


kubectl apply -f my-app-ingress.yaml

2. 配置路径和主机路由

Nginx Ingress Controller 支持基于 路径 和 主机 来路由流量。例如,以下配置将流量根据不同路径路由到不同的服务:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-path-ingress
  namespace: default
spec:
  rules:
    - host: myapp.local
      http:
        paths:
        - path: /service1
          pathType: Prefix
          backend:
            service:
              name: service1
              port:
                number: 80
        - path: /service2
          pathType: Prefix
          backend:
            service:
              name: service2
              port:
                number: 80

四、Nginx Ingress Controller 的高级功能

1. SSL/TLS 终端

Nginx Ingress Controller 支持通过 TLS 证书 配置 HTTPS 加密,确保流量安全。首先,你需要创建一个 Kubernetes Secret 来存储 TLS 证书:


kubectl create secret tls myapp-tls --cert=/path/to/cert.crt --key=/path/to/cert.key -n default

然后,修改 Ingress 资源以启用 TLS:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
spec:
  tls:
    - hosts:
        - myapp.local
      secretName: myapp-tls
  rules:
    - host: myapp.local
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: my-app
              port:
                number: 80

2. 访问控制与认证

Nginx Ingress Controller 允许你设置 基本认证 来控制对服务的访问。你可以通过创建一个 Secret 存储用户名和密码,并将其引用到 Ingress 资源中。

创建一个包含基本认证信息的 Secret:


kubectl create secret generic basic-auth
  --from-literal=username=admin
  --from-literal=password=secret-password
  -n default

然后,在 Ingress 中引用该 Secret:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: "Protected Area"
spec:
  rules:
    - host: myapp.local
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: my-app
              port:
                number: 80

3. 日志和监控

通过配置 Nginx Ingress Controller 的日志,可以帮助我们进行 故障排查 和 性能分析。你可以通过 Prometheus 和 Grafana 集成来监控流量数据和 Ingress 的性能。


五、常见问题与优化

1. 流量路由不生效

  • • 原因:可能是 Ingress 配置的路径或主机名不正确,或者 Nginx Ingress Controller 未能成功加载配置。
  • • 解决方法:检查 Ingress 资源和 Service 是否匹配,并查看 Nginx Ingress Controller 的日志(kubectl logs <nginx-ingress-pod> -n kube-system)。

2. SSL 配置错误

  • • 原因:TLS 证书配置不正确,或 Secret 名称错误。
  • • 解决方法:确认 Secret 存在且命名正确,并检查证书格式是否符合要求。

3. 性能瓶颈

  • • 原因:大量并发请求可能导致 Nginx 负载过高,影响性能。
  • • 解决方法:增加 Nginx Ingress Controller 的副本数,或调整 Nginx 的配置参数,如缓冲区、连接池等。
  • 在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制

 

在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制

原文始发于微信公众号(背带裤的云原生):在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/309537.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!