Kourier是一个基于Envoy架构实现的轻量级网关,提供Knative Revisions流量分发,支持gRPC服务、超时和重试、TLS证书和外部认证授权等功能。本文介绍如何在Knative中使用Kourier网关。

前提条件

步骤一:部署Kourier网关

  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择应用 > Knative
  3. 组件管理页签的add-on组件区域,单击Kourier右侧操作列下的部署,然后在弹出框单击确定
    Kourier状态显示为已部署,表示部署成功。

步骤二:通过Kouier网关访问服务

场景一:通过Kourier网关访问HTTP服务

本文以创建helloworld-go服务进行访问测试为例,具体步骤如下:

  1. 使用以下YAML内容,创建helloworld-go.yaml文件。
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
            env:
            - name: TARGET
              value: "Knative"
  2. 执行以下命令,部署helloworld-go服务。
    kubectl apply -f helloworld-go.yaml
  3. 执行以下命令,查看服务列表。
    kubectl get ksvc
    预期输出:
    NAME            URL                                        LATESTCREATED         LATESTREADY           READY   REASON
    helloworld-go   http://helloworld-go.default.example.com   helloworld-go-msq9q   helloworld-go-msq9q   True
    由预期输出得到,服务列表中存在helloworld-go,表示服务部署成功。
  4. 执行以下命令,获取服务访问IP。
    kubectl -n knative-serving get svc kourier
    预期输出:
    NAME      TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    kourier   LoadBalancer   172.21.4.211   47.107.XXX.XXX   80:31711/TCP,443:31637/TCP   47h
    由预期输出得到,服务访问IP为47.107.XXX.XXX
  5. 执行以下命令,访问HTTP服务。
    curl -H "host: helloworld-go.default.example.com"  http://47.107.XXX.XXX -v
    预期输出:
    Hello Knative!
    由预期输出得到,访问HTTP服务成功。

场景二:通过Kourier网关访问HTTPS服务

  1. 创建证书。
    1. 执行以下命令,生成TLS证书。
      openssl genrsa -out tls.key 4096
      openssl req -subj "/CN=*.example.com/L=*.example.com" -sha256  -new -key tls.key -out tls.csr
      echo subjectAltName = DNS:helloworld-go.default.example.com,DNS:helloworld-go.default.example.cn > extfile.cnf
      openssl x509 -req -days 3650 -sha256 -in tls.csr -signkey tls.key -out tls.crt -extfile extfile.cnf
    2. 执行以下命令,根据生成的TLS证书文件创建集群的Secret。
      kubectl -n knative-serving create secret tls kourier-cert --key tls.key --cert tls.crt
  2. 配置证书。
    1. 执行以下命令,修改knative-serving命名空间下名称为kourier-control的Deployment,配置证书信息。
      kubectl -n knative-serving edit deploy kourier-control
      ...
         spec:
            containers:
            - env:
              - name: CERTS_SECRET_NAMESPACE
                value: knative-serving
              - name: CERTS_SECRET_NAME
                value: kourier-cert
      ...
      保存上述修改后,kourier-control会重新启动。部分参数说明如下:
      • CERTS_SECRET_NAMESPACE:替换为证书Secret所在的命名空间。
      • CERTS_SECRET_NAME:替换为证书Secret名称。
    2. 执行以下命令,查看kourier-control状态。
      kubectl -n knative-serving get po kourier-control-54888647cc-w6gqr
      预期输出:
      NAME                               READY   STATUS    RESTARTS   AGE
      kourier-control-54888647cc-w6gqr   1/1     Running   0          10s
  3. 执行以下命令,通过证书访问HTTPS服务。
    curl -H "host: helloworld-go.default.example.com" -k --cert tls.crt --key tls.key https://47.107.XXX.XXX -v
    预期输出:
    HTTP/1.1 200 OK
    由预期输出得到,返回200 OK,表示访问HTTPS服务成功。