文档首页 > > 用户指南> 网络管理> Ingress>

通过Kubectl命令行创建Ingress

通过Kubectl命令行创建Ingress

分享
更新时间:2021/04/07 GMT+08:00

操作场景

本节以nginx为例,说明kubectl命令实现ingress访问的方法。

前提条件

请参见通过kubectl或web-terminal插件操作CCE集群配置kubectl命令,使弹性云服务器连接集群。

创建Ingress-对接已有ELB

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml以及ingress-test-secret.yaml文件。

    ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml、ingress-test-secret.yaml为自定义名称,您可以随意命名。

    • 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见创建密钥
    • 同一个ELB实例的同一个端口配置HTTPS时,选择的证书需要是一样的。

    vi ingress-test-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ingress-test-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ingress-test-deployment
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: ingress-test-deployment
        spec:
          containers:
            #第三方公开镜像,可以参见描述获取地址,也可以使用自己的镜像
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi ingress-test-svc.yaml

    apiVersion: v1 
    kind: Service 
    metadata: 
      labels: 
        app: ingress-test-svc
      name: ingress-test-svc
    spec: 
      ports: 
      - name: service0 
        port: 8888
        protocol: TCP 
        targetPort: 8888       #若需要设置多个端口,可依次填写,如下展示
      - name: service1 
        port: 8081 
        protocol: TCP 
        targetPort: 8081
      selector: 
        app: ingress-test-deployment
      type:  NodePort
    表1 关键参数说明

    参数

    是否必填

    参数类型

    描述

    port

    Integer

    集群虚拟IP的访问端口,取值范围为1 ~ 65535。

    protocol

    String

    该端口的IP协议,支持“TCP”和“UDP”。

    targetPort

    String

    对应界面上的容器端口,应用程序实际监听的端口,取值范围为1 ~ 65535。

    type

    String

    采用Nodeport的访问类型连接负载均衡,NodePort表示“节点私有IP”。

    vi ingress-test-ingress.yaml

    • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
    • 1.13及以下集群版本中的apiVersion为: extensions/v1beta1
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress 
    metadata: 
      annotations: 
        kubernetes.io/elb.id: f7891f9a-49f2-4ee2-b1ae-f019cd84eb4f
        kubernetes.io/elb.ip: 192.168.0.39
        kubernetes.io/elb.subnet-id: 29a0567e-96f1-4227-91cc-64f54d0b064d
        kubernetes.io/elb.port: "80"
        kubernetes.io/ingress.class: cce
        kubernetes.io/elb.tls-ciphers-policy: tls-1-2
      name: ingress-test-ingress
    spec:
      tls:
      - secretName: ingress-test-secret
      rules: 
      - http: 
          paths: 
          - backend: 
              serviceName: ingress-test-svc
              servicePort: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO
            path: "/healthz"
        host: ingress.com

    安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。

    表2 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.id

    String

    为共享型负载均衡实例的ID,取值范围:1-100字符。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。

    kubernetes.io/elb.ip

    String

    为共享型负载均衡实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。

    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.eip-id

    String

    为弹性公网的ID,取值范围:1-100字符。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > 弹性公网IP EIP”,单击EIP的名称,在EIP详情页的“基本信息”中找到“ID”字段复制即可。

    kubernetes.io/elb.enterpriseID

    String

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

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

    取值范围:1-100字符。

    获取方法:

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

    kubernetes.io/elb.tls-ciphers-policy

    String

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

    取值范围:

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

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

    kubernetes.io/elb.port

    Integer

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

    取值范围:1-65535。

    kubernetes.io/ingress.class

    String

    是否开启nginx-ingress插件。

    • cce:表示不开启nginx-ingress插件,将默认使用共享型负载均衡实例。
    • nginx:表示开启nginx-ingress插件。

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

    tls

    Array of strings

    HTTPS协议时,需添加此参数。

    secretName

    String

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

    serviceName

    String

    为ingress-test-svc.yaml的服务名称。

    servicePort

    Integer

    为ingress-test-svc.yaml的Port。

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

    String

    路由匹配策略。

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

    取值范围:

    • EQUAL_TO:精确匹配
    • STARTS_WITH:前缀匹配
    • REGEX:正则匹配

    path

    String

    为路由路径,用户自定义设置。

    host

    String

    为域名配置,默认为空,域名全匹配。

    表3 tls_ciphers_policy取值说明

    安全策略

    支持的TLS版本类型

    使用的加密套件列表

    tls-1-0-inherit

    TLSv1.2 TLSv1.1 TLSv1

    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:DHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA:DHE-DSS-AES128-SHA:CAMELLIA128-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA:ECDHE-RSA-RC4-SHA:RC4-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:CAMELLIA256-SHA:EDH-DSS-DES-CBC3-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA

    tls-1-0

    TLS1v1.2 TLSv1.1 TLSv1

    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

    tls1-1

    TLSv1.2 TLSv1.1

    tls-1-2

    TLSv1.2

    tls-1-2-strict

    TLSv1.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

    vi ingress-test-secret.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-deployment.yaml

    回显如下,表明工作负载已创建。

    deployment/ingress-test-deployment created

    kubectl get po

    回显如下,表明工作负载创建成功。

    NAME                            READY     STATUS             RESTARTS   AGE
    ingress-test-1627801589-r64pk   1/1       Running            0          6s

  4. 创建密钥。

    kubectl create -f ingress-test-secret.yaml

    回显如下,表明密钥已创建。

    secret/ingress-test-secret created

    kubectl get secrets

    回显如下,表明密钥创建成功。

    NAME                         TYPE                                  DATA      AGE
    dash-dashboard               Opaque                                0         7d
    dash-dashboard-token-f2nbk   kubernetes.io/service-account-token   3         7d
    default-secret               kubernetes.io/dockerconfigjson        1         8d
    default-token-wfn4l          kubernetes.io/service-account-token   3         8d
    paas.elb                     cfe/secure-opaque                     2         8d
    ingress-test-secret          IngressTLS                            2         13s

  5. 创建服务。

    kubectl create -f ingress-test-svc.yaml

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

    service/ingress-test-svc created

    kubectl get svc

    回显如下,表示服务创建成功。

    NAME            TYPE          CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
    ingress-test    NodePort      10.247.189.207    <none>       8080:30532/TCP   5s
    kubernetes      ClusterIP     10.247.0.1        <none>        443/TCP          3d

    kubectl create -f ingress-test-ingress.yaml

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

    ingress/ingress-test-ingress created

    kubectl get ingress

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

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

  6. 在浏览器中输入访问地址http://10.154.76.63/healthz。

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

    图1 访问healthz

创建Ingress-自动创建ELB

  1. 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml以及ingress-test-secret.yaml文件。

    ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml、ingress-test-secret.yaml为自定义名称,您可以随意命名。

    • 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见创建密钥
    • 同一个ELB实例的同一个端口配置HTTPS时,选择的证书需要是一样的。

    vi ingress-test-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ingress-test-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ingress-test-deployment
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: ingress-test-deployment
        spec:
          containers:
            #第三方公开镜像,可以参见描述获取地址,也可以使用自己的镜像
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi ingress-test-svc.yaml

    apiVersion: v1 
    kind: Service 
    metadata: 
      labels: 
        app: ingress-test-svc
      name: ingress-test-svc
    spec: 
      ports: 
      - name: service0 
        port: 8888
        protocol: TCP 
        targetPort: 8888       #若需要设置多个端口,可依次填写,如下展示
      - name: service1 
        port: 8081 
        protocol: TCP 
        targetPort: 8081
      selector: 
        app: ingress-test-deployment
      type:  NodePort
    表4 关键参数说明

    参数

    是否必填

    参数类型

    描述

    port

    Integer

    集群虚拟IP的访问端口,取值范围为1 ~ 65535。

    protocol

    String

    该端口的IP协议,支持“TCP”和“UDP”。

    targetPort

    String

    对应界面上的容器端口,应用程序实际监听的端口,取值范围为1 ~ 65535。

    type

    String

    采用Nodeport的访问类型连接负载均衡,NodePort表示“节点私有IP”。

    vi ingress-test-ingress.yaml

    • 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
    • 1.13及以下集群版本中的apiVersion为: apps/v1
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress 
    metadata: 
      annotations: 
        kubernetes.io/elb.subnet-id: 29a0567e-96f1-4227-91cc-64f54d0b064d
        kubernetes.io/elb.enterpriseID: f6b9fffc-a9b7-4a50-a25e-364f587abe44
        kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'
        kubernetes.io/elb.tls-ciphers-policy: tls-1-2
        kubernetes.io/elb.port: "80"
        kubernetes.io/ingress.class: cce
      name: ingress-test-ingress
    spec:
      tls:
      - secretName: ingress-test-secret
      rules: 
      - http: 
          paths: 
          - backend: 
              serviceName: ingress-test-svc
              servicePort: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO
            path: "/healthz"
        host: ingress.com
    表5 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.autocreate

    elb.autocreate object

    自动创建Ingress关联的ELB

    示例:

    • 公网自动创建:

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

    • 私网自动创建:

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

    表6 elb.autocreate字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    name

    String

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

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

    默认值:cce-lb+ingress.UID

    type

    String

    负载均衡实例网络类型,公网或者私网。

    • public:公网型负载均衡
    • inner:私网型负载均衡

    默认值:inner

    bandwidth_name

    String

    带宽的名称,默认值为:cce-bandwidth-******。

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

    bandwidth_chargemode

    String

    带宽付费模式。

    • bandwidth:按带宽计费
    • traffic:按流量计费

    bandwidth_size

    Integer

    带宽大小,请根据Region带宽支持范围设置,具体请参见申请弹性公网IP表4 bandwidth字段说明中size字段

    bandwidth_sharetype

    String

    带宽类型,标识是否是共享带宽。

    取值范围:

    • WHOLE:共享带宽
    • PER:独享带宽

    eip_type

    String

    弹性公网IP类型,请参考ELB支持的弹性公网IP类型,具体请参见申请弹性公网IP表3 publicip字段说明type字段

    vi ingress-test-secret.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-deployment.yaml

    回显如下,表明工作负载已创建。

    deployment/ingress-test-deployment created

    kubectl get po

    回显如下,表明工作负载创建成功。

    NAME                            READY     STATUS             RESTARTS   AGE
    ingress-test-1627801589-r64pk   1/1       Running            0          6s

  4. 创建密钥。

    kubectl create -f ingress-test-secret.yaml

    回显如下,表明密钥已创建。

    secret/ingress-test-secret created

    kubectl get secrets

    回显如下,表明密钥创建成功。

    NAME                         TYPE                                  DATA      AGE
    dash-dashboard               Opaque                                0         7d
    dash-dashboard-token-f2nbk   kubernetes.io/service-account-token   3         7d
    default-secret               kubernetes.io/dockerconfigjson        1         8d
    default-token-wfn4l          kubernetes.io/service-account-token   3         8d
    paas.elb                     cfe/secure-opaque                     2         8d
    ingress-test-secret          IngressTLS                            2         13s

  5. 创建服务。

    kubectl create -f ingress-test-svc.yaml

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

    service/ingress-test-svc created

    kubectl get svc

    回显如下,表示服务创建成功。

    NAME            TYPE          CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
    ingress-test    NodePort      10.247.189.207    <none>       8080:30532/TCP   5s
    kubernetes      ClusterIP     10.247.0.1        <none>        443/TCP          3d

    kubectl create -f ingress-test-ingress.yaml

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

    ingress/ingress-test-ingress created

    kubectl get ingress

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

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

  6. 在浏览器中输入访问地址http://10.154.76.63/healthz。

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

    图2 访问healthz

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区论坛频道来与我们联系探讨

智能客服提问云社区提问