Knative 应用在阿里云容器服务上的最佳实践

作者|元毅 阿里云智能事业群高级开发工程师

 

相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应用在阿里云容器服务上的最佳实践。

 

何为最佳实践,就是按照生产可用的方式部署服务,提供服务监控告警以及链路追踪。我们按照如下 3 个部分内容进行:

 

  • Knative Service 服务部署
  • Knative Service 服务日志、监控告警
  • Knative Service 服务分布式链路追踪

 

 

准备

 

参考在阿里云容器服务上部署Knative。 这里注意在部署 Istio 时需要开启 Tracing 分布式追踪。

 

 

Knative Service 服务部署

 

  1. 执行 kubectl 命令:

 

$kubectl apply -f helloworld-go.yaml

 

其中 helloworld-go.yaml 示例内容:

 

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4db7
        env:
        - name: TARGET
          value: "Knative"

 

  1. 查看 istio-ingressgateway 服务。

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# kubectl -n  istio-system get svc istio-ingressgateway
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                                      AGE
istio-ingressgateway   LoadBalancer   172.21.5.96   101.37.100.85   15020:30816/TCP,80:31380/TCP,443:31390/TCP,15443:31412/TCP   19d

 

  1. 执行 kubectl 如下命令,获取 Domin 信息

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# kubectl get ksvc helloworld-go 
NAME            URL                                        LATESTCREATED         LATESTREADY           READY   REASON
helloworld-go   http://helloworld-go.default.example.com   helloworld-go-skcpl   helloworld-go-skcpl   True

 

  1. 最后执行 curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85 可以获取执行的结果

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!

 

 

Knative Service 服务日志、监控告警

 

阿里云日志服务(Log Service,简称 LOG)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立 DT 时代海量日志处理能力。

 

  1. 选择日志库,创建 Logstore。这里以创建 helloworld 为例:

    Knative 应用在阿里云容器服务上的最佳实践_第1张图片
  2. 数据源接入,选择 Docker 标准输出, 参见日志服务容器标准输出

    Knative 应用在阿里云容器服务上的最佳实践_第2张图片

 

  1. 插件配置这里我们针对 helloworld-go Service, 设置采集的环境变量为:"K_SERVICE": "helloworld-go"。并且通过 processors 分割日志信息,如这里 "Keys": [ "time","level", "msg" ]。

 

{
  "inputs": [
    {
      "detail": {
        "IncludeEnv": {
          "K_SERVICE": "helloworld-go"
        },
        "IncludeLabel": {},
        "ExcludeLabel": {}
      },
      "type": "service_docker_stdout"
    }
  ],
  "processors": [
    {
      "detail": {
        "KeepSource": false,
        "NoMatchError": true,
        "Keys": [
          "time",
          "level",
          "msg"
        ],
        "NoKeyError": true,
        "Regex": "(\\d+-\\d+-\\d+\\s+\\d+:\\d+:\\d+)\\s+(\\w+)\\s+(.*)",
        "SourceKey": "content"
      },
      "type": "processor_regex"
    }
  ]
}

 

  1. 设置查询分析,参考查询与分析。为了便于分析这里设置 level、msg 和 time 这 3 列:

    Knative 应用在阿里云容器服务上的最佳实践_第3张图片

 

  1. 访问 Hello World 示例服务。

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!

 

  1. 登录日志服务控制台, 进入对应的 Project, 选择 helloworld Logstore,点击查询,可以看到日志输出如图所示:

 

Knative 应用在阿里云容器服务上的最佳实践_第4张图片

 

  1. 设置查询 sql 语句。这里设置监控的原则是根据 ERROR 出现的次数,因此可以设计统计 ERROR 的 sql 语句:

 

* | select 'ERROR' , count(1) as total group by 'ERROR'

 

点击【查询/分析】,结果如图所示:

 

Knative 应用在阿里云容器服务上的最佳实践_第5张图片

 

8. 告警设置。点击 【另存为告警】。

 

Knative 应用在阿里云容器服务上的最佳实践_第6张图片

 

9. 设置告警名称、添加到仪表盘(这里可以新建,输入名称即可)等。其中告警触发条件输入判断告警是否触发的条件表达式, 可以参考告警条件表达式语法。我们这里设置“查询区间:1 分钟,执行间隔:1 分钟,触发条件:total > 3” 表示间隔 1 分钟检查,如果 1 分钟内出现 3 次 ERROR 信息,则触发告警。

 

Knative 应用在阿里云容器服务上的最佳实践_第7张图片

 

10. 告警通知。当前支持如图所示告警通知:

 

Knative 应用在阿里云容器服务上的最佳实践_第8张图片

 

  1. 访问 Hello World 示例服务。执行多次以下命令,就会触发告警通知

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!

 

如果是设置的邮件通知,告警信息如下图所示:

 

Knative 应用在阿里云容器服务上的最佳实践_第9张图片

 

 

Knative Service 服务分布式链路追踪

 

阿里云链路追踪 Tracing Analysis 为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等工具,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提高微服务时代下的开发诊断效率。

 

  1. 选择命名空间设置如下标签启用 Sidecar 自动注入:istio-injection=enabled。通过这种方式就注入了 Istio 的 envoy 代理(proxy)容器, Istio 的 envoy 代理拦截流量后会主动上报 trace 系统。以设置 default 命名空间为例:

 

kubectl label namespace default istio-injection=enabled

 

  1. 访问 Hello World 示例服务。

 

[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!

 

  1. 登录阿里云链路追踪服务控制台, 选择应用列表,可以查看对应应用的 tracing 信息。

    Knative 应用在阿里云容器服务上的最佳实践_第10张图片

 

  1. 选择应用,点击查看应用详情,可以看到服务调用的平均响应时间。

    Knative 应用在阿里云容器服务上的最佳实践_第11张图片

 

 

结论

 

通过以上的实践,相信大家已经了解了如何在阿里云容器服务上部署生产可用的 Serverless 服务。如果你有更好的Knative 实践欢迎一起交流。

 

 

欢迎加入 Knative 交流群

 

Knative 应用在阿里云容器服务上的最佳实践_第12张图片

 

 

你可能感兴趣的:(Knative 应用在阿里云容器服务上的最佳实践)