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
- 一个Configuration对象,它会创建一个Revision,并该由Revision自动创建如下两个对象:
-
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
- service: 管理Knative service
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
- 获取Revision信息
-
更新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将被修改
- 更新spec.template部分,将创建一个新的revision
-
-
删除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
-