一、概述

后面写了两篇文章介绍应用 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 能够看到如下图所示:

如下图所示,点击 INSTALL 查看并增加 helm 仓库:

增加 skywalking chart 仓库的命令如下:

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

应用上面的命令查看增加的 repo,这里一并列出了我增加的其余仓库:

helm repo listNAME                    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-chartsmy-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 skywalkingNAME                        CHART VERSION    APP VERSION    DESCRIPTION                 choerodon/skywalking        6.6.0            6.6.0          Apache SkyWalking APM Systemchoerodon/skywalking-oap    0.1.3            0.1.3          skywalking-oap for Choerodonchoerodon/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]# lltotal 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.yamlskywalking/values.yamlskywalking/templates/_helpers.tplskywalking/templates/istio-adapter/adapter.yamlskywalking/templates/istio-adapter/handler.yamlskywalking/templates/istio-adapter/instance.yamlskywalking/templates/istio-adapter/rule.yamlskywalking/templates/mysql-init.job.yamlskywalking/templates/oap-clusterrole.yamlskywalking/templates/oap-clusterrolebinding.yamlskywalking/templates/oap-deployment.yamlskywalking/templates/oap-role.yamlskywalking/templates/oap-rolebinding.yamlskywalking/templates/oap-serviceaccount.yamlskywalking/templates/oap-svc.yamlskywalking/templates/ui-deployment.yamlskywalking/templates/ui-ingress.yamlskywalking/templates/ui-svc.yamlskywalking/.auto_devops.shskywalking/.choerodon/.docker/config.jsonskywalking/.gitlab-ci.ymlskywalking/.helmignoreskywalking/Dockerfileskywalking/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]# lltotal 84-rw-r--r-- 1 root root  1382 Apr 21 11:35 Chart.yamldrwxr-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.mddrwxr-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 对应 es7ui:  image:    tag: 8.5.0elasticsearch:  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 defaultNAME                                     READY   STATUS      RESTARTS   AGEskywalking-es-init-v6sbn                 0/1     Completed   0          1hskywalking-oap-5c4d5bf887-4cvjk          1/1     Running     0          1hskywalking-oap-5c4d5bf887-g75fj          1/1     Running     0          1hskywalking-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:latestLABEL 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 agentskywalking-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/v1kind: Deploymentmetadata:name: spring-boot-skywalking-demonamespace: defaultlabels:  app: spring-boot-skywalking-demospec:replicas: 1selector:  matchLabels:    app: spring-boot-skywalking-demotemplate:  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: v1kind: Servicemetadata:name: spring-boot-skywalking-demonamespace: defaultlabels:  app: spring-boot-skywalking-demospec:ports:  - name: port    port: 80    protocol: TCP    targetPort: 8080selector:  app: spring-boot-skywalking-demotype: 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,三分钟教你怎么玩!