云容器引擎 CCE云容器引擎 CCE

计算
弹性云服务器 ECS
裸金属服务器 BMS
云手机 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器 HECS
VR云渲游平台 CVR
特惠算力专区
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属企业存储服务
云存储网关 CSG
专属分布式存储服务 DSS
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘小站 IES
智能边缘平台 IEF
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
园区智能体 CampusGo
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
视频分析服务 VAS
语音交互服务 SIS
知识图谱 KG
人证核身服务 IVS
IoT物联网
设备接入 IoTDA
设备管理 IoTDM(联通用户专用)
全球SIM联接 GSL
IoT开发者服务
IoT数据分析
车联网服务 IoV
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
开发与运维
软件开发平台 DevCloud
项目管理 ProjectMan
代码托管 CodeHub
流水线 CloudPipeline
代码检查 CodeCheck
编译构建 CloudBuild
部署 CloudDeploy
云测 CloudTest
发布 CloudRelease
移动应用测试 MobileAPPTest
CloudIDE
Classroom
开源镜像站 Mirrors
应用魔方 AppCube
云性能测试服务 CPTS
应用管理与运维平台 ServiceStage
云应用引擎 CAE
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
资源管理服务 RMS
应用身份管理服务 OneAccess
区块链
区块链服务 BCS
可信跨链服务 TCS
智能协作
IdeaHub
开发者工具
SDK开发指南
API签名指南
DevStar
HCloud CLI
Terraform
Ansible
API问题定位指导
云生态
云市场
合作伙伴中心
华为云培训中心
其他
管理控制台
消息中心
产品价格详情
系统权限
我的凭证
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
应用编排服务 AOS
多云容器平台 MCP
基因容器 GCS
容器洞察引擎 CIE
云原生服务中心 OSC
容器批量计算 BCE
容器交付流水线 ContainerOps
应用服务网格 ASM
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB (for openGauss)
云数据库 GaussDB(for MySQL)
云数据库 GaussDB NoSQL
数据管理服务 DAS
数据库和应用迁移 UGO
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据湖治理中心 DGC
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
API网关 APIG
分布式缓存服务 DCS
分布式消息服务RocketMQ版
企业应用
域名注册服务 Domains
云解析服务 DNS
云速建站 CloudSite
网站备案
华为云WeLink
会议
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMAExchange
API全生命周期管理 ROMA API
安全与合规
安全技术与应用
DDoS防护 ADS
Web应用防火墙 WAF
云防火墙 CFW
应用信任中心 ATC
企业主机安全 HSS
容器安全服务 CGS
云堡垒机 CBH
数据库安全服务 DBSS
数据加密服务 DEW
数据安全中心 DSC
云证书管理服务 CCM
SSL证书管理 SCM
漏洞扫描服务 VSS
态势感知 SA
威胁检测服务 MTD
管理检测与响应 MDR
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
专属云
专属计算集群 DCC
解决方案
高性能计算 HPC
SAP
游戏云
混合云灾备
华为工业云平台 IMC
价格
成本优化最佳实践
专属云商业逻辑
用户服务
帐号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
文档首页> 云容器引擎 CCE> 用户指南> 网络管理> Ingress> 通过Kubectl命令行添加ELB型Ingress
更新时间:2021-11-08 GMT+08:00
分享

通过Kubectl命令行添加ELB型Ingress

操作场景

本节以nginx工作负载为例,说明kubectl命令添加ELB型Ingress的方法。

前提条件

添加Ingress-自动创建ELB

下面介绍如何通过kubectl命令在添加Ingress时自动创建ELB。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行如下命令,创建名为“ingress-test.yaml”的yaml文件。

    vi ingress-test.yaml

    • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
    • 1.13及以下集群版本中的apiVersion为: extensions/v1beta1

    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: '80'
        kubernetes.io/elb.subnet-id: <your_subnet_id>  #替换为您的子网所在ID
        kubernetes.io/elb.enterpriseID: <your_enterprise_id>  #替换为您的企业项目ID
        kubernetes.io/elb.autocreate: 
          '{
              "type":"public",
              "bandwidth_name":"cce-bandwidth-******",
              "bandwidth_chargemode":"bandwidth",
              "bandwidth_size":5,
              "bandwidth_sharetype":"PER",
              "eip_type":"5_bgp",
              "name":"james"
            }'
    spec:
      rules: 
      - host: ''
        http: 
          paths: 
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH

    独享型负载均衡(公网访问)实例:

    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.subnet-id: <your_subnet_id>  #替换为您的子网所在ID
        kubernetes.io/elb.enterpriseID: <your_enterprise_id>  #替换为您的企业项目ID
        kubernetes.io/elb.autocreate: 
          '{
              "type": "public",
              "bandwidth_name": "cce-bandwidth-******",
              "bandwidth_chargemode": "bandwidth",
              "bandwidth_size": 1,
              "bandwidth_sharetype": "PER",
              "eip_type": "5_bgp",
              "available_zone": [
                  "cn-south-2b"
              ],
              "l7_flavor_name": "L7_flavor.elb.s1.small",
              "elb_virsubnet_ids": [
                  "14567f27-8ae4-42b8-ae47-9f847a4690**"
              ]
           }'
    spec:
      rules:
      - host: ''
        http:
          paths:
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    表1 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.class

    String

    请根据不同的应用场景和功能需求选择合适的负载均衡器类型。

    取值如下:

    默认值:union

    kubernetes.io/ingress.class

    String

    cce:表示使用自研ELB型Ingress。

    通过API接口创建Ingress时必须增加该参数。

    kubernetes.io/elb.port

    Integer

    界面上的对外端口,为注册到负载均衡服务地址上的端口。

    取值范围:1-65535。

    kubernetes.io/elb.subnet-id

    -

    String

    为集群所在子网的ID,取值范围:1-100字符。

    • Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填。
    • Kubernetes v1.11.7-r0以上版本的集群:可不填,默认为空。

    获取方法请参见:VPC子网接口与OpenStack Neutron子网接口的区别是什么?

    kubernetes.io/elb.enterpriseID

    String

    v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。

    ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。

    取值范围:1-100字符。

    获取方法:

    登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。

    kubernetes.io/elb.autocreate

    elb.autocreate object

    自动创建Ingress关联的ELB,详细字段说明参见表2

    示例:

    • 公网自动创建:

      值为 '{"type":"public","bandwidth_name":"cce-bandwidth-******","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 私网自动创建:

      值为 '{"type":"inner", "name": "A-location-d-test"}'

    host

    String

    为服务访问域名配置,默认为空,表示域名全匹配。

    path

    String

    为路由路径,用户自定义设置。所有外部访问请求需要匹配host和path。

    serviceName

    String

    Ingress绑定的目标Service名称。

    servicePort

    Integer

    目标Service的访问端口。

    ingress.beta.kubernetes.io/url-match-mode

    String

    路由匹配策略。

    默认值:STARTS_WITH(前缀匹配)。

    取值范围:

    • EQUAL_TO:精确匹配
    • STARTS_WITH:前缀匹配
    • REGEX:正则匹配
    表2 elb.autocreate字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    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

    name

    String

    自动创建的负载均衡的名称。

    取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。

    默认值:cce-lb+ingress.UID

    available_zone

    Array of strings

    负载均衡所在可用区,必填项。

    独享型负载均衡器独有字段。

    l4_flavor_name

    String

    四层负载均衡实例名称。

    独享型负载均衡器独有字段。

    l7_flavor_name

    String

    七层负载均衡实例名称,必填项。

    独享型负载均衡器独有字段。

    ElbVirSubnetIDs

    Array of strings

    负载均衡后端所在子网,不填默认集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。

    默认值:集群所在子网

    独享型负载均衡器独有字段。

  3. 执行如下命令创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

    kubectl get ingress

    回显如下,表示Ingress服务创建成功,工作负载可访问。

    NAME             HOSTS     ADDRESS          PORTS   AGE
    ingress-test     *         121.**.**.**     80      10s

  4. 访问工作负载(例如nginx工作负载),在浏览器中输入访问地址http://121.**.**.**:80进行验证。

    其中,121.**.**.**为统一负载均衡实例的IP地址。

添加Ingress-对接已有ELB

使用如下的YAML文件在添加Ingress时对接已有的ELB。
  • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
  • 1.13及以下集群版本中的apiVersion为: extensions/v1beta1

以1.15及以上集群版本为例,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.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。

配置HTTPS证书

  • 服务需要以HTTPS协议的方式对外暴露时,需要在Ingress中配置TLS密钥证书。创建密钥的方法请参见创建密钥
  • 同一个ELB实例的同一个端口配置HTTPS时,需要选择一样的证书。
  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.11及以上版本的集群中支持。

    以自动创建关联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.subnet-id: <your_subnet_id>  #替换为您的子网所在ID
        kubernetes.io/elb.enterpriseID: <your_enterprise_id>  #替换为您的企业项目ID
        kubernetes.io/elb.autocreate: 
          '{
              "type":"public",
              "bandwidth_name":"cce-bandwidth-15511633796**",
              "bandwidth_chargemode":"bandwidth",
              "bandwidth_size":5,
              "bandwidth_sharetype":"PER",
              "eip_type":"5_bgp",
              "name":"james"
            }'
        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
    表4 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.tls-ciphers-policy

    String

    默认值:“tls-1-2”,为监听器使用的安全策略,仅在HTTPS协议下生效。

    取值范围:

    • tls-1-0
    • tls-1-1
    • tls-1-2
    • tls-1-2-strict

    各安全策略使用的加密套件列表详细参见表5

    tls

    Array of strings

    HTTPS协议时,需添加此字段。该字段可添加多项独立的域名和证书,详见配置服务器名称指示(SNI)

    secretName

    String

    HTTPS协议时添加,配置为创建的密钥证书名称。

    表5 tls_ciphers_policy取值说明

    安全策略

    支持的TLS版本类型

    使用的加密套件列表

    tls-1-0

    TLS 1.2

    TLS 1.1

    TLS 1.0

    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: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.1

    tls-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

    kubectl get ingress

    回显如下,表示Ingress服务创建成功,工作负载可访问。

    NAME             HOSTS     ADDRESS          PORTS   AGE
    ingress-test     *         121.**.**.**     80      10s

  6. 访问工作负载(例如nginx工作负载),在浏览器中输入安全访问地址https://121.**.**.**:443进行验证。

    其中,121.**.**.**为统一负载均衡实例的IP地址。

配置服务器名称指示(SNI)

SNI允许同一个IP地址和端口号下对外提供多个基于TLS的访问域名,且不同的域名可以使用不同的安全证书。
  • 用于SNI的证书需要指定域名,每个证书只能指定一个域名。支持泛域名证书。
  • 安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。
满足以上条件时可进行SNI配置,以自动创建关联ELB为例,yaml文件配置如下,本例中sni-test-secret-1sni-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.subnet-id: <your_subnet_id>  #替换为您的子网所在ID
    kubernetes.io/elb.enterpriseID: <your_enterprise_id>  #替换为您的企业项目ID
    kubernetes.io/elb.autocreate: 
      '{
          "type":"public",
          "bandwidth_name":"cce-bandwidth-******",
          "bandwidth_chargemode":"bandwidth",
          "bandwidth_size":5,
          "bandwidth_sharetype":"PER",
          "eip_type":"5_bgp",
          "name":"james"
        }'
    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
分享:

    相关文档

    相关产品

关闭导读