k8s 部署 skywalking 并将 pod 应用接入链路追踪

beach-1110498_1920.jpg

一、概述

前面写了两篇文章介绍使用 docker 部署 spring boot 和 tomcat 项目,并将其接入skywalking,这篇文章主要介绍使用 k8s 部署 skywalking 并将 pod 应用接入链路追踪。

二、使用 helm 部署 skywalking

在 k8s 中使用 helm 的前提是需要先安装 helm 客户端,关于 helm 的安装可以查看官方文档。

安装 helm 官方文档地址:https://helm.sh/docs/intro/install/

这里介绍两种方式部署 skywalking , 一种是使用 Artifact Hub 提供的 chart,另一种是通过 GitHub 提供的源文件进行部署。这两种部署方式的本质是一样的,不同的是通常情况下 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
# 查看下载的内容
[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 数据库,使用的 skywalking 的版本是 6.6.0,可以根据自己的需求修改对应的版本号,修改完成后保存退出。更多的配置修改说明可以查看 skywalking 官方 chart 说明

可以使用下面的命令安装 chart,并指定自定义的配置文件:

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

使用上面的命令会将 skywalking 安装在 default 命名空间,我们可以使用 -n namespace 参数指定到特定的命名空间,前提是这个命名空间必须存在。

安装成功后可以使用下面的命令查看安装的 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 系统中使用下面的命令安装 git

yum install -y git

使用下面的命令 clone 代码:

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

进到 skywalking 的 chart 目录,可以看到下面的内容:

[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.yamlvalues-es7.yamlvalues-my-es.yaml,分别对应使用 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 对应 es6 ,elasticsearch7 对应 es7

ui:
  image:
    tag: 8.5.0

elasticsearch:
  enabled: false # 由于使用 外部的 es,所以这里需要设置为 false,因为设置为 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 的说明,根据需要配置好之后就可以使用下面的命令安装 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微服务接入skywalking 可以使用 SkyWalking Java Agent 来上报监控数据,这就需要 java 微服务在启动参数中通过 -javaagent:<skywalking-agent-path> 指定 skywalking agent 探针包,通常有以下三种方式集成:

  • 使用官方提供的基础镜像 skywalking-base
  • 将 agent 包构建到已存在的镜像中;
  • 通过 sidecar 模式挂载 agent;

前面两种方式在前面的文章中有简单介绍,这里主要介绍如何使用 sidecar 将 pod 接入链路追踪,这种方式不需要修改原来的基础镜像,也不需要重新构建新的服务镜像,而是会以sidecar模式,通过共享的 volume 将 agent 所需的相关文件直接挂载到已经存在的服务镜像中。sidecar模式原理很简单,就是在 pod 中再部署一个初始容器,这个初始容器的作用就是将 skywalking agent 和 pod 中的应用容器共享。

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

Init Container 就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的 Init Container 执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以 Init Container 里面产生的数据可以被主容器使用到的。

2、自定义 skywalking agent 镜像

在开始以 sidecar 方式将一个 java 微服务接入 skywalking 之前,我们需要构建 skywalking agent 的公共镜像,具体步骤如下:

  • 使用下面的命令下载 skywalking agent 并解压:
# 下载 skywalking-8.5.0 for es6 版本的发布包,与部署的 skywalking 后端版本一致
wget https://www.apache.org/dyn/closer.cgi/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
# 将下载的发布包解压到当前目录
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
  • 在前面步骤中解压的 skywalking 发行包的同级目录编写 Dockerfile 文件,具体内容如下:
FROM busybox:latest
LABEL maintainer="xiniao"
COPY apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/

在上述 Dockefile 文件中使用的基础镜像是 bosybox 镜像,而不是 SkyWalking 的发行镜像,这样可以确保构建出来的sidecar镜像保持最小。

  • 使用下面的命令构建镜像:
docker build -t skywalking-agent-sidecar:8.5.0 .

使用下面的命令查看构建的镜像:

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

  • 使用下面的命令给镜像打标签,这里推送到我的阿里云镜像仓库:
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

上面我们通过手工构建的方式构建了 SkyWalking Java Agent 的公共 Docker 镜像,接下来我们将演示如何通过编写 Kubernetes 服务发布文件,来将 Java 服务发布到 K8s 集群的过程中自动以 SideCar 的形式集成Agent 并接入 SkyWalking 服务。

  • 创建一个 deploy-skywalking.yaml文件,内容如下:
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:
      #构建初始化镜像(通过初始化镜像的方式集成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可以实现不通过将agent命令加入到java应用jvm参数而实现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 到容器指定的位置,相当于 docker 里面的 -v 宿主机目录:容器目录,我们这里使用的是 emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。初始容器执行的命令是 sh -c cp -R /usr/skywalking/agent/* /skywalking/agent, 意思是将 skywalking agent 复制到共享目录,主容器关联了共享目录,所以主容器就可以访问 skywalking agent。

使用下面的命令部署应用:

 kubectl apply -f deploy-skywalking.yaml

总结

这篇文章简单介绍了使用 helm 部署 skywalking,关于 helm 的使用以及如何自定义 chart,后面可以写一篇文章介绍一下,如果想要详细了解,建议还是查看官方文档。还有简单介绍了 pod 应用以 SideCar 模式接入SkyWalking 服务,主要是理解初始容器 initContainers 的作用,初始容器是在主容器启动之前执行,可以和主容器共享数据卷共享网络命名空间。

参考文章
k8s微服务接入SkyWalking,三分钟教你怎么玩!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容