一窿克、概述
前面寫了兩篇文章介紹使用 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 可以看到如下圖所示:
如下圖所示,點擊 INSTALL 查看并添加 helm 倉庫:
添加 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.yaml
和 values-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ò)命名空間雳锋。