一、使用域名发布Kubernetes服务¶
在上面已经安装完成Ingress Controller安装的情况下, 进行在线测试,即使用域名发布 K8s 的服务。
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
$ k create -f web-ingress.yaml
ingress.networking.k8s.io/nginx-ingress created
5.验证是否创建成功
$ k get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx nginx.test.com 192.168.1.34 80 13m
注意:下面设置域名对应的IP不能是192.168.1.34
6.查看服务端口
$ k get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.0.22.158 <none> 80:30813/TCP,443:30922/TCP 24m
ingress-nginx-controller-admission ClusterIP 10.0.55.111 <none> 443/TCP 24m
7.在本机电脑的hosts文件(C:\Windows\System32\drivers\etc\hosts)末尾处填写IP地址和服务的对应关系
192.168.1.31 nginx.test.com
8.在本机电脑刷新DNS缓存
$ ipconfig/flushdns
9.打开浏览器访问nginx.test.com:30813,观察到访问成功

补充说明:如果不想在windows添加hosts文件,可直接在linux机器中执行下面操作:
curl -H "Host: nginx.test.com" http://10.0.0.31:32712
二、不配置域名发布服务¶
1.定义一个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.部署服务
$ k create -f ingress-no-host.yaml
ingress.networking.k8s.io/no-host created
3.详细查看相关pod的详细信息
$ k get po -n ingress-nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-68pq8 0/1 Completed 0 39m 172.25.244.195 k8s-master01 <none> <none>
ingress-nginx-admission-patch-r8fhk 0/1 Completed 2 39m 172.18.195.3 k8s-master03 <none> <none>
ingress-nginx-controller-bdc4b7d6b-b6kkg 1/1 Running 0 39m 172.17.125.3 k8s-node01 <none> <none>
4.测试,观察到返回404,但是返回了nginx版本信息,这是因为名字为ingress-nginx-controller-bdc4b7d6b-b6kkg的Pod没有/no-host路径
$ curl 172.17.125.3/no-host
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
三、单域名匹配多Path到不同服务¶
一个扇出(fanout)配置根据请求的 HTTP URI 将来自同一 IP 地址的流量路由到多个 Service。 Ingress 允许你将负载均衡器的数量降至最低。例如,这样的设置:

针对上面设置,进行示例说明:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
四、多域名匹配到相同服务¶
基于名称的虚拟主机支持将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。例如,这样的设置:

针对上面设置,进行示例说明:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: bar.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
说明:如果你创建的 Ingress 资源没有在 rules 中定义的任何 hosts,则可以匹配指向 Ingress 控制器 IP 地址的任何网络流量,而无需基于名称的虚拟主机。