k8s 部署 skywalking 並將 pod 應用接入鏈路追蹤

1、概述

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

2、使用 helm 部署 skywalking

在 k8s 中使用 helm 的前提是須要先安裝 helm 客戶端,關於 helm 的安裝能夠查看官方文檔。node

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

這裏介紹兩種方式部署 skywalking , 一種是使用 Artifact Hub 提供的 chart,另外一種是經過 GitHub 提供的源文件進行部署。這兩種部署方式的本質是同樣的,不一樣的是一般狀況下 GitHub 上面的一般更新先於 Artifact Hubmysql

一、使用 Artifact Hub 提供的 chart 部署 skywalking

這是使用 Artifact Hub 提供的 chart,搜索 skywalking 能夠看到以下圖所示:
image.pnggit

以下圖所示,點擊 INSTALL 查看並添加 helm 倉庫:es6

image.png

添加 skywalking chart 倉庫的命令以下:github

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

使用下面的命令查看添加的 repo,這裏一併列出了我添加的其餘倉庫:spring

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:sql

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 到本地:docker

# 下載 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

二、從 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,分別對應使用 es六、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

2、使用 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 中的應用容器共享。

一、什麼是初始化容器 init container

Init Container 就是用來作初始化工做的容器,能夠是一個或者多個,若是有多個的話,這些容器會按定義的順序依次執行,只有全部的 Init Container 執行完後,主容器纔會被啓動。咱們知道一個Pod裏面的全部容器是共享數據卷和網絡命名空間的,因此 Init Container 裏面產生的數據能夠被主容器使用到的。

二、自定義 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

    三、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,三分鐘教你怎麼玩!

相關文章
相關標籤/搜索