一、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,观察到访问成功

nginx访问界面

如果不想在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