03-Serving及实践

1 serving工作模式

在这里插入图片描述

2 Queue Proxy

  • Knative Serving会为每个Pod注入一个称为Queue Proxy的容器
    • 为业务代码提供代理功能
      • Ingress GW接收到请求后,将其发往目标Pod实例上由Queue Proxy监听的8012端口;
      • 而后,Queue Proxy再将请求转发给业务代码容器监听的端口
    • 报告实例上的多个有关客户端请求的关键指标给Autoscaler
    • Pod健康状态检测(k8s探针)
    • 为超出实例最大并发量的请求提供缓冲队列
  • Queue Proxy预留了如下几个端口
    • 8012:HTTP协议的代理端口
    • 8013:HTTP/2端口,用于代理gRPC
    • 8022:管理端口,如健康状态检测等;
    • 9090:暴露给Autoscaler进行指标采集的端口
    • 9091:暴露给prometheus进行监控指标采集的端口
      在这里插入图片描述

3 运行knative应用

  • 在Serving上,可通过创建Knative Service对象来运行应用,该Service资源会自动创建

    • 一个Configuration对象,它会创建一个Revision,并该由Revision自动创建如下两个对象:
      • 一个Deployment
      • 一个PodAutoscaler对象
    • 一个Route对象,它会创建
      • 一个k8s service资源
      • 一组Istio VirtualService对象
        • {kservice-name}-ingress
        • {kservice-name}-mesh
  • Knative Service资源(简称ksvc)的资源规范主要有两个字段:

    • template:用于创建或者更新Configuration,任何更新,都将创建新的Revision对象;
    • traffic:用于创建或者更新Route对象
  • 以"kservice/hello"为例进行验证

    • 获取由kservice/hello自动创建的Configuration, Revision,Deployment和PodAutoscaler

    在这里插入图片描述

    • 获取由kservice/hello自动创建的Route,service和virtualservice

      在这里插入图片描述

  • 访问kservice/hello

    • 集群内部客户端
      • 对于每个kservice/hello对象,Serving都会为其创建一个{kservice-name}.svc.{cluster.domain}格式的名称,例如hello.default.svc.cluster.local,用于集群内部客户端访问Kservice
      • 例如,在集群内部的某Pod上,向http://hello.default.svc.cluster.local直接发起请求即可
    • 集群外部的客户端
      • 集群外部客户端的流量,需要经由istio-ingressgateway统一接入;
      • Serving默认为其使用的外部域名为"example.com",于是kservice/hello的外部名称为{kservice-name}.{namespace}.example.com
      • 有两种访问方式
        • 在集群外部客户端上,使用自定义的Host首部指向目标服务
        • 在集群外部的DNS服务上,使用泛域名解析机制,将特定名称空间下的所有kservice名称都解析至service/istio ingressgateway的外部IP地址上
  • 访问示例

    • 首先在k8s集群上启用一个客户端,向kservice/hello发送请求

      kubectl run client --image=ikubernetes/admin-box:v1.2 --restart=Never --rm -it --command -- /bin/bash
      

      在这里插入图片描述

    • 在集群外部访问

      curl -H "Host: hello.default.example.com" http://192.168.58.100
      

      在这里插入图片描述

3.1 Knative Serving资源规范
  • Knative Service资源的spec配置段主要由Connfiguration和Routespec组成

    • ConfigurationSpec:定义Configuration资源规范,其核心组成即为Revision Template
    • RouteSpec:定义Route资源规范,旨在定义流量目标(Traffic Target)
  • Configuration将根据Revision Template自动创建Revision,Revision是代码和配置的不可变快照

  • 配置Kservice示例

    • 限制容器上最大并发请求

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: hello
      spec:
        template:
          metadata:
            # This is the name of our new "Revision," it must follow the convention {service-name}-{revision-name}
            name: hello-world-002
          spec:
            containerConcurrency: 10
            containers:
              #- image: gcr.io/knative-samples/helloworld-go
              - image: ikubernetes/helloworld-go
                ports:
                  - containerPort: 8080
                env:
                  - name: TARGET
                    value: "World-002"
      
    • 验证

      root@k-master01:~/knative-manifests/serving/basic# kubectl get revision
      NAME              CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON   ACTUAL REPLICAS   DESIRED REPLICAS
      hello-world       hello                            1            True             0                 0
      hello-world-002   hello                            2            True             0                 0
      
      
      root@k-master01:~/knative-manifests/serving/basic# kubectl get revision hello-world-002 -o jsonpath={.spec.containerConcurrency};echo
      10
      
      
      [C:\~]$ curl -H "Host: hello.default.example.com" http://192.168.58.100
        % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                       Dload  Upload   Total   Spent    Left  Speed
      100    17  100    17    0     0     10      0  0:00:01  0:00:01 --:--:--    10
      Hello World-002!
      

4 Kn命令管理

  • Knative CLI与Serving相关的子命令
    • service: 管理Knative service
      • apply
      • create, delete,update
      • list,describe
      • export,import
    • revision:管理Knative revisions
      • delete
      • list,describe
    • route:管理Knative routes
      • delete
      • list,describe
    • domain:管理域名映射、
      • create,delete,update
      • list,describe
    • container:管理Kservice的容器
      • add
4.1 命令式资源管理示例
  • Knative Service

    • 创建(二选一)

      • $ kn service create hello --image ikubernetes/helloworld-go --port 8080 --env TARGET=World --revision-name world

      • kn service apply hello --image ikubernetes/helloworld-go --port 8080 --env TARGET=World --revision-name world
        
    • 获取资源信息

      • kn service list
        
      • kn service describe hello
        
    • 更新资源配置

       kn service update hello --env TARGET=Knative --revision-name hello-Knative
      
  • Knative Revision

    • 获取Revision信息
      • kn revision list
      • kn revision describe hello-Knative
  • 更新KService资源

    • 使用apply或update命令进行资源更新

      kn service update hello --env TARGET=Knative --max-scale 10 --revision-name hello-Knative
      
    • 更新KService时触发的操作

      • 更新spec.template部分,将创建一个新的revision
        • 一个KService下可能同时存在多个revision,其中有一个是为Latest Revision
        • 默认情况下,Latest Revision接收该Service收到的全部请求
        • 也可以为不同的Revision指定不同的流量比例
      • 更新spec.traffic部分,其Route将被修改
  • 删除KService资源

    • 使用delete命令删除资源

       kn service delete hello
      
    • 删除KService时,Kubernetes将基于terminator和ownerReferences收集其子资源

5 域名映射

5.1 修改domain name后缀
  • 默认情况下,外部访问的域名以example.com后缀结尾,如果需要修改后缀,例如,要把域名后缀修改为icloud2native.com

    kubectl edit cm config-domain -n knative-serving
    

    修改example.com: ""icloud2native.com: ""

  • 创建一个ksvc/hello进行验证

    kn service create hello --image ikubernetes/helloworld-go --port 8080 --env TARGET=World
    

    在这里插入图片描述

  • 集群外请求

    curl -H "Host: hello.default.icloud2native.com" http://192.168.58.100
    

    在这里插入图片描述

5.2 配置自定义域名
  • 场景: knative默认创建的域名hello.default.icloud2native.com,如果我们想自定义域名,比如使用hello.icloud2native.com。就需要使用knative的一个CRD: ClusterDomainClaim

  • ClusterDomainClaim

    • 域名映射依赖于ClusterDomainClaim,创建方法二选一:

      • # 全局配置参数,在集群中所有的namespace,将会允许自动创建cdc资源
        kubectl patch configmap config-network -n knative-serving -p '{"data":{"autocreate-cluster-domain-claims":"true"}}

        在这里插入图片描述

      • 手动创建相关的CDC资源,名称为要映射的外部域名。基于CDC资源规范信息,仅需要指定名称,且namespace要在spec字段中定义

        apiVersion: networking.internal.knative.dev/v1alpha1
        kind: ClusterDomainClaim
        metadata:
          name: hello.icloud2native.com
        spec:
          namespace: default
        
    • 查看CDC资源

      • kubectl get cdc [name]
        
      • kubectl describe cdc [name]
        
  • Domainmapping资源

    • DomainMapping的功能

      • 将外部域名映射至Knative Service或Knative Route
      • 支持跨Kubernetes Namespace对Knative Service进行名称映射
    • 创建Domainmaping

      • 命令式命令:kn domain create NAME --ref kroute:NAME|[ksvc:]NAME[:NAMESPACE] -n NAMESPACE

        示例:kn domain create hello.icloud2native.com --ref "ksvc:hello"

      • 资源配置清单

        apiVersion: serving.knative.dev/v1beta1
        kind: DomainMapping
        metadata:
          name: hello.icloud2native.com
          namespace: default
        spec:
          ref:
            name: hello
            kind: Service
            apiVersion: serving.knative.dev/v1
        
    • 验证

      创建完dm后,由于CDC是自动创建

      root@k-master01:~/knative-manifests/serving/domainmapping# kubectl get dm
      NAME                      URL                              READY   REASON
      hello.icloud2native.com   http://hello.icloud2native.com   True    
      root@k-master01:~/knative-manifests/serving/domainmapping# kubectl get cdc
      NAME                      AGE
      hello.icloud2native.com   19s
      

      集群外新域名访问:

      curl -H "Host: hello.icloud2native.com" http://192.168.58.100
      

      在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值