相信通過前面幾個章節的內容(文末有鏈接),大家對 Knative 有了初步的體感,那麼在雲原生時代如何在雲上玩轉 Knative?本篇內容就給你帶來了 Knative 應用在阿里雲容器服務上的最佳實踐。
何爲最佳實踐,就是按照生產可用的方式部署服務,提供服務監控告警以及鏈路追蹤。我們按照如下 3 個部分內容進行:
- Knative Service 服務部署
- Knative Service 服務日誌、監控告警
- Knative Service 服務分佈式鏈路追蹤
準備
參考在阿里雲容器服務上部署Knative。 這裏注意在部署 Istio 時需要開啓 Tracing 分佈式追蹤。
Knative Service 服務部署
- 執行 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"
- 查看 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
- 執行 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
- 最後執行 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 時代海量日誌處理能力。
- 選擇日誌庫,創建 Logstore。這裏以創建 helloworld 爲例:
- 數據源接入,選擇 Docker 標準輸出, 參見[日誌服務容器標準輸出]
- 插件配置這裏我們針對
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"
}
]
}
- 設置查詢分析,參考查詢與分析。爲了便於分析這裏設置 level、msg 和 time 這 3 列:
- 訪問 Hello World 示例服務。
[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!
- 登錄日誌服務控制檯, 進入對應的 Project, 選擇
helloworld
Logstore,點擊查詢,可以看到日誌輸出如圖所示:
- 設置查詢 sql 語句。這裏設置監控的原則是根據 ERROR 出現的次數,因此可以設計統計 ERROR 的 sql 語句:
* | select 'ERROR' , count(1) as total group by 'ERROR'
點擊【查詢/分析】,結果如圖所示:
- 告警設置。點擊 【另存爲告警】。
- 設置告警名稱、添加到儀表盤(這裏可以新建,輸入名稱即可)等。其中告警觸發條件輸入判斷告警是否觸發的條件表達式, 可以參考告警條件表達式語法。我們這裏設置“查詢區間:1 分鐘,執行間隔:1 分鐘,觸發條件:total > 3” 表示間隔 1 分鐘檢查,如果 1 分鐘內出現 3 次 ERROR 信息,則觸發告警。
- 告警通知。當前支持如圖所示告警通知:
- 訪問 Hello World 示例服務。執行多次以下命令,就會觸發告警通知
[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!
如果是設置的郵件通知,告警信息如下圖所示:
Knative Service 服務分佈式鏈路追蹤
阿里雲鏈路追蹤 Tracing Analysis 爲分佈式應用的開發者提供了完整的調用鏈路還原、調用請求量統計、鏈路拓撲、應用依賴分析等工具,可以幫助開發者快速分析和診斷分佈式應用架構下的性能瓶頸,提高微服務時代下的開發診斷效率。
- 選擇命名空間設置如下標籤啓用 Sidecar 自動注入:istio-injection=enabled。通過這種方式就注入了 Istio 的 envoy 代理(proxy)容器, Istio 的 envoy 代理攔截流量後會主動上報 trace 系統。以設置 default 命名空間爲例:
kubectl label namespace default istio-injection=enabled
- 訪問 Hello World 示例服務。
[root@iZbp11kx5d8so7gb07fbtkZ samples]# curl -H "Host: helloworld-go.default.example.com" http://101.37.100.85
Hello Knative!
- 登錄阿里雲鏈路追蹤服務控制檯, 選擇應用列表,可以查看對應應用的 tracing 信息。
- 選擇應用,點擊查看應用詳情,可以看到服務調用的平均響應時間。
結論
通過以上的實踐,相信大家已經瞭解瞭如何在阿里雲容器服務上部署生產可用的 Serverless 服務。如果你有更好的Knative 實踐歡迎一起交流。
本文作者:
冬島,阿里雲容器平臺技術專家,負責阿里雲容器平臺 Knative 相關工作。歡迎加入 Knative 釘釘羣(羣號 : 23302777)進行深入交流
相關文章:
《初識 Knative:跨平臺的 Serverless 編排框架》
《Knative 初體驗:Serving Hello World》
《Knative 初體驗:Eventing Hello World》
《Knative 初體驗:Build Hello World》
《Knative 初體驗:CI/CD 極速入門》
《Knative 基本功能深入剖析:Knative Serving 的流量灰度和版本管理》
《Knative 基本功能深入剖析:Knative Serving 自動擴縮容 Autoscaler》
《Knative 基本功能深入剖析:Knative Serving 之服務路由管理》