WEBKT

Kubernetes Ingress实战:用Ingress Controller管理Web应用外部流量

138 0 0 0

在 Kubernetes 中,Ingress 是一种 API 对象,用于管理对集群中服务的外部访问。Ingress Controller 负责实现 Ingress 规则,它通常是一个负载均衡器,根据 Ingress 规则将外部请求路由到相应的服务。本文将通过一个实际的 Web 应用部署案例,详细讲解如何在 Kubernetes 中使用 Ingress Controller 来管理外部流量。

1. 准备工作

在开始之前,你需要确保已经安装并配置好 Kubernetes 集群,并且安装了 Ingress Controller。常用的 Ingress Controller 有 Nginx Ingress Controller、Traefik 等。本文以 Nginx Ingress Controller 为例进行讲解。

1.1 安装 Nginx Ingress Controller

你可以使用 Helm 来安装 Nginx Ingress Controller。首先,添加 Helm 仓库:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

然后,安装 Nginx Ingress Controller:

helm install my-nginx-ingress ingress-nginx/ingress-nginx

1.2 验证 Ingress Controller 是否正常运行

可以通过查看 Ingress Controller 的 Pod 状态来验证是否正常运行:

kubectl get pods -n ingress-nginx

如果所有 Pod 都处于 Running 状态,则表示 Ingress Controller 已经成功安装并运行。

2. 部署 Web 应用

本文以一个简单的 Nginx Web 应用为例,演示如何通过 Ingress Controller 将其暴露到外部。

2.1 创建 Deployment

创建一个名为 my-web 的 Deployment,使用 Nginx 镜像:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web
  labels:
    app: my-web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-web
  template:
    metadata:
      labels:
        app: my-web
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

保存为 my-web-deployment.yaml,并执行以下命令创建 Deployment:

kubectl apply -f my-web-deployment.yaml

2.2 创建 Service

创建一个名为 my-web 的 Service,将流量路由到 my-web Deployment:

apiVersion: v1
kind: Service
metadata:
  name: my-web
  labels:
    app: my-web
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: my-web

保存为 my-web-service.yaml,并执行以下命令创建 Service:

kubectl apply -f my-web-service.yaml

3. 配置 Ingress

创建一个 Ingress 对象,定义外部流量如何路由到 my-web Service。

3.1 创建 Ingress 规则

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-web-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myweb.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-web
            port:
              number: 80
  • host: 定义了域名,这里使用 myweb.example.com。你需要将其替换为你自己的域名,并在 DNS 中将该域名指向 Ingress Controller 的 IP 地址。
  • path: 定义了路径,这里使用 /,表示所有请求都路由到 my-web Service。
  • backend: 定义了后端服务,指定了 Service 的名称和端口。
  • nginx.ingress.kubernetes.io/rewrite-target: 这个 annotation 的作用是将请求的 URI 重写为 /,因为 Nginx 默认会将完整的 URI 传递给后端服务。

保存为 my-web-ingress.yaml,并执行以下命令创建 Ingress:

kubectl apply -f my-web-ingress.yaml

3.2 获取 Ingress Controller 的 IP 地址

执行以下命令获取 Ingress Controller 的 IP 地址:

kubectl get service -n ingress-nginx ingress-nginx-controller

在 EXTERNAL-IP 列中可以看到 Ingress Controller 的 IP 地址。如果 EXTERNAL-IP 处于 pending 状态,则表示 Ingress Controller 正在分配 IP 地址,需要等待一段时间。

3.3 配置 DNS

将域名 myweb.example.com 指向 Ingress Controller 的 IP 地址。具体操作方法取决于你的 DNS 服务提供商。

4. 验证 Ingress 是否生效

在浏览器中访问 http://myweb.example.com,如果能够看到 Nginx 的欢迎页面,则表示 Ingress 已经成功配置并生效。

5. 总结

本文通过一个实际的 Web 应用部署案例,详细讲解了如何在 Kubernetes 中使用 Ingress Controller 来管理外部流量。通过 Ingress,我们可以方便地将集群中的服务暴露到外部,并实现负载均衡、SSL termination 等功能。希望本文能够帮助你更好地理解和使用 Kubernetes Ingress。

6. 拓展

  • Ingress Class: Ingress Class 用于指定使用哪个 Ingress Controller 来处理 Ingress 资源。 你可以创建多个 Ingress Controller,并使用 Ingress Class 来区分它们。 例如,你可以创建一个专门处理内部流量的 Ingress Controller,以及一个专门处理外部流量的 Ingress Controller。
  • TLS: Ingress 支持 TLS termination,可以将 HTTPS 请求转换为 HTTP 请求,从而减轻后端服务的压力。 你需要准备好 TLS 证书和密钥,并在 Ingress 资源中配置 TLS。 例如,你可以使用 Let's Encrypt 自动生成 TLS 证书。
  • 高级路由: Ingress 支持基于 Header、Cookie 等的路由规则,可以实现更复杂的流量管理。 例如,你可以根据用户的地理位置将请求路由到不同的后端服务。

通过灵活运用 Ingress 的各种功能,可以更好地管理 Kubernetes 集群中的外部流量,提升应用的可用性和性能。

K8s爱好者 KubernetesIngress ControllerWeb应用部署

评论点评