自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

生產(chǎn)中Kubernetes的日志記錄是怎么實現(xiàn)的

譯文
云計算
人們需要了解生產(chǎn)Kubernetes集群的可擴展日志記錄模式,以用于自己的集群級日志記錄。

[[435371]]

【51CTO.com快譯】人們需要了解生產(chǎn)Kubernetes集群的可擴展日志記錄模式,以用于自己的集群級日志記錄。

傳統(tǒng)上,在單體架構(gòu)中,日志直接存儲在裸機或虛擬機上,并且從來沒有離開過服務(wù)器磁盤,運營團隊將會根據(jù)需要檢查每個磁盤的日志。

這適用于內(nèi)部部署的服務(wù)器,而云中的日志是短暫的。隨著越來越多的企業(yè)在容器上運行他們的服務(wù),并使用Kubernetes編排部署,日志不必再存儲在服務(wù)器上,因此實施日志管理策略至關(guān)重要。

日志是調(diào)試和監(jiān)控應(yīng)用程序的有效方法,它們需要存儲在單獨的后端,以便在Pod或節(jié)點故障時進行查詢和分析。這些獨立的后端包括Elasticsearch、谷歌云平臺的Stackdriver和AWS的Cloudwatch等系統(tǒng)。

將集群的日志存儲在存儲后端中稱為集群級日志記錄。本文將討論企業(yè)如何在自己的Kubernetes集群中實現(xiàn)這種方法。

日志架構(gòu)

在Kubernetes集群中有兩個主要的日志源:應(yīng)用程序和系統(tǒng)組件。

應(yīng)用程序作為Kubernetes集群中的容器運行,容器運行時負責(zé)獲取應(yīng)用程序的日志,而Docker將這些日志重定向到stdout( 標(biāo)準(zhǔn)輸出流)和 stderr( 標(biāo)準(zhǔn)輸入流)。在Kubernetes集群中,這兩個流都被寫入集群節(jié)點上的JSON文件。

可以使用以下命令隨時獲取這些容器日志:

  1. kubectl logs podname 

日志的另一個來源是系統(tǒng)組件。一些系統(tǒng)組件(即kube-scheduler和kube-proxy)作為容器運行,并遵循與應(yīng)用程序相同的日志記錄原則。

其他系統(tǒng)組件(kubelet和容器運行時本身)作為原生服務(wù)運行。如果機器上的systemd可用,組件會在journald中寫入日志,否則它們會在/var/log目錄中寫入.log文件。

現(xiàn)在已經(jīng)了解了應(yīng)用程序和集群的哪些組件生成日志以及它們的存儲位置,接下來看看將這些日志卸載到不同存儲系統(tǒng)的一些常見模式。

日志記錄模式

收集日志的兩個最突出的模式是DaemonSet模式和Sidecar模式。

(1)DaemonSet模式

在DaemonSet模式中,日志代理通過Kubernetes中的DaemonSet資源部署為Pod。部署DaemonSet可確保集群中的每個節(jié)點都有一個運行日志代理的Pod。這個日志代理被配置為從/var/logs目錄讀取日志并將它們發(fā)送到存儲后端。

(2)Sidecar模式

而在Sidecar模式中,一個專用容器與同一個Pod中的每個應(yīng)用程序容器一起運行。Sidecar模式可以有兩種類型:Streaming Sidecar或日志代理Sidecar (Logging Agent Sidecar)。

當(dāng)運行將日志寫入文件而不是stdout/stderr流的應(yīng)用程序,或以非標(biāo)準(zhǔn)格式寫入日志的應(yīng)用程序時,將使用流Streaming Sidecar。在這種情況下,可以使用Streaming Sidecar容器將文件中的日志發(fā)布到其自己的stdout/stderr流,然后Kubernetes本身可以獲取stdout/stderr流。

Streaming Sidecar還可以通過將日志消息轉(zhuǎn)換為標(biāo)準(zhǔn)日志格式來為日志結(jié)構(gòu)帶來奇偶校驗。

另一種方法是日志代理Sidecar,Sidecar本身將日志發(fā)送到存儲后端。每個Pod都包含一個日志代理,例如Fluentd或Filebeat,它從應(yīng)用程序容器中捕獲日志并將它們直接發(fā)送到存儲后端。

DaemonSet和Sidecar的優(yōu)缺點

現(xiàn)在已經(jīng)討論了DaemonSet和Sidecar方法,以下了解每種方法的優(yōu)缺點。

(1)DaemonSet(節(jié)點級)

優(yōu)點:

  • 節(jié)點級日志更容易實現(xiàn),因為它與現(xiàn)有的基于文件的日志相關(guān),并且由于每個節(jié)點運行的容器較少,因此比Sidecar方法占用的資源更少。
  • 日志可通過kubectl命令用于調(diào)試,因為日志文件可用于返回日志文件內(nèi)容的kubelet。

缺點:

  • 支持寫入日志文件而不是流的不同日志結(jié)構(gòu)或應(yīng)用程序的靈活性較低。需要修改應(yīng)用程序日志結(jié)構(gòu)以實現(xiàn)奇偶校驗,或者處理存儲后端中的差異。
  • 由于它們作為JSON文件存儲在節(jié)點磁盤上,因此日志不能永久保存。需要有一個日志輪換機制來回收舊日志。如果使用的是容器運行時接口,kubelet會負責(zé)輪換日志,不需要實施明確的解決方案。

(2)Sidecar

優(yōu)點:

  • 可以靈活地為每個應(yīng)用程序容器定制Sidecar。例如,應(yīng)用程序可能無法寫入stdout/stderr,或者它可能具有某些不同的日志記錄格式。在這些情況下,Sidecar容器可以為系統(tǒng)帶來奇偶校驗。
  • 如果沒有使用流式傳輸?shù)娜罩敬鞸idecar,則不需要輪換日志,因為節(jié)點磁盤上沒有存儲任何日志。

缺點:

  • 與節(jié)點級別的Pod相比,為每個應(yīng)用程序容器運行一個Sidecar非常耗費資源。
  • 為每個部署添加一個Sidecar會增加額外的復(fù)雜性。
  • 如果將Streaming Sidecar用于將其日志寫入文件的應(yīng)用程序,將使用兩倍的存儲空間來存儲相同的日志,因為將會復(fù)制條目。
  • 如果沒有使用流式傳輸?shù)娜罩敬鞸idecar,將無法通過kubectl訪問日志。這是因為kubelet不再有權(quán)訪問JSON日志。
  • 使用日志代理Sidecar,還需要一個節(jié)點級代理,否則將無法收集系統(tǒng)組件日志。

將理論付諸實踐

現(xiàn)在已經(jīng)了解了登錄Kubernetes集群的可能模式,可以付諸實踐,部署生成日志的虛擬容器,并創(chuàng)建Kubernetes資源來實現(xiàn)上面討論的日志記錄模式。

在這個例子中,將使用Fluentd作為日志代理,將安裝Elasticsearch用于日志記錄后端和Kibana用于可視化目的。將使用Helm圖表將Elasticsearch和Kibana安裝到同一個集群中。但是需要注意的是,存儲后端不應(yīng)位于同一個集群上,這樣做僅用于演示目的。由于Fluentd的可插拔架構(gòu),它支持各種不同的接收器。這就是Elasticsearch后端可以被任何云原生解決方案替換的原因,包括Stackdriver或Cloudwatch。

(1)安裝Elasticsearch和Kibana

將使用找到的官方Helm圖表部署Elasticsearch和Kibana(Elasticsearch、Kibana)。要通過Helm安裝,在路徑上需要一個Helm二進制文件,但Helm的安裝不在本文討論范圍之內(nèi)。

讓我們從添加helm repos開始。

Properties files

1 helm repo add elastic https://helm.elastic.co

接下來,將把Elasticsearch和Kibana圖表安裝到集群中。

Properties files

1 helm install elasticsearch elastic/elasticsearch

2 helm install kibana elastic/kibana

這將在集群中安裝最新版本的Elasticsearch和Kibana,然后可以將其用作日志的存儲后端。

在圖表中使用了默認值,但是在生產(chǎn)中安裝它時,可以根據(jù)需要更改任何參數(shù)。

(2)DaemonSet

在這里將Fluentd部署為DaemonSet,而不會創(chuàng)建單獨的Service Account和ClusterRole。但在生產(chǎn)環(huán)境中,F(xiàn)luentdpod應(yīng)該使用訪問受限的單獨服務(wù)帳戶運行。

可以使用以下Kubernetes資源將Fluentd部署為DaemonSet:

Go

  1.  api Version: extensions/v1beta1 
  2.  kind: DaemonSet 
  3.  metadata: 
  4.   name: fluentd 
  5.   namespace: kube-system 
  6.  labels: 
  7.   k8s-app: fluentd-logger 
  8.  spec: 
  9.  template: 
  10.   metadata: 
  11.   labels: 
  12.   k8s-app: fluentd-logger 
  13.   spec: 
  14.   containers: 
  15.  - name: fluentd 
  16.   image: fluent/fluentd-kubernetes-daemonset:elasticsearch 
  17.   env: 
  18.   - name:  FLUENT\_ELASTICSEARCH\_HOST 
  19.   value: "elasticsearch-master" 
  20.   - name:  FLUENT\_ELASTICSEARCH\_PORT 
  21.   value: "9200" 
  22.   volumeMounts: 
  23.  - name: varlog 
  24.   mountPath: /var/log 
  25.   - name: dockerlogs 
  26.   mountPath: /var/lib/docker/containers 
  27.   readOnly: true 
  28.    volumes: 
  29.   - name: varlog 
  30.    hostPath: 
  31.   path: /var/log 
  32.   - name: dockerlogs 
  33.    hostPath: 
  34.    path: /var/lib/docker/containers 

在這個例子中,掛載了兩個卷:一個在/var/log,另一個在/var/log/docker/containers,系統(tǒng)組件和Docker運行時分別放置日志。

正在使用的映像已經(jīng)配置了智能默認值以與DaemonSet一起使用,但可以更改配置。

將上述YAML資源保存在名為fluentd-ds.yaml的文件中,并通過以下命令應(yīng)用該資源:

Properties files

  1. kubectl apply -f fluentd-ds.yaml 

這將在Kubernetes集群中的每個節(jié)點上啟動一個Fluentdpod。

現(xiàn)在將看到如何實現(xiàn)流和日志代理Sidecar模式。

(3)Sidecar

首先,看看當(dāng)應(yīng)用程序?qū)⑷罩緦懭胛募皇菙?shù)據(jù)流時的Streaming Sidecar模式??梢赃\行一個Sidecar來讀取這些日志,并將其寫回stdout/stderr流。

Go

  1.  apiVersion: v1 
  2.  kind: Pod 
  3.  metadata: 
  4.   name: my-app 
  5.  spec: 
  6.  containers: 
  7.  - name: legacy-app 
  8.  image: busybox 
  9.  args: 
  10.   - /bin/sh 
  11.  - -c 
  12.   - > 
  13.  i=0; 
  14.  while true
  15.  do 
  16.  echo "$i: $(date)" >> /var/log/output.log; 
  17.   i=$((i+1)); 
  18.  sleep 1; 
  19.  done       
  20.  volumeMounts: 
  21.   - name: varlog 
  22.   mountPath: /var/log 
  23.  - name: streaming-Sidecar 
  24.  image: busybox 
  25.  args: \[/bin/sh, -c, 'tail -n+1 -f /var/log/output.log'\] 
  26.  volumeMounts: 
  27.   - name: varlog 
  28.  mountPath: /var/log 
  29.  volumes: 
  30.  - name: varlog 
  31.  emptyDir: {} 

在這個例子中,有一個虛擬容器將日志寫入容器的/var/log目錄中的文件。現(xiàn)在,容器運行時無法獲取這些日志,這就是實現(xiàn)了一個Streaming Sidecar來從/var/log位置跟蹤日志并將其重定向到stdout流。

這一日志流將由容器運行時獲取并作為JSON文件存儲在節(jié)點上的/var/log目錄中,節(jié)點級日志代理然后將獲取該文件。

現(xiàn)在看看日志代理Sidecar。在這種模式中,將Fluentd部署為Sidecar,它將直接寫入Elasticsearch存儲后端。

在此沒有安裝Elasticsearch插件的預(yù)構(gòu)建鏡像,而創(chuàng)建自定義Docker鏡像超出了本文討論的范圍。與其相反,將使用在DaemonSet示例中使用的相同F(xiàn)luentd映像。

Go

  1.  apiVersion: v1 
  2.  kind: Pod 
  3.  metadata: 
  4.  name: my-app 
  5.  spec: 
  6.  containers: 
  7.  - namecount 
  8.  image: busybox 
  9.  args: 
  10. - /bin/sh 
  11.   - -c 
  12.   - > 
  13.  i=0; 
  14.  while true
  15.  do 
  16.   echo "$i: $(date)" >> /var/log/output.log; 
  17.   i=$((i+1)); 
  18.  sleep 1; 
  19.   done       
  20.  volumeMounts: 
  21.  - name: varlog 
  22.   mountPath: /var/log 
  23.  - name: logging-agent 
  24.  image: fluent/fluentd-kubernetes-daemonset:elasticsearch 
  25.   env: 
  26.  - name:  FLUENT\_ELASTICSEARCH\_HOST 
  27.   value: "elastisearch-master" 
  28.  - name:  FLUENT\_ELASTICSEARCH\_PORT 
  29.    value: "9200" 
  30.   volumeMounts: 
  31.  - name: varlog 
  32.   mountPath: /var/log 
  33.  volumes: 
  34.  - name: varlog 
  35.  emptyDir: {} 

結(jié)論

鑒于Pod和節(jié)點的短暫性,將來自Kubernetes集群的日志存儲在單獨的存儲后端中非常重要??梢允褂枚喾N模式來設(shè)置在本文中討論的日志記錄架構(gòu)。

在此建議為生產(chǎn)系統(tǒng)混合使用Sidecar和節(jié)點級模式。這包括使用DaemonSet模式設(shè)置集群范圍的節(jié)點級日志記錄,以及為不支持將日志寫入流(stdout/stderr)或不以標(biāo)準(zhǔn)日志格式寫入的應(yīng)用程序?qū)崿F(xiàn)Streaming Sidecar容器。這個流容器將自動顯示要選取的節(jié)點級代理的日志。

對于存儲后端的選擇,可以選擇自托管的開源解決方案,例如Elasticsearch,或者可以使用云托管的Elasticsearch、Stackdriver以及Cloudwatch等選項選擇托管服務(wù)路線。選擇適合后端將取決于希望在架構(gòu)中實現(xiàn)的成本、查詢和日志分析要求。

原文標(biāo)題:Kubernetes Logging in Production,作者:Kentaro Wakayama

【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2020-09-22 08:09:13

Kubernetes 集群裸機

2021-02-27 09:26:54

Kubernetes容器化云計算

2021-09-07 09:18:18

Kubernetes負載均衡服務(wù)發(fā)現(xiàn)

2020-09-21 09:34:20

大數(shù)據(jù)

2023-10-16 20:46:57

ChatGPT

2021-02-14 20:41:56

API日志web

2022-04-06 11:18:46

SpringBoot代碼實踐

2022-09-02 08:41:20

Spring項目微服務(wù)

2021-03-16 11:01:02

KubernetesCLI技術(shù)

2021-11-04 10:34:42

圖像檢索數(shù)據(jù)

2020-01-03 22:18:17

物聯(lián)網(wǎng)智慧能源智慧城市

2024-12-18 12:10:00

2023-03-06 00:24:05

Kubernetes項目開源

2021-02-03 05:24:44

API日志

2021-07-26 10:32:54

MySQL數(shù)據(jù)庫存儲

2019-04-15 08:32:25

Spring Boot日志門面模式

2022-03-09 15:16:58

物聯(lián)網(wǎng)農(nóng)業(yè)生產(chǎn)生物工程

2022-03-07 10:07:13

物聯(lián)網(wǎng)生物工程城市農(nóng)業(yè)

2024-05-31 09:31:00

2018-07-30 11:53:04

Kubernetes無服務(wù)器容器
點贊
收藏

51CTO技術(shù)棧公眾號