Logo
Section 1 / 5

简介

了解什么是 Ingress,以及如何在集群中添加一个 Ingress 控制器。

导入

简介

了解什么是 Ingress,以及如何在集群中添加一个 Ingress 控制器。

入口(Ingress)简介

Ingress 是 Kubernetes 中用于将 HTTP(S) 路由暴露给外部用户的另一种资源。

你可以将 Ingress 理解为位于多个服务前端的组件,根据你定义的规则,决定某个请求应被转发到哪个服务。

...
Ingress 概览

添加入口控制器

Ingress 资源的一个特殊之处在于,要使其正常工作,必须在集群中运行一个 Ingress Controller。该控制器负责处理你创建的每个 Ingress 资源。

目前有多种开源控制器可供选择,各自具备不同的功能特性。我们将在集群中运行 nginx ingress controller,但所使用的功能在其他控制器中也基本兼容。

如果你想了解其他控制器选项,请参考官方 Kubernetes 文档中的此页面。

可以通过应用以下清单文件来部署 nginx ingress controller:

1kubectl apply -f \ 2https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/\ 3deploy/static/provider/cloud/deploy.yaml

通过以下命令确认控制器是否正在运行:

1kubectl get pods --all-namespaces \ 2 -l app.kubernetes.io/name=ingress-nginx 3 4# NAMESPACE NAME READY STATUS 5# ingress-nginx nginx-ingress-contr... 1/1 Running

如果看到 Pod 处于运行且就绪状态,说明已准备就绪。

开始前的准备工作

在开始探索 Ingress 资源之前,先准备好环境,确保已有服务在运行。我们将启动两个服务:一个是 hellok8s 应用,另一个是 nginx。

如果有任何正在运行的部署或服务,需先删除以确保环境干净,使用以下命令:

1kubectl delete deployment,service --all

如果没有,则可直接进行下一步。

接下来,为 hellok8s 应用创建一个 Service 和一个 Deployment:

1apiVersion: v1 2kind: Service 3metadata: 4 name: hellok8s-svc 5spec: 6 selector: 7 app: hellok8s 8 ports: 9 - port: 4567 10 targetPort: 4567 11 12--- 13 14apiVersion: apps/v1 15kind: Deployment 16metadata: 17 name: hellok8s 18spec: 19 replicas: 2 20 selector: 21 matchLabels: 22 app: hellok8s 23 template: 24 metadata: 25 labels: 26 app: hellok8s 27 spec: 28 containers: 29 - image: brianstorti/hellok8s:v3 30 name: hellok8s-container

同样方式为 nginx 创建配置:

1# nginx.yaml 2apiVersion: v1 3kind: Service 4metadata: 5 name: nginx-svc 6spec: 7 selector: 8 app: nginx 9 ports: 10 - port: 1234 11 targetPort: 80 12 13--- 14 15apiVersion: apps/v1 16kind: Deployment 17metadata: 18 name: nginx 19spec: 20 replicas: 2 21 selector: 22 matchLabels: 23 app: nginx 24 template: 25 metadata: 26 labels: 27 app: nginx 28 spec: 29 containers: 30 - image: nginx 31 name: nginx-container

注意:我们在同一个文件中同时创建了 Service 和 Deployment。多个资源可以放在同一份清单文件中,用三个连字符(---)分隔。这是常见的做法,通常将 Service 和 Deployment 一起管理。

No configuration found for ID: c7a7b7f254458fa953bb41eecd860b7c044155267911d4d29d6cb5a803dbd557

然后使用以下命令应用这些清单文件:

1kubectl apply -f hellok8s.yaml 2# service/hellok8s-svc created 3# deployment.apps/hellok8s created 4 5kubectl apply -f nginx.yaml 6# service/nginx-svc created 7# deployment.apps/nginx created

检查当前运行的 Pod 和服务,你应该能看到四个 Pod(每个应用两个副本)和两个服务:

1kubectl get pods 2# NAME READY STATUS RESTARTS 3# hellok8s-7f4c57d446-6c8b8 1/1 Running 0 4# hellok8s-7f4c57d446-jkqbl 1/1 Running 0 5# nginx-77c5c66899-dgkk2 1/1 Running 0 6# nginx-77c5c66899-w9srw 1/1 Running 0 7 8kubectl get service 9# NAME TYPE CLUSTER-IP PORT(S) 10# hellok8s-svc ClusterIP 10.102.242.233 4567/TCP 11# nginx-svc ClusterIP 10.96.19.78 1234/TCP

所有 Pod 均正常运行,我们有两个 ClusterIP 类型的服务,分别监听端口 4567 和 1234。

Ingress 实际应用

目前这些服务仅可在集群内部访问,现在我们来看看如何通过 Ingress 将它们对外暴露。

记住,Ingress 位于服务前端,通过定义规则来决定请求应转发至哪个服务。我们先从一个简单的 Ingress 开始,它会将所有收到的请求都转发到 nginx-svc:

1apiVersion: networking.k8s.io/v1 2kind: Ingress 3metadata: 4 name: hello-ingress 5 annotations: 6 # 通过此注解防止 nginx 将请求重定向到 HTTPS 7 nginx.ingress.kubernetes.io/ssl-redirect: "false" 8spec: 9 rules: 10 - http: 11 paths: 12 - path: / 13 pathType: Prefix 14 backend: 15 service: 16 name: nginx-svc 17 port: 18 number: 1234

使用以下命令应用该 Ingress:

1kubectl apply -f ingress.yaml 2# ingress.extensions/hello-ingress created 3 4# 如果应用时出现错误,请执行以下命令后重新应用 5# 若无错误,可跳过此步骤 6kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 7 8kubectl get ingress 9# NAME HOSTS ADDRESS PORTS AGE 10# hello-ingress * localhost 80 1m

现在我们有一个监听在 localhost:80 的 Ingress。我们将在后续课程中解释 "HOSTS: *" 的含义。

查看 Ingress 清单,可以看到我们定义了一条规则:所有路径为 "/" 的请求都将被转发到 nginx-svc 服务,目标端口为 1234。

现在尝试访问上述 URL,你应该能看到默认的 nginx 欢迎页面。

...
Ingress 概览

但如果 Ingress 只能做这些事,那它与单一的 LoadBalancer 服务区别不大。下面我们扩展这个示例,让它更有趣。

我们将更新 Ingress 清单,添加一条新的路径规则:所有发送到 "/hello" 路径的请求都将转发到 hellok8s-svc。其逻辑与 nginx 规则完全相同,只是在同一清单中新增了一个条目:

1apiVersion: networking.k8s.io/v1 2kind: Ingress 3metadata: 4 name: hello-ingress 5 annotations: 6 # 通过此注解防止 nginx 将请求重定向到 HTTPS 7 nginx.ingress.kubernetes.io/ssl-redirect: "false" 8spec: 9 rules: 10 - http: 11 paths: 12 - path: / 13 pathType: Prefix 14 backend: 15 service: 16 name: nginx-svc 17 port: 18 number: 1234 19 - path: /hello 20 pathType: Prefix 21 backend: 22 service: 23 name: hellok8s-svc 24 port: 25 number: 4567

应用该清单文件,观察效果:

1kubectl apply -f ingress-updated.yaml 2# ingress.extensions/hello-ingress configured 3 4# 为了在平台上运行 Ingress,需要执行以下端口转发命令: 5# 本地运行时无需此命令 6nohup kubectl port-forward --address 0.0.0.0 -n ingress-nginx service/ingress-nginx-controller 80:80 > /dev/null 2>&1 & 7 8curl http://localhost/hello 9# [v3] Hello, Kubernetes, from hellok8s-7f4c57d446-qth54! 10 11curl http://localhost 12# (nginx 欢迎页面)

现在,根据接收到的路径不同,Ingress 会将请求转发到不同的服务!

...
Ingress 路径匹配概览

Kubernetes 为容器化应用带来了哪些价值

按主机定义规则