前提条件
- Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。
- 独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP地址)。
注意事项
- 建议其他资源不要使用Ingress自动创建的ELB实例,否则在删除Ingress时,ELB实例会被占用,导致资源残留。
- 添加Ingress后请在CCE页面对所选ELB实例进行配置升级和维护,不可在ELB页面对配置进行更改,否则可能导致Ingress服务异常。
- Ingress转发策略中注册的URL需与后端应用暴露的URL一致,否则将返回404错误。
- IPVS模式集群下,Ingress和Service使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress,因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,Ingress对接的ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service使用不同ELB实例。
- 请勿将Ingress与使用HTTP的Service对接同一个ELB下的同一个监听器,否则将产生端口冲突。
添加ELB Ingress
本节以nginx作为工作负载并添加ELB Ingress为例进行说明。
步骤 1 登录CCE控制台,单击集群名称进入集群。
步骤 2 选择左侧导航栏的“服务发现”,在右侧选择“路由”页签,单击右上角“创建路由”。
步骤 3 设置Ingress参数。
- 名称: 自定义Ingress名称,例如ingress-demo。
- 对接Nginx: 此选项只有在安装了nginx-ingress插件后才会显示。如显示了“对接Nginx”,则说明您安装了nginx-ingress插件,创建ELB Ingress时不能打开该项开关,如果打开则是使用Nginx Ingress Controller。
- 负载均衡器:
选择对接的ELB实例,仅支持与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”调整到ELB控制台创建。
独享型ELB规格需要支持应用型(HTTP),且网络类型必须支持私网。
-
监听器配置: Ingress为负载均衡器配置监听器,监听器对负载均衡器上的请求进行监听,并分发流量。配置完成后ELB实例侧将会创建对应的监听器,名称默认为k8s_<协议类型>_<端口号>,例如“k8s_HTTP_80”。
- 对外协议:支持HTTP和HTTPS。
- 对外端口:开放在负载均衡服务地址的端口,可任意指定。
- 证书来源:支持IngressTLS密钥和ELB服务器证书。
- 服务器证书:负载均衡器创建HTTPS协议监听时需要绑定证书,以支持HTTPS数据传输加密认证。
-
IngressTLS密钥:创建密钥证书的方法请参见创建密钥。
-
ELB服务器证书:使用在ELB服务中创建的证书。
说明同一个ELB实例的同一个端口配置HTTPS时,一个监听器只支持配置一个密钥证书。若使用两个不同的密钥证书将两个Ingress添加到同一个ELB下的同一个监听器,ELB侧实际只生效最先添加的证书。 -
SNI:单击后开启SNI功能。SNI(Server Name Indication)是TLS的扩展协议,在该协议下允许同一个IP地址和端口号下对外提供多个基于TLS的访问域名,且不同的域名可以使用不同的安全证书。开启SNI后,允许客户端在发起TLS握手请求时就提交请求的域名信息。负载均衡收到TLS请求后,会根据请求的域名去查找证书:若找到域名对应的证书,则返回该证书认证鉴权;否则,返回缺省证书(服务器证书)认证鉴权。
说明
当选择HTTPS协议时,才支持配置“SNI”选项。
该功能仅支持1.15.11及以上版本的集群。
用于SNI的证书需要指定域名,每个证书只能指定一个域名。支持泛域名证书。
转发策略配置: 请求的访问地址与转发规则匹配时(转发规则由域名、URL组成,例如:10.117.117.117:80/helloworld),此请求将被转发到对应的目标Service处理。单击“添加转发策略”按钮可添加多条转发策略。
- 域名:实际访问的域名地址。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
- URL匹配规则:
- 前缀匹配:例如映射URL为/healthz,只要符合此前缀的URL均可访问。例如/healthz/v1,/healthz/v2
- 精确匹配:表示只有URL完全匹配时,访问才能生效。例如映射URL为/healthz,则必须为此URL才能访问
- 正则匹配:按正则表达式方式匹配URL。例如正则表达式为 /[A-Za-z0-9_.-]+/test 。只要符合此规则的URL均可访问,例如/abcA9/test,/v1-Ab/test。正则匹配规则支持POSIX与Perl两种标准。
- URL:需要注册的访问路径,例如:/healthz。
说明此处添加的URL路径要求后端应用内存在相同的路径,否则转发无法生效。
例如,Nginx应用默认的Web访问路径为“/usr/share/nginx/html”,在为Ingress转发策略添加“/test”路径时,需要应用的Web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。
-
目标服务名称:请选择已有Service或新建Service。页面列表中的查询结果已自动过滤不符合要求的Service。
-
目标服务访问端口:可选择目标Service的访问端口。
-
操作:可单击“删除”按钮删除该配置。
步骤 4 配置完成后,单击“确定”。创建完成后,在Ingress列表可查看到已添加的Ingress。
在ELB控制台可查看通过CCE自动创建的ELB,名称默认为“cce-lb-ingress.UID”。单击ELB名称进入详情页,在“监听器”页签下即可查看Ingress对应的路由设置,包括URL、监听器端口以及对应的后端服务器组端口。
注意Ingress创建后请在CCE页面对所选ELB实例进行配置升级和维护,不要在ELB控制台对ELB实例进行维护,否则可能导致Ingress服务异常。
图 ELB路由设置
步骤 5 访问工作负载(例如名称为defaultbackend)的“/healthz”接口。
- 获取工作负载“/healthz”接口的访问地址。访问地址由负载均衡实例IP、对外端口、映射URL组成,例如:10. . .**:80/healthz。
- 在浏览器中输入“/healthz”接口的访问地址,如:http://10. . .**:80/healthz,即可成功访问工作负载。
图 访问defaultbackend“/healthz”接口
配置HTTPS证书
Ingress支持配置TLS证书,以HTTPS协议的方式对外提供安全服务。
当前支持使用配置在集群中的IngressTLS密钥证书,以及ELB服务中的证书。
说明同一个ELB实例的同一个端口配置HTTPS时,需要选择一样的证书。
使用IngressTLS密钥证书
步骤 1 请参见通过kubectl连接集群,使用kubectl连接集群。
步骤 2 执行如下命令,创建名为“ ingress-test-secret.yaml ”的YAML文件,此处文件名可自定义。
vi ingress-test-secret.yaml
YAML文件配置如下:
apiVersion: v1
data:
tls.crt: LS0******tLS0tCg==
tls.key: LS0tL******0tLS0K
kind: Secret
metadata:
annotations:
description: test for ingressTLS secrets
name: ingress-test-secret
namespace: default
type: IngressTLS
此处tls.crt和tls.key为示例,请获取真实密钥进行替换。tls.crt和tls.key的值为Base64编码后的内容。
步骤 3 创建密钥。
kubectl create -f ingress-test-secret.yaml
回显如下,表明密钥已创建。
secret/ingress-test-secret created
查看已创建的密钥。
kubectl get secrets
回显如下,表明密钥创建成功。
NAME TYPE DATA AGE
ingress-test-secret IngressTLS 2 13s
步骤 4 创建名为“ ingress-test.yaml ”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
说明默认安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.17及以上版本的集群中支持。
自定义安全策略选择(kubernetes.io/elb.security_policy_id)仅在1.17.17及以上版本的集群中支持。
以自动创建关联ELB为例,YAML文件配置如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/elb.class: union
kubernetes.io/ingress.class: cce
kubernetes.io/elb.port: '443'
kubernetes.io/elb.autocreate:
'{
"type":"public",
"bandwidth_name":"cce-bandwidth-15511633796**",
"bandwidth_chargemode":"bandwidth",
"bandwidth_size":5,
"bandwidth_sharetype":"PER",
"eip_type":"5_bgp"
}'
kubernetes.io/elb.security_policy_id: 99bec42b-0dd4-4583-98e9-b05ce628d157 #自定义安全策略优先级高于系统默认安全策略
kubernetes.io/elb.tls-ciphers-policy: tls-1-2
spec:
tls:
- secretName: ingress-test-secret
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
表 关键参数说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
kubernetes.io/elb.security_policy_id | 否 | String | ELB中自定义安全组策略ID,请前往ELB控制台获取。该字段仅在HTTPS协议下生效,且优先级高于默认安全策略。 |
kubernetes.io/elb.tls-ciphers-policy | 否 | String | 默认值为“tls-1-2”,为监听器使用的默认安全策略,仅在HTTPS协议下生效。取值范围:l tls-1-0l tls-1-1l tls-1-2l tls-1-2-strict |
tls | 否 | Array of strings | HTTPS协议时,需添加此字段。该字段可添加多项独立的域名和证书,详见配置服务器名称指示(SNI)。 |
secretName | 否 | String | HTTPS协议时添加,配置为创建的密钥证书名称。 |
表 tls_ciphers_policy取值说明
安全策略 支持的TLS版本类型 使用的加密套件列表 tls-1-0 TLS 1.2
TLS 1.1
TLS 1.0ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA tls-1-1 TLS 1.2
TLS 1.1tls-1-2 TLS 1.2 tls-1-2-strict TLS 1.2 ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384
步骤 5 创建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
步骤 6 访问工作负载(例如Nginx工作负载),在浏览器中输入安全访问地址https://121. . .**:443进行验证。
其中,121. . .**为统一负载均衡实例的IP地址。
使用ELB服务中的证书
使用ELB服务中的证书,可以通过指定kubernetes.io/elb.tls-certificate-ids这个annotations实现。
说明
当同时指定annotation中已有证书和IngressTLS时,使用ELB服务中的证书。
CCE不校验ELB服务中的证书是否有效,只校验证书是否存在。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/ingress.class: cce
kubernetes.io/elb.port: '443'
kubernetes.io/elb.id: 0b9a6c4d-bd8b-45cc-bfc8-ff0f9da54e95
kubernetes.io/elb.class: union
kubernetes.io/elb.tls-certificate-ids: 058cc023690d48a3867ad69dbe9cd6e5,b98382b1f01c473286653afd1ed9ab63
spec:
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
使用HTTP/2
Ingress支持HTTP/2的方式暴露服务,在默认情况下,客户端与LB之间采用HTTP1.X协议,若需开启HTTP/2功能,可在annotation字段中加入如下配置:
kubernetes.io/elb.http2-enable: 'true'
以关联已有ELB为例,yaml配置文件如下。
1.21及以下版本集群:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/elb.id: <your_elb_id> #替换为您已有的ELB ID
kubernetes.io/elb.ip: <your_elb_ip> #替换为您已有的ELB IP
kubernetes.io/elb.port: '443'
kubernetes.io/ingress.class: cce
kubernetes.io/elb.http2-enable: 'true' # 开启HTTP/2功能
spec:
tls:
- secretName: ingress-test-secret
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80 #替换为您的目标服务端口
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
1.23及以上版本集群:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/elb.id: <your_elb_id> #替换为您已有的ELB ID
kubernetes.io/elb.ip: <your_elb_ip> #替换为您已有的ELB IP
kubernetes.io/elb.port: '443'
kubernetes.io/elb.http2-enable: 'true' # 开启HTTP/2功能
spec:
tls:
- secretName: ingress-test-secret
rules:
- host: ''
http:
paths:
- path: '/'
backend:
service:
name: <your_service_name> #替换为您的目标服务名称
port:
number: 8080 #替换为您的目标服务端口
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
pathType: ImplementationSpecific
ingressClassName: cce
表 HTTP/2参数说明
参数 是否必填 参数类型 描述 kubernetes.io/elb.http2-enable 否 Bool 表示HTTP/2功能的开启状态。开启后,可提升客户端与LB间的访问性能,但LB与后端服务器间仍采用HTTP1.X协议。v1.19.16-r0**、v1.21.3-r0及以上版本的集群支持此字段**。 取值范围:
true:开启HTTP/2功能;
false:关闭HTTP/2功能(默认为关闭状态)。
注意:只有当监听器的协议为HTTPS时,才支持开启或关闭HTTP/2功能。当监听器的协议为HTTP时,该字段无效,默认将其设置为false。
配置服务器名称指示(SNI)
SNI允许同一个IP地址和端口号下对外提供多个基于TLS的访问域名,且不同的域名可以使用不同的安全证书。
说明
用于SNI的证书需要指定域名,每个证书只能指定一个域名。支持泛域名证书。
安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。
满足以上条件时可进行SNI配置,以自动创建关联ELB为例,yaml文件配置如下,本例中 sni-test-secret-1 、sni-test-secret-2为SNI证书,该证书指定的域名必须与证书中的域名一致。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/elb.class: union
kubernetes.io/ingress.class: cce
kubernetes.io/elb.port: '443'
kubernetes.io/elb.autocreate:
'{
"type":"public",
"bandwidth_name":"cce-bandwidth-******",
"bandwidth_chargemode":"bandwidth",
"bandwidth_size":5,
"bandwidth_sharetype":"PER",
"eip_type":"5_bgp"
}'
kubernetes.io/elb.tls-ciphers-policy: tls-1-2
spec:
tls:
- secretName: ingress-test-secret
- hosts:
- example.top #签发证书时指定域名为example.top
secretName: sni-test-secret-1
- hosts:
- example.com #签发证书时指定域名为example.com
secretName: sni-test-secret-2
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
路由到多个服务
Ingress可通过不同的匹配策略同时路由到多个后端服务,YAML文件中的spec字段设置如下。通过访问“www.example.com/foo”、“www.example.com/bar”、“foo.example.com/”即可分别路由到三个不同的后端Service。
说明Ingress转发策略中注册的URL需与后端应用暴露的URL一致,否则将返回404错误。
spec:
rules:
- host: 'www.example.com'
http:
paths:
- path: '/foo'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- path: '/bar'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- host: 'foo.example.com'
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> #替换为您的目标服务名称
servicePort: 80
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH