一、Ingress 资源定义¶
表示Ingress的yaml示例如下
apiVersion: networking.k8s.io/v1 # Kubernetes 1.22+ 必须使用此版本
kind: Ingress
metadata:
name: nginx-ingress # Ingress资源名称
spec:
ingressClassName: nginx # 指定处理此Ingress的Controller
rules: # 路由规则列表
- host: "nginx.test.com" # 匹配的域名(需真实存在DNS解析)
http:
paths: # 路径规则列表
- path: / # URL路径(根路径)
pathType: ImplementationSpecific # 路径匹配规则类型
backend: # 后端服务配置
service:
name: nginx # 目标Service名称
port:
number: 80 # 目标Service端口
详细内容解析:
apiVersion
- 表示使用的Kubernetes API版本
- networking.k8s.io/v1 是Kubernetes 1.22+版本的标准API版本
- 旧版本可能使用 extensions/v1beta1 或 networking.k8s.io/v1beta1
kind
- 资源类型标识,此处固定为 Ingress
metadata
- 包含元数据信息:
- name: Ingress资源在集群中的唯一标识
- 可选的labels/annotations等(未在示例中展示)
spec.ingressClassName
- 核心配置项,指定处理该Ingress的Controller
- 需要与已部署的Ingress Controller名称匹配(如:nginx/alb/traefik等)
- Kubernetes 1.18+ 替代旧版 annotation 方式(kubernetes.io/ingress.class)
spec.rules
- 定义流量路由规则列表,每个规则包含:
- host: 匹配的域名(需符合DNS规范)
- http.paths: 路径规则集合
path配置
- path: URL路径(支持正则表达式,取决于Controller实现)
- pathType: 路径匹配规则类型,可选:
- Exact:精确匹配,比如配置的 path 为/bar,那么/bar/将不能被路由
- Prefix:前缀匹配,基于以/分隔的URL路径。比如 path 为/abc,可以匹配到/abc/bbb 等,比较常用的配置
- ImplementationSpecific:这种类型的路由匹配根据Ingress Controller来实现,可以当做一个单独的类型,也可以当做Prefix和Exact。ImplementationSpecific是1.18版本引入Prefix和Exact的默认配置
backend配置
- 定义流量转发的目标服务
- service.name: 目标Service资源名称
- service.port.number: 目标Service的端口号
二、使用域名发布 K8s 服务¶
在上面已经安装完成Ingress Controller安装的情况下, 进行在线测试,即使用域名发布 K8s 的服务。
[root@k8s-master01 ~]# kg ingressclass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 29m
1.创建一个web服务
$ k create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
2.暴露服务
$ k expose deploy nginx --port 80
3.定义一个yaml文件
$ vim web-ingress.yaml
apiVersion: networking.k8s.io/v1 #版本大于1.22,必须选择v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
上面参数说明:
- rules:一个Ingress可以配置多个rule。
- host:可选,一般都会配置对应的域名
- paths:域名的location配置,同一个host可以配置多个path。比如有一个路径格式为xxx.com/abc,可以配置path为/abc,每个路径都有一个对应的backend,对应到应用的Service和Port。
- pathType:路径的匹配方式,目前有ImplementationSpecific、Exact和Prefix方式
- ImplementationSpecific:这种类型的路由匹配根据Ingress Controller来实现,可以当作一个单独的类型,也可以当作Prefix和Exact。ImplementationSpecific是1.18版本引入Prefix和Exact的默认配置。
- Exact:精确匹配,比如配置的path为/bar,那么/bar/将不能被路由。
- Prefix:前缀匹配,基于以“/”分隔的URL路径。比如path为/abc,可以匹配到/abc/bbb等,比较常用的配置。
- backend:描述Service和Port的组合,对Ingress匹配主机和路径的HTTP与HTTPS请求将被发送到对应的后端。
- backend.service.name:代理的Service名字。
- backend.service.port:代理的Service端口配置。
- backend.service.port.number:数字型的端口号配置,比如80。
- ingressClassName:指定ingress controller的名字,一个集群中可以有多个controller,如果是ingress-nginx,controller名字为nginx。
- kubernetes.io/ingress.class:代表使用Nginx控制器,v1版本使用spec.ingressClassName代替。
4.创建 Ingress
$ kaf web-ingress.yaml
5.验证是否创建成功
[root@k8s-master01 day012]# k get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx nginx.test.com 10.0.0.22 80 26s
6.查看服务端口
[root@k8s-master01 day012]# k get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.109.149.52 <none> 80:31779/TCP,443:32647/TCP 3m50s
ingress-nginx-controller-admission ClusterIP 10.102.105.145 <none> 443/TCP 3m50s
7.在本机电脑的hosts文件(C:\Windows\System32\drivers\etc\hosts)末尾处填写IP地址和服务的对应关系
10.0.0.22 nginx.test.com
8.在本机电脑刷新DNS缓存
$ ipconfig/flushdns
9.打开浏览器访问nginx.test.com,观察到访问成功

如果不想在windows添加hosts文件,可直接在linux机器中执行下面操作:
curl -H "Host: nginx.test.com" http://10.0.0.22
10.清理环境
# 清除ingress
k delete -f web-ingress.yaml
# 清除deploy
k delete deploy nginx
# 清除service
k delete svc nginx
三、不配置域名发布服务¶
1.创建一个web服务
$ k create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
2.暴露服务
$ k expose deploy nginx --port 80
3.定义一个yaml文件
$ vim ingress-no-host.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: no-host
spec:
ingressClassName: nginx
rules:
- http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /no-host
pathType: ImplementationSpecific
2.部署服务
$ kaf ingress-no-host.yaml
3.详细查看相关pod的详细信息
[root@k8s-master01 day012]# kgp -n ingress-nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-bqplm 0/1 Completed 0 9h <none> k8s-node02 <none> <none>
ingress-nginx-admission-patch-95kt9 0/1 Completed 2 9h <none> k8s-node02 <none> <none>
ingress-nginx-controller-qwmkm 1/1 Running 1 (7m44s ago) 9h 10.0.0.22 k8s-node02 <none> <none>
4.测试,观察到返回404,但是返回了nginx版本信息,这是因为名字为ingress-nginx-controller-bdc4b7d6b-b6kkg的Pod没有/no-host路径
$ curl 10.0.0.22/no-host
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
10.清理环境
# 清除ingress
k delete -f ingress-no-host.yaml
# 清除deploy
k delete deploy nginx
# 清除service
k delete svc nginx