一、使用域名发布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,观察到访问成功

nginx访问界面

补充说明:如果不想在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 允许你将负载均衡器的数量降至最低。例如,这样的设置:

单域名匹配同一IP流量到不同服务

针对上面设置,进行示例说明:

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 地址的任何网络流量,而无需基于名称的虚拟主机。