Nginx Ingress 控制器:零基础教程

Nginx Ingress 控制器:零基础教程

大家好,欢迎来到 Nginx Ingress 控制器的零基础教程!在这篇文章中,我们将一起探讨 Nginx Ingress
控制器的神奇之处,带你了解它的基本概念、应用场景、如何快速上手以及一些常用特性。别担心,我们会用轻松幽默的方式带你走进 Nginx
Ingress 控制器的世界!

1. 什么是 Nginx Ingress 控制器?

想象一下,Kubernetes(k8s)集群就像是一个繁忙的机场,而 Nginx Ingress 控制器就是那位疏导交通的空中交通管制员。Nginx Ingress
控制器基于 Nginx,是一个专门为 Kubernetes 设计的 Ingress 控制器。它负责监听集群中的 Ingress 资源变化,并根据这些变化自动更新
Nginx 配置,从而实现外部流量的路由和负载均衡。

2. 应用场景

Nginx Ingress 控制器在以下场景中非常有用:

  • 将外部流量路由到 Kubernetes 集群中的服务
  • 为多个服务提供单一入口点
  • 实现流量的负载均衡和 SSL/TLS 终止
  • 应用访问控制、限速、安全性等

3. 快速上手

让我们一起动手部署一个 Nginx Ingress 控制器,并创建一个简单的 Ingress 资源。

3.1 安装 Nginx Ingress 控制器

我们将使用 Helm 安装 Nginx Ingress 控制器。如果您尚未安装
Helm,请参考官方文档安装:https://helm.sh/docs/intro/install/


1. 添加 Nginx 的 Helm 仓库:
   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
2. 更新 Helm 仓库:
   helm repo update
3. 安装 Nginx Ingress 控制器:
   helm install [RELEASE_NAME] ingress-nginx/ingress-nginx

3.2 创建一个简单的 Ingress 资源

  1. 部署一个简单的 HTTP 服务(例如 httpbin):

# httpbin-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  selector:
    matchLabels:
      app: httpbin
  replicas: 1
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      containers:
        - name: httpbin
          image: docker.io/kennethreitz/httpbin
          ports:
            - containerPort: 80

kubectl apply -f httpbin-deployment.yaml
  1. 创建一个 ClusterIP 类型的服务,将流量路由到 httpbin
# httpbin-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: httpbin
spec:
  selector:
    app: httpbin
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

kubectl apply -f httpbin-service.yaml
  1. 创建一个 Ingress 资源,将外部流量路由到 httpbin 服务:

# httpbin-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin
spec:
  rules:
    - host: httpbin.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 80

kubectl apply -f httpbin-ingress.yaml

现在,访问 http://httpbin.example.com 应该会显示 httpbin 服务的内容。请注意,您需要将 httpbin.example.com 的 DNS 解析指向
Nginx Ingress 控制器的 IP 地址。

4. 常用特性

Nginx Ingress 控制器提供了许多有用的特性,以下是一些常见的例子:

4.1 SSL/TLS 终止

要为您的 Ingress 资源启用 SSL/TLS 终止,请将 TLS 证书和密钥存储在 Kubernetes Secret 中,并在 Ingress 资源中引用它们:


# tls-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: httpbin-tls
type: kubernetes.io/tls
data:
  tls.crt: |
    # Base64 编码的 TLS 证书
  tls.key: |
    # Base64 编码的 TLS 私钥

kubectl apply -f tls-secret.yaml

在 Ingress 资源中添加 tls 配置:


# httpbin-ingress-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin
spec:
  tls:
    - hosts:
        - httpbin.example.com
      secretName: httpbin-tls
  rules:
    - host: httpbin.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 80

kubectl apply -f httpbin-ingress-tls.yaml

现在,访问 https://httpbin.example.com 将使用 SSL/TLS 加密。

4.2 访问控制

您可以使用 Ingress 资源的注解来限制对特定服务的访问。例如,使用以下注解仅允许特定 IP 地址范围的访问:


metadata:
  name: httpbin
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/24,10.0.0.0/24"

现在,仅来自 192.168.0.0/2410.0.0.0/24 范围的 IP 地址能够访问 httpbin 服务。

4.3 限速

使用以下注解为 Ingress 资源设置限速:

metadata:
  name: httpbin
  annotations:
    nginx.ingress.kubernetes.io/limit-connections: "10"
    nginx.ingress.kubernetes.io/limit-rps: "5"

现在,每个客户端的最大连接数为 10,每秒请求数(RPS)限制为 5。

5. 注意事项

  • 在大规模部署中,建议使用多个 Nginx Ingress 控制器实例以确保高可用性。
  • 在 Ingress 规则中使用明确的路径类型(如 PrefixExact),以便正确匹配路径。
  • 在生产环境中使用 SSL/TLS,以确保传输安全。

6. 原理概述

Nginx Ingress 控制器使用 Nginx 作为底层代理服务器,并监听 Kubernetes 集群中的 Ingress 资源的变化。当检测到 Ingress
资源变更时,Nginx Ingress 控制器会自动更新 Nginx 配置文件,以正确地路由和负载均衡外部流量到集群内的服务。

总之,Nginx Ingress 控制器是在 Kubernetes 集群中管理外部流量的强大工具。通过本教程,您已经掌握了如何部署 Nginx Ingress
控制器、创建 Ingress 资源以及使用一些常见的特性。现在,您已经准备好将 Nginx Ingress 控制器应用到实际项目中了!祝您好运!

Nginx Ingress 控制器 不用配置 Ingress的地址之类的吗? Nginx Ingress 控制器又怎么检测到Ingress资源的呢

Nginx Ingress 控制器会自动检测 Kubernetes 集群中的 Ingress 资源。它在集群中运行作为一个
Pod,通常部署在一个特殊的命名空间(如 ingress-nginx)中。控制器使用 Kubernetes API 监听 Ingress 资源的变化。当 Ingress
资源被创建、更新或删除时,控制器会收到相应的事件通知。

在收到这些事件通知后,Nginx Ingress 控制器会根据 Ingress 资源中定义的规则生成 Nginx 配置文件。例如,Ingress 资源中的 host
path 规则会转换为 Nginx 配置文件中的 serverlocation 块。然后,控制器会将生成的配置应用到底层的 Nginx
代理服务器,从而实现外部流量的路由和负载均衡。

需要注意的是,Nginx Ingress 控制器本身并不需要配置 Ingress 的地址。控制器会自动监听 Kubernetes 集群中所有的 Ingress
资源,并根据这些资源来生成 Nginx 配置。

但是,要使外部流量能够到达 Nginx Ingress 控制器,您需要确保将域名(如 Ingress 资源中定义的 host)的 DNS 解析指向 Nginx
Ingress 控制器的外部 IP 地址。这通常是通过配置外部负载均衡器、云提供商的负载均衡服务或者 DNS
解析来实现的。在测试环境中,您还可以通过修改本地的 /etc/hosts 文件来实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值