通过Kubectl命令行创建Nginx Ingress
操作场景
本节以Nginx工作负载为例,说明kubectl命令添加Nginx Ingress的方法。
前提条件
- 集群必须已安装NGINX Ingress 控制器,具体操作可参考安装插件。
- Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。
- 为上述工作负载配置ClusterIP类型或NodePort类型的Service,可参考集群内访问(ClusterIP)或节点访问(NodePort)配置示例Service。
networking.k8s.io/v1版本Ingress说明
CCE在v1.23版本集群开始Ingress切换到networking.k8s.io/v1版本。
v1版本参数相较v1beta1参数有如下区别。
- ingress类型由annotations中kubernetes.io/ingress.class变为使用spec.ingressClassName字段。
- backend的写法变化。
- 每个路径下必须指定路径类型pathType,支持如下类型。
- ImplementationSpecific: 对于这种路径类型,匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式,这与v1beta1方式相同。
- Exact:精确匹配 URL 路径,且区分大小写。
- Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。
添加Nginx Ingress
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本,之前版本集群使用networking.k8s.io/v1beta1。v1版本与v1beta1版本的区别请参见networking.k8s.io/v1版本Ingress说明。
以HTTP协议访问为例,YAML文件配置如下。
1.23及以上版本集群:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test spec: rules: - host: '' http: paths: - path: / backend: service: name: <your_service_name> #替换为您的目标服务名称 port: number: <your_service_port> #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: nginx # 表示使用Nginx Ingress
1.21及以下版本集群:apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/ingress.class: nginx # 表示使用Nginx Ingress spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: <your_service_port> #替换为您的目标服务端口
表1 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/ingress.class
是(仅1.21及以下集群)
String
nginx:表示使用NginxIngress,未安装nginx-ingress插件时无法使用。
通过API接口创建Ingress时必须增加该参数。
ingressClassName
是
(仅1.23及以上集群)
String
nginx:表示使用NginxIngress,未安装nginx-ingress插件时无法使用。
通过API接口创建Ingress时必须增加该参数。
host
否
String
为服务访问域名配置,默认为"",表示域名全匹配。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
path
是
String
为路由路径,用户自定义设置。所有外部访问请求需要匹配host和path。
说明:- Nginx Ingress的访问路径匹配规则是基于“/”符号分隔的路径前缀匹配,并区分大小写。只要访问路径以“/”符号分隔后的子路径匹配此前缀,均可正常访问,但如果该前缀仅是子路径中的部分字符串,则不会匹配。例如URL设置为/healthz,则匹配/healthz/v1,但不匹配/healthzv1。
- 此处添加的访问路径要求后端应用内存在相同的路径,否则转发无法生效。
例如,Nginx应用默认的Web访问路径为“/usr/share/nginx/html”,在为Ingress转发策略添加“/test”路径时,需要应用的Web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。
ingress.beta.kubernetes.io/url-match-mode
否
String
路由匹配策略。
默认值为“STARTS_WITH”(前缀匹配)。
取值范围:
- EQUAL_TO:精确匹配
- STARTS_WITH:前缀匹配
pathType
是
String
路径类型,该字段仅v1.23及以上集群支持。- ImplementationSpecific: 匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式。
- Exact:精确匹配 URL 路径,且区分大小写。
- Prefix:前缀匹配,且区分大小写。该方式是将URL路径通过“/”分隔成多个元素 ,并且对元素进行逐个匹配。 如果URL中的每个元素均和路径匹配,则说明该URL的子路径均可以正常路由。
说明:
- Prefix匹配时每个元素均需精确匹配,如果URL的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 。例如:/foo/bar匹配/foo/bar/baz,但不匹配/foo/barbaz。
- 通过“/”分隔元素时,若URL或请求路径以“/”结尾,将会忽略结尾的“/”。例如:/foo/bar会匹配/foo/bar/。
关于Ingress路径匹配示例,请参见示例。
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/ingress-test created
查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功,工作负载可访问。
NAME HOSTS ADDRESS PORTS AGE ingress-test * 121.**.**.** 80 10s
- 访问工作负载(例如Nginx工作负载),在浏览器中输入访问地址“http://121.**.**.**:80”进行验证。
其中,“121.**.**.**”为统一负载均衡实例的IP地址。