前面写了两篇文章介绍使用 docker 部署 spring boot 和 tomcat 项目,并将其接入skywalking,这篇文章主要介绍使用 k8s 部署 skywalking 并将 pod 应用接入链路追踪。java
在 k8s 中使用 helm 的前提是须要先安装 helm 客户端,关于 helm 的安装能够查看官方文档。node
安装 helm 官方文档地址: https://helm.sh/docs/intro/in...
这里介绍两种方式部署 skywalking , 一种是使用 Artifact Hub 提供的 chart,另外一种是经过 GitHub 提供的源文件进行部署。这两种部署方式的本质是同样的,不一样的是一般状况下 GitHub 上面的一般更新先于 Artifact Hub。mysql
这是使用 Artifact Hub 提供的 chart,搜索 skywalking 能够看到以下图所示:git
以下图所示,点击 INSTALL 查看并添加 helm 仓库:es6
添加 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
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.yaml
、values-es7.yaml
和 values-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
前面简单介绍了使用 helm 部署 skywalking,下面介绍如何使用 sidecar 将 pod 接入链路追踪。Java微服务接入skywalking 可使用 SkyWalking Java Agent
来上报监控数据,这就须要 java 微服务在启动参数中经过 -javaagent:<skywalking-agent-path>
指定 skywalking agent 探针包,一般有如下三种方式集成:
skywalking-base
;前面两种方式在前面的文章中有简单介绍,这里主要介绍如何使用 sidecar 将 pod 接入链路追踪,这种方式不须要修改原来的基础镜像,也不须要从新构建新的服务镜像,而是会以sidecar模式,经过共享的 volume 将 agent 所需的相关文件直接挂载到已经存在的服务镜像中。sidecar模式原理很简单,就是在 pod 中再部署一个初始容器,这个初始容器的做用就是将 skywalking agent 和 pod 中的应用容器共享。
Init Container 就是用来作初始化工做的容器,能够是一个或者多个,若是有多个的话,这些容器会按定义的顺序依次执行,只有全部的 Init Container 执行完后,主容器才会被启动。咱们知道一个Pod里面的全部容器是共享数据卷和网络命名空间的,因此 Init Container 里面产生的数据能够被主容器使用到的。
在开始以 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
上面咱们经过手工构建的方式构建了 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 的做用,初始容器是在主容器启动以前执行,能够和主容器共享数据卷共享网络命名空间。