Kubernetes(k8s)手册 Kubernetes 在Minikube环境中使用NGINX Ingress控制器配置Ingress

2024-02-25 开发教程 Kubernetes(k8s)手册 匿名 3

在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress

Ingress是一种 API 对象,其中定义了一些规则使得集群中的 服务可以从集群外访问。 Ingress 控制器 负责满足 Ingress 中所设置的规则。

本节为你展示如何配置一个简单的 Ingress,根据 HTTP URI 将服务请求路由到 服务 ​web ​或 ​web2​。

在开始之前

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

您的 Kubernetes 服务器版本必须不低于版本 1.19。要获知版本信息,请输入 ​kubectl version​。如果你使用的是较早的 Kubernetes 版本,请切换到该版本的文档。

启用 Ingress 控制器

  1. 为了启用 NGINIX Ingress 控制器,可以运行下面的命令:
minikube addons enable ingress
检查验证 NGINX Ingress 控制器处于运行状态:
  • minikube v1.19 或更高版本

kubectl get pods -n ingress-nginx

说明: 最多可能需要等待一分钟才能看到这些 Pod 运行正常。

输出类似于:

NAME                                        READY   STATUS      RESTARTS    AGE
ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m
ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m
ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
  • minikube v1.18.1 或更早版本

kubectl get pods -n kube-system

说明: 最多可能需要等待一分钟才能看到这些 Pod 运行正常。

输出类似于:

NAME                                        READY     STATUS    RESTARTS   AGE
default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
kube-addon-manager-minikube 1/1 Running 0 3m
kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
storage-provisioner 1/1 Running 0 2m

请确保可以在输出中看到一个名称以 ​nginx-ingress-controller-​ 为前缀的 Pod。

部署一个 Hello World 应用

  1. 使用下面的命令创建一个 Deployment:
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

输出:

deployment.apps/web created
将 Deployment 暴露出来:
kubectl expose deployment web --type=NodePort --port=8080

输出:

service/web exposed
验证 Service 已经创建,并且可能从节点端口访问:
kubectl get service web

输出类似于:

NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
使用节点端口信息访问服务:
minikube service web --url

输出类似于:

http://172.17.0.15:31637

说明: 如果使用的是 Katacoda 环境,在终端面板顶端,请点击加号标志。 然后点击 Select port to view on Host 1。 输入节点和端口号(这里是​31637​),之后点击 Display Port。

输出类似于:

Hello, world!
Version: 1.0.0
Hostname: web-55b8c6998d-8k564

你现在应该可以通过 Minikube 的 IP 地址和节点端口来访问示例应用了。 下一步是让自己能够通过 Ingress 资源来访问应用。

创建一个 Ingress

下面是一个定义 Ingress 的配置文件,负责通过 ​hello-world.info​ 将请求 转发到你的服务。

  1. 根据下面的 YAML 创建文件 ​example-ingress.yaml​:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080
通过运行下面的命令创建 Ingress 对象:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml

输出:

ingress.networking.k8s.io/example-ingress created
验证 IP 地址已被设置:
kubectl get ingress

说明: 此操作可能需要几分钟时间。

接下来你将会在ADDRESS列中看到IPv4地址,例如:

NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
example-ingress <none> hello-world.info 172.17.0.15 80 38s
在 ​/etc/hosts​ 文件的末尾添加以下内容(需要管理员访问权限):

说明: 如果你在本地运行 Minikube 环境,需要使用 ​minikube ip​ 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。

172.17.0.15 hello-world.info

添加完成后,在浏览器中访问URL ​hello-world.info​,请求将被发送到 Minikube。

验证 Ingress 控制器能够转发请求流量:
curl hello-world.info

你应该看到类似输出:

Hello, world!
Version: 1.0.0
Hostname: web-55b8c6998d-8k564

说明: 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。

创建第二个 Deployment

  1. 使用下面的命令创建第二个 Deployment:
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0

输出:

deployment.apps/web2 created
将第二个 Deployment 暴露出来:
kubectl expose deployment web2 --port=8080 --type=NodePort

输出:

service/web2 exposed

编辑现有的 Ingress

  1. 编辑现有的 ​example-ingress.yaml​,在文件最后添加以下行:
- path: /v2
pathType: Prefix
backend:
service:
name: web2
port:
number: 8080
应用变更:
kubectl apply -f example-ingress.yaml

输出:

ingress.networking/example-ingress configured

测试你的 Ingress

  1. 访问 HelloWorld 应用的第一个版本:
curl hello-world.info

输出类似于:

Hello, world!
Version: 1.0.0
Hostname: web-55b8c6998d-8k564
访问 HelloWorld 应用的第二个版本:
curl hello-world.info/v2

输出类似于:

Hello, world!
Version: 2.0.0
Hostname: web2-75cd47646f-t8cjk

说明: 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。