通过Kubectl命令行创建ELB Ingress
本文以Nginx工作负载为例,说明通过kubectl命令添加ELB Ingress的方法。
- 如您在同一VPC下没有可用的ELB,CCE支持在添加Ingress时自动创建ELB,请参考添加Ingress时自动创建ELB。
- 如您已在同一VPC下提前创建了一个可用的ELB,则可参考添加Ingress时对接已有ELB。
前提条件
- Ingress为后端工作负载提供网络访问,因此集群中需提前部署可用的工作负载。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署示例nginx工作负载。
- 为上述工作负载配置Service,ELB Ingress支持的Service类型请参见ELB Ingress支持的Service类型。
- 独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP地址)。
使用kubectl命令行创建Ingress
您可以在添加Ingress时选择是否自动创建ELB或使用已有的ELB。
下面介绍如何通过kubectl命令在添加Ingress时自动创建ELB。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本,之前版本集群使用networking.k8s.io/v1beta1。v1版本与v1beta1版本的区别请参见关于CCE v1.23集群中Ingress API版本升级的说明。
共享型负载均衡(公网访问)示例 -1.23及以上版本集群:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: union kubernetes.io/elb.port: '80' kubernetes.io/elb.autocreate: '{ "type":"public", "bandwidth_name":"cce-bandwidth-******", "bandwidth_chargemode":"bandwidth", "bandwidth_size":5, "bandwidth_sharetype":"PER", "vip_subnet_cidr_id": "*****", "vip_address": "**.**.**.**", "eip_type":"5_bgp" }' kubernetes.io/elb.tags: key1=value1,key2=value2 # 添加ELB资源标签 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: cce # 表示使用ELB Ingress
共享型负载均衡(公网访问)示例 - 1.21及以下版本集群:apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: union kubernetes.io/ingress.class: cce # 表示使用ELB Ingress kubernetes.io/elb.port: '80' 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.tags: key1=value1,key2=value2 # 添加ELB资源标签 spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: <your_service_port> #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
独享型负载均衡(公网访问)示例 - 1.23及以上版本集群:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/elb.class: performance kubernetes.io/elb.port: '80' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "vip_subnet_cidr_id": "*****", "vip_address": "**.**.**.**", "elb_virsubnet_ids":["*****"], "available_zone": [ "ap-southeast-1a" ], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.tags: key1=value1,key2=value2 # 添加ELB资源标签 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: cce
独享型负载均衡(公网访问)示例 - 1.21及以下版本集群:apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/elb.class: performance kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '80' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "elb_virsubnet_ids":["*****"], "available_zone": [ "ap-southeast-1a" ], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.tags: key1=value1,key2=value2 # 添加ELB资源标签 spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: <your_service_port> #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
表1 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/elb.class
是
String
请根据不同的应用场景和功能需求选择合适的负载均衡器类型。
取值如下:
- union:共享型负载均衡。
- performance:独享型负载均衡,详情请参见共享型弹性负载均衡与独享型负载均衡的功能区别。
默认值为“union”
kubernetes.io/ingress.class
是
(仅1.21及以下集群)
String
cce:表示使用自研ELBIngress。
通过API接口创建Ingress时必须增加该参数。
ingressClassName
是
(仅1.23及以上集群)
String
cce:表示使用自研ELBIngress。
通过API接口创建Ingress时必须增加该参数。
kubernetes.io/elb.port
是
String
界面上的对外端口,为注册到负载均衡服务地址上的端口。
取值范围:1~65535。
说明:部分端口为高危端口,默认被屏蔽,如21端口。
kubernetes.io/elb.subnet-id
-
String
为集群所在子网的ID,取值范围:1~100字符。
- Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填。
- Kubernetes v1.11.7-r0以上版本的集群:可不填,默认为""。
kubernetes.io/elb.enterpriseID
否
String
Kubernetes v1.15及以上版本的集群支持此字段;Kubernetes v1.15以下版本默认创建到default项目下。
企业项目ID,选择后可以直接创建在具体的企业项目下。
取值范围:1~100字符。
获取方法:
登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。
kubernetes.io/elb.autocreate
是
elb.autocreate object
自动创建Ingress关联的ELB,详细字段说明参见表2。
示例:
kubernetes.io/elb.tags
否
String
为ELB添加资源标签,仅自动创建ELB时支持设置,且集群版本需满足v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上。
格式为key=value,同时添加多个标签时以英文逗号(,)隔开。
host
否
String
为服务访问域名配置,默认为"",表示域名全匹配。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
path
是
String
为路由路径,用户自定义设置。所有外部访问请求需要匹配host和path。
说明:此处添加的访问路径要求后端应用内存在相同的路径,否则转发无法生效。
例如,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:前缀匹配
- REGEX:正则匹配
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路径匹配示例,请参见示例。
表2 elb.autocreate字段数据结构说明 参数
是否必填
参数类型
描述
name
否
String
自动创建的负载均衡的名称。
取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。
默认名称:cce-lb+service.UID
type
否
String
负载均衡实例网络类型,公网或者私网。
- public:公网型负载均衡
- inner:私网型负载均衡
默认类型:inner
bandwidth_name
公网型负载均衡必填
String
带宽的名称,默认值为:cce-bandwidth-******。
取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。
bandwidth_chargemode
否
String
带宽付费模式。
- bandwidth:按带宽
- traffic:按流量
默认类型:bandwidth
bandwidth_size
公网型负载均衡必填
Integer
带宽大小,默认1Mbit/s~2000Mbit/s,请根据Region带宽支持范围设置。
调整带宽时的最小单位会根据带宽范围不同存在差异。- 小于等于300Mbit/s:默认最小单位为1Mbit/s。
- 300Mbit/s~1000Mbit/s:默认最小单位为50Mbit/s。
- 大于1000Mbit/s:默认最小单位为500Mbit/s。
bandwidth_sharetype
公网型负载均衡必填
String
带宽共享方式。
- PER:独享带宽
eip_type
公网型负载均衡必填
String
弹性公网IP类型。
- 5_telcom:电信
- 5_union:联通
- 5_bgp:全动态BGP
- 5_sbgp:静态BGP
具体类型以各区域配置为准,详情请参见弹性公网IP控制台。
vip_subnet_cidr_id
否
String
指定ELB所在的子网,该子网必须属于集群所在的VPC。
如不指定,则ELB与集群在同一个子网。
仅v1.21及以上版本的集群支持指定该字段。
vip_address
否
String
负载均衡器的内网IP。仅支持指定IPv4地址,不支持指定IPv6地址。
该IP必须为ELB所在子网网段中的IP。若不指定,自动从ELB所在子网网段中生成一个IP地址。
仅v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上版本集群支持指定该字段。
available_zone
是
Array of strings
负载均衡所在可用区。
可以通过查询可用区列表获取所有支持的可用区。
独享型负载均衡器独有字段。
l4_flavor_name
是
String
四层负载均衡实例规格名称。
可以通过查询规格列表获取所有支持的类型。
独享型负载均衡器独有字段。
l7_flavor_name
否
String
七层负载均衡实例规格名称。
可以通过查询规格列表获取所有支持的类型。
独享型负载均衡器独有字段,必须与l4_flavor_name对应规格的类型一致,即都为弹性规格或都为固定规格。
elb_virsubnet_ids
否
Array of strings
负载均衡后端所在子网,不填默认为集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。
独享型负载均衡器独有字段。
示例:
"elb_virsubnet_ids": [ "14567f27-8ae4-42b8-ae47-9f847a4690dd" ]
ipv6_vip_virsubnet_id
否
String
双栈类型负载均衡器所在子网的IPv6网络ID,需要对应的子网开启IPv6,仅使用双栈集群时需填写。
独享型负载均衡器独有字段。
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/ingress-test created
- 查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功。
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-test cce * 121.**.**.** 80 10s
- 访问工作负载(例如Nginx工作负载),在浏览器中输入访问地址http://121.**.**.**:80进行验证。
其中,121.**.**.**为统一负载均衡实例的IP地址。
CCE支持在添加Ingress时选择对接已有的ELB。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
- CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本,之前版本集群使用networking.k8s.io/v1beta1。v1版本与v1beta1版本的区别请参见关于CCE v1.23集群中Ingress API版本升级的说明。
- 对接已有独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP)。
以1.23及以上版本集群为例,YAML文件配置如下: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.class: performance #ELB类型 kubernetes.io/elb.port: '80' spec: 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
以1.21及以下版本集群为例,YAML文件配置如下:
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.class: performance #ELB类型 kubernetes.io/elb.port: '80' kubernetes.io/ingress.class: cce spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
表3 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/elb.id
是
String
为负载均衡实例的ID,取值范围:1-100字符。
获取方法:
在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。
kubernetes.io/elb.ip
否
String
为负载均衡实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。
kubernetes.io/elb.class
是
String
负载均衡器类型。
- union:共享型负载均衡。
- performance:独享型负载均衡,仅支持1.17及以上集群,详情请参见共享型弹性负载均衡与独享型负载均衡的功能区别。
说明:ELB Ingress对接已有的独享型ELB时,该独享型ELB必须支持应用型(HTTP/HTTPS)规格。
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/ingress-test created
- 查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功。
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-test cce * 121.**.**.** 80 10s
- 访问工作负载(例如Nginx工作负载),在浏览器中输入访问地址http://121.**.**.**:80进行验证。
其中,121.**.**.**为统一负载均衡实例的IP地址。