头图

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

一、概述

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

二、使用 helm 部署 skywalking

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

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

这里介绍两种方式部署 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/sky...

在 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,三分钟教你怎么玩!

319 声望
2.3k 粉丝
0 条评论
推荐阅读
是什么让 Java 应用程序的 CPU 使用率飙升?
如果命运是一条孤独的河流,谁会是你的灵魂摆渡人? —— 克莱儿·麦克福尔《摆渡人》一. 问题while 的无限循环是否会导致 CPU 使用率飙升?频繁的 Young GC 是否会导致 CPU 使用率飙升?有大量线程的应用程序的 CPU...

惜鸟6阅读 2.9k

封面图
刨根问底 Redis, 面试过程真好使
充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把🔥。

菜农曰17阅读 957

封面图
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go10阅读 2k评论 2

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide5阅读 827

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬8阅读 1.1k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
spring boot 锁
由于当前的项目中由于多线程操作同一个实体,会出现数据覆盖的问题,后保存的实体把先保存的实体的数据给覆盖了。于是查找了锁的实现的几种方式。但写到最后发现,其实自己可以写sql 更新需要更新的字段即可,这...

weiewiyi3阅读 9.2k

319 声望
2.3k 粉丝
宣传栏