
前言
在 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. 性能瓶颈

原文始发于微信公众号(背带裤的云原生):在 Kubernetes 中使用 Nginx Ingress Controller 实现流量管理与安全控制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/309537.html