k8s 部署 skywalking 并將 pod 應(yīng)用接入鏈路追蹤

beach-1110498_1920.jpg

一窿克、概述

前面寫了兩篇文章介紹使用 docker 部署 spring boot 和 tomcat 項目,并將其接入skywalking,這篇文章主要介紹使用 k8s 部署 skywalking 并將 pod 應(yīng)用接入鏈路追蹤。

二领迈、使用 helm 部署 skywalking

在 k8s 中使用 helm 的前提是需要先安裝 helm 客戶端,關(guān)于 helm 的安裝可以查看官方文檔碍沐。

安裝 helm 官方文檔地址:https://helm.sh/docs/intro/install/

這里介紹兩種方式部署 skywalking , 一種是使用 Artifact Hub 提供的 chart,另一種是通過 GitHub 提供的源文件進行部署衷蜓。這兩種部署方式的本質(zhì)是一樣的累提,不同的是通常情況下 GitHub 上面的通常更新先于 Artifact Hub

1磁浇、使用 Artifact Hub 提供的 chart 部署 skywalking

這是使用 Artifact Hub 提供的 chart斋陪,搜索 skywalking 可以看到如下圖所示:

image.png

如下圖所示,點擊 INSTALL 查看并添加 helm 倉庫:

image.png

添加 skywalking chart 倉庫的命令如下:

helm repo add choerodon https://openchart.choerodon.com.cn/choerodon/c7n

使用下面的命令查看添加的 repo,這里一并列出了我添加的其他倉庫:

helm repo list
NAME                    URL                                               
oteemocharts            https://oteemo.github.io/charts                   
kubeview                https://benc-uk.github.io/kubeview/charts         
oteemo-charts           https://oteemo.github.io/charts                   
jenkinsci               https://charts.jenkins.io/                        
ygqygq2                 https://ygqygq2.github.io/charts/                 
prometheus-community    https://prometheus-community.github.io/helm-charts
my-chart                https://wangedison.github.io/k8s-helm-chart/      
carlosjgp               https://carlosjgp.github.io/open-charts/          
choerodon               https://openchart.choerodon.com.cn/choerodon/c7n  

使用下面的命令在倉庫中搜索 skywalking:

helm search repo skywalking
NAME                        CHART VERSION   APP VERSION DESCRIPTION                 
choerodon/skywalking        6.6.0           6.6.0       Apache SkyWalking APM System
choerodon/skywalking-oap    0.1.3           0.1.3       skywalking-oap for Choerodon
choerodon/skywalking-ui     0.1.4           0.1.4       skywalking-ui for Choerodon 
choerodon/chart-test        1.0.0           1.0.0       skywalking-ui for Choerodon 

為了做一些自定義的配置无虚,比如修改版本號等缔赠,使用下面的命令下載 chart 到本地:

# 下載 chart 到本地
[root@k8s-node01 chart-test]# helm pull choerodon/skywalking
# 查看下載的內(nèi)容
[root@k8s-node01 chart-test]# ll
total 12
-rw-r--r-- 1 root root 10341 Apr 21 11:12 skywalking-6.6.0.tgz
# 解壓 chart 包
[root@k8s-node01 chart-test]# tar -zxvf skywalking-6.6.0.tgz 
skywalking/Chart.yaml
skywalking/values.yaml
skywalking/templates/_helpers.tpl
skywalking/templates/istio-adapter/adapter.yaml
skywalking/templates/istio-adapter/handler.yaml
skywalking/templates/istio-adapter/instance.yaml
skywalking/templates/istio-adapter/rule.yaml
skywalking/templates/mysql-init.job.yaml
skywalking/templates/oap-clusterrole.yaml
skywalking/templates/oap-clusterrolebinding.yaml
skywalking/templates/oap-deployment.yaml
skywalking/templates/oap-role.yaml
skywalking/templates/oap-rolebinding.yaml
skywalking/templates/oap-serviceaccount.yaml
skywalking/templates/oap-svc.yaml
skywalking/templates/ui-deployment.yaml
skywalking/templates/ui-ingress.yaml
skywalking/templates/ui-svc.yaml
skywalking/.auto_devops.sh
skywalking/.choerodon/.docker/config.json
skywalking/.gitlab-ci.yml
skywalking/.helmignore
skywalking/Dockerfile
skywalking/README.md

自定義配置,可以修改 values.yaml文件:

vim skywalking/values.yaml

可以看到友题,這里的 skywalking 默認使用的是 mysql 數(shù)據(jù)庫嗤堰,使用的 skywalking 的版本是 6.6.0,可以根據(jù)自己的需求修改對應(yīng)的版本號度宦,修改完成后保存退出踢匣。更多的配置修改說明可以查看 skywalking 官方 chart 說明

可以使用下面的命令安裝 chart戈抄,并指定自定義的配置文件:

# Usage:  helm install [NAME] [CHART] [flags]
helm install  skywalking skywaling -f skywalking/values.yaml

使用上面的命令會將 skywalking 安裝在 default 命名空間离唬,我們可以使用 -n namespace 參數(shù)指定到特定的命名空間,前提是這個命名空間必須存在划鸽。

安裝成功后可以使用下面的命令查看安裝的 chart输莺,安裝后的 chart 叫做 release:

helm list

可以使用下面的命令卸載 chart:

# Usage:  helm uninstall RELEASE_NAME [...] [flags]
helm uninstall skywalking -n default

2、從 GitHub 下載 chart 源文件部署 skywalking

skywalking chart 的 GitHub地址為:https://github.com/apache/skywalking-kubernetes

在 Linux 系統(tǒng)中使用下面的命令安裝 git

yum install -y git

使用下面的命令 clone 代碼:

git clone https://github.com/apache/skywalking-kubernetes

進到 skywalking 的 chart 目錄裸诽,可以看到下面的內(nèi)容:

[root@k8s-node01 chart-test]# cd skywalking-kubernetes/chart/skywalking/
[root@k8s-node01 skywalking]# ll
total 84
-rw-r--r-- 1 root root  1382 Apr 21 11:35 Chart.yaml
drwxr-xr-x 3 root root  4096 Apr 21 11:35 files
-rw-r--r-- 1 root root   877 Apr 21 11:35 OWNERS
-rw-r--r-- 1 root root 42593 Apr 21 11:35 README.md
drwxr-xr-x 3 root root  4096 Apr 21 11:35 templates
-rw-r--r-- 1 root root  1030 Apr 21 11:35 values-es6.yaml
-rw-r--r-- 1 root root  1031 Apr 21 11:35 values-es7.yaml
-rw-r--r-- 1 root root  1366 Apr 21 11:35 values-my-es.yaml
-rw-r--r-- 1 root root 10184 Apr 21 11:35 values.yaml

可以看到作者非常貼心的為我們定義了三個自定義配置文件:values-es6.yaml 模闲、values-es7.yamlvalues-my-es.yaml,分別對應(yīng)使用 es6崭捍、es7 和 外部 es 存儲的配置葱弟。因為我這里使用的是外部自有的 es 集群板惑,并且 es 的版本是 6.7.0,所以我需要修改 values-my-es.yaml 文件如下:

# Default values for skywalking.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

oap:
  image:
    tag: 8.5.0-es6      # Set the right tag according to the existing Elasticsearch version
  storageType: elasticsearch # elasticsearch 對應(yīng) es6 ,elasticsearch7 對應(yīng) es7

ui:
  image:
    tag: 8.5.0

elasticsearch:
  enabled: false # 由于使用 外部的 es比搭,所以這里需要設(shè)置為 false,因為設(shè)置為 true 會在 k8s 中部署 es
  config:               # For users of an existing elasticsearch cluster,takes effect when `elasticsearch.enabled` is false
    host: your.elasticsearch.host.or.ip
    port:
      http: 9200
    user: "xxx"         # [optional]
    password: "xxx"     # [optional]

還可以修改 values.yaml 文件土童,比如開啟 ingress同辣,更多詳細的配置可以查看 GitHub 中 skywalking-kubernetes 的說明,根據(jù)需要配置好之后就可以使用下面的命令安裝 chart:

helm install "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}"  -f ./skywalking/values-my-es.yaml

安裝完成以后匀们,可以通過下面的命令查看 pod 是否正常啟動:

[root@k8s-node01 ~]# kubectl get pod -n default
NAME                                     READY   STATUS      RESTARTS   AGE
skywalking-es-init-v6sbn                 0/1     Completed   0          1h
skywalking-oap-5c4d5bf887-4cvjk          1/1     Running     0          1h
skywalking-oap-5c4d5bf887-g75fj          1/1     Running     0          1h
skywalking-ui-6cd4bbd858-sbpvt           1/1     Running     0          1h

二缴淋、使用 sidecar 將 pod 接入鏈路追蹤

前面簡單介紹了使用 helm 部署 skywalking,下面介紹如何使用 sidecar 將 pod 接入鏈路追蹤泄朴。Java微服務(wù)接入skywalking 可以使用 SkyWalking Java Agent 來上報監(jiān)控數(shù)據(jù)重抖,這就需要 java 微服務(wù)在啟動參數(shù)中通過 -javaagent:<skywalking-agent-path> 指定 skywalking agent 探針包,通常有以下三種方式集成:

  • 使用官方提供的基礎(chǔ)鏡像 skywalking-base祖灰;
  • 將 agent 包構(gòu)建到已存在的鏡像中钟沛;
  • 通過 sidecar 模式掛載 agent;

前面兩種方式在前面的文章中有簡單介紹局扶,這里主要介紹如何使用 sidecar 將 pod 接入鏈路追蹤恨统,這種方式不需要修改原來的基礎(chǔ)鏡像叁扫,也不需要重新構(gòu)建新的服務(wù)鏡像,而是會以sidecar模式畜埋,通過共享的 volume 將 agent 所需的相關(guān)文件直接掛載到已經(jīng)存在的服務(wù)鏡像中莫绣。sidecar模式原理很簡單,就是在 pod 中再部署一個初始容器悠鞍,這個初始容器的作用就是將 skywalking agent 和 pod 中的應(yīng)用容器共享对室。

1、什么是初始化容器 init container

Init Container 就是用來做初始化工作的容器狞玛,可以是一個或者多個软驰,如果有多個的話,這些容器會按定義的順序依次執(zhí)行心肪,只有所有的 Init Container 執(zhí)行完后锭亏,主容器才會被啟動。我們知道一個Pod里面的所有容器是共享數(shù)據(jù)卷和網(wǎng)絡(luò)命名空間的硬鞍,所以 Init Container 里面產(chǎn)生的數(shù)據(jù)可以被主容器使用到的慧瘤。

2、自定義 skywalking agent 鏡像

在開始以 sidecar 方式將一個 java 微服務(wù)接入 skywalking 之前固该,我們需要構(gòu)建 skywalking agent 的公共鏡像锅减,具體步驟如下:

  • 使用下面的命令下載 skywalking agent 并解壓:
# 下載 skywalking-8.5.0 for es6 版本的發(fā)布包,與部署的 skywalking 后端版本一致
wget https://www.apache.org/dyn/closer.cgi/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
# 將下載的發(fā)布包解壓到當(dāng)前目錄
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
  • 在前面步驟中解壓的 skywalking 發(fā)行包的同級目錄編寫 Dockerfile 文件伐坏,具體內(nèi)容如下:
FROM busybox:latest
LABEL maintainer="xiniao"
COPY apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/

在上述 Dockefile 文件中使用的基礎(chǔ)鏡像是 bosybox 鏡像怔匣,而不是 SkyWalking 的發(fā)行鏡像,這樣可以確保構(gòu)建出來的sidecar鏡像保持最小桦沉。

  • 使用下面的命令構(gòu)建鏡像:
docker build -t skywalking-agent-sidecar:8.5.0 .

使用下面的命令查看構(gòu)建的鏡像:

docker images |grep agent
skywalking-agent-sidecar          8.5.0             98290e961b49        5 days ago          32.6MB

  • 使用下面的命令給鏡像打標(biāo)簽每瞒,這里推送到我的阿里云鏡像倉庫:
docker tag skywalking-agent-sidecar:8.5.0 registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0

使用下面的命令推送鏡像到遠程倉庫:

docker push registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0

3、sidecar 模式接入 skywalking

上面我們通過手工構(gòu)建的方式構(gòu)建了 SkyWalking Java Agent 的公共 Docker 鏡像纯露,接下來我們將演示如何通過編寫 Kubernetes 服務(wù)發(fā)布文件剿骨,來將 Java 服務(wù)發(fā)布到 K8s 集群的過程中自動以 SideCar 的形式集成Agent 并接入 SkyWalking 服務(wù)。

  • 創(chuàng)建一個 deploy-skywalking.yaml文件埠褪,內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-skywalking-demo
  namespace: default
  labels:
    app: spring-boot-skywalking-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-boot-skywalking-demo
  template:
    metadata:
      labels:
        app: spring-boot-skywalking-demo
    spec:
      #構(gòu)建初始化鏡像(通過初始化鏡像的方式集成SkyWalking Agent)
      initContainers:
        - image: registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0
          name: sw-agent-sidecar
          imagePullPolicy: IfNotPresent
          command: [ "sh" ]
          args:
            [
                "-c",
                "cp -R /usr/skywalking/agent/* /skywalking/agent",
            ]
          volumeMounts:
            - mountPath: /skywalking/agent
              name: sw-agent
      containers:
        - name: spring-boot-skywalking-demo
          image: ${ORIGIN_REPO}/spring-boot-skywalking-demo:${IMAGE_TAG}
          imagePullPolicy: Always
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: BUILD_TAG
              value: ${BUILD_TAG}
            - name: NAMESPACE
              value: default
            #這里通過JAVA_TOOL_OPTIONS浓利,而不是JAVA_OPTS可以實現(xiàn)不通過將agent命令加入到j(luò)ava應(yīng)用jvm參數(shù)而實現(xiàn)agent的集成
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar
            - name: SW_AGENT_NAME
              value: spring-boot-skywalking-demo
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              # FQDN: servicename.namespacename.svc.cluster.local
              value: skywalking-oap.default.svc:11800
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 200m
              memory: 500Mi
          volumeMounts:
            - mountPath: /usr/skywalking/agent
              name: sw-agent
      volumes:
        - name: sw-agent
          emptyDir: { }


---
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-skywalking-demo
  namespace: default
  labels:
    app: spring-boot-skywalking-demo
spec:
  ports:
    - name: port
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: spring-boot-skywalking-demo
  type: ClusterIP

spec.volumes 指的是 pod 中的卷,spec.containers.volumeMounts 是將指定的卷 mount 到容器指定的位置钞速,相當(dāng)于 docker 里面的 -v 宿主機目錄:容器目錄贷掖,我們這里使用的是 emptyDir{},這個就相當(dāng)于一個共享卷玉工,是一個臨時的目錄羽资,生命周期等同于Pod的生命周期。初始容器執(zhí)行的命令是 sh -c cp -R /usr/skywalking/agent/* /skywalking/agent遵班, 意思是將 skywalking agent 復(fù)制到共享目錄屠升,主容器關(guān)聯(lián)了共享目錄,所以主容器就可以訪問 skywalking agent狭郑。

使用下面的命令部署應(yīng)用:

 kubectl apply -f deploy-skywalking.yaml

總結(jié)

這篇文章簡單介紹了使用 helm 部署 skywalking腹暖,關(guān)于 helm 的使用以及如何自定義 chart,后面可以寫一篇文章介紹一下翰萨,如果想要詳細了解脏答,建議還是查看官方文檔。還有簡單介紹了 pod 應(yīng)用以 SideCar 模式接入SkyWalking 服務(wù)亩鬼,主要是理解初始容器 initContainers 的作用殖告,初始容器是在主容器啟動之前執(zhí)行,可以和主容器共享數(shù)據(jù)卷共享網(wǎng)絡(luò)命名空間雳锋。

參考文章
k8s微服務(wù)接入SkyWalking黄绩,三分鐘教你怎么玩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玷过,一起剝皮案震驚了整個濱河市爽丹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛蚊,老刑警劉巖粤蝎,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袋马,居然都是意外死亡初澎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門虑凛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碑宴,“玉大人,你說我怎么就攤上這事卧檐∧苟” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵霉囚,是天一觀的道長捕仔。 經(jīng)常有香客問我,道長盈罐,這世上最難降的妖魔是什么榜跌? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮盅粪,結(jié)果婚禮上钓葫,老公的妹妹穿的比我還像新娘。我一直安慰自己票顾,他們只是感情好础浮,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布帆调。 她就那樣靜靜地躺著,像睡著了一般豆同。 火紅的嫁衣襯著肌膚如雪番刊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天影锈,我揣著相機與錄音芹务,去河邊找鬼。 笑死鸭廷,一個胖子當(dāng)著我的面吹牛枣抱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辆床,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佳晶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佛吓?” 一聲冷哼從身側(cè)響起宵晚,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎维雇,沒想到半個月后淤刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡吱型,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年逸贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片津滞。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡铝侵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出触徐,到底是詐尸還是另有隱情咪鲜,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布撞鹉,位于F島的核電站疟丙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸟雏。R本人自食惡果不足惜享郊,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孝鹊。 院中可真熱鬧炊琉,春花似錦、人聲如沸又活。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悼泌,卻和暖如春松捉,著一層夾襖步出監(jiān)牢的瞬間夹界,已是汗流浹背馆里。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留可柿,地道東北人鸠踪。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像复斥,于是被迫代替她去往敵國和親营密。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容