SkyWalking探针在 k8s 中集成

标签: skywalking 探针 k8s | 发表时间:2021-03-31 02:14 | 作者:开不了囧
出处:https://juejin.cn/backend

最近公司需要在 k8s 环境接入 SkyWalking,要让应用无感知接入。

开始打算的是把agent文件放到基础镜像中,这样应用只需要引用包含agent的基础镜像即可。但是这样会有几个问题,首先不好管理agent,升级需要应用重新打镜像部署,动静太大。第二,不是所有应用都需要接入,要按需引入不同基础镜像,这样就多个一个步骤,应用会有感知。

最终我们使用的是通过initContainers的方式集成,跟helm搭配起来,只需要修改参数配置,就可以控制集成、移除agent。完整方案如下:

一、构建初始化镜像

把agent文件放进镜像中,并进行配置。升级agent只需要更换agent.zip然后重新打镜像即可。

   FROM alpine:3.9.4
 
# 设置变量
ENV APP_HOME=/home \
    VERSION=8.3.0
 
# 增加用户和用户组
ARG USER=appl
ARG USER_GROUP=appl
RUN addgroup -g 1500 $USER_GROUP && \
    adduser -D -u 1500 $USER -G $USER_GROUP
 
# 切换用户安装
USER root
 
# 切换到应用目录
WORKDIR ${APP_HOME}
 
# 复制探针文件和可选插件到镜像
COPY agent.zip apm-aliyun-ons-1.x-plugin-2.1.0.jar apm-oracle-10.x-plugin-2.1.0.jar ./
 
# 安装探针
RUN unzip agent.zip && \
    rm agent.zip && \
    mv apm-aliyun-ons-1.x-plugin-2.1.0.jar apm-oracle-10.x-plugin-2.1.0.jar agent/plugins && \
    echo -e "\nplugin.springmvc.collect_http_params=true\nplugin.tomcat.collect_http_params=true\nplugin.http.http_params_length_threshold=2048\nplugin.mysql.trace_sql_parameters=true\n" >> agent/config/agent.config && \
    cp agent/optional-plugins/apm-trace-ignore-plugin-${VERSION}.jar agent/plugins && \
    touch agent/config/apm-trace-ignore-plugin.config && \
    echo "trace.ignore_path=\${SW_AGENT_TRACE_IGNORE_PATH:com.alibaba.dubbo.monitor.MonitorService.collect(URL),/healthCheck,/**/healthCheck,/**/actuator/**,/sba/**}" >> agent/config/apm-trace-ignore-plugin.config && \
    chown -R appl:appl ${APP_HOME}
 
USER appl
复制代码

二、values.yaml增加相关配置

可以通过配置 skywalking.enabled参数来启用和停用。

   skywalking:
  enabled: true
  backendService: "sw-oap.dev:11800"
  init:
    pullPolicy: IfNotPresent
    repository: harbor-dev.k8s.com/skywalking-agent-init
    tag: 1.0.0
    resources:
      limits:
        cpu: 250m
        memory: 500Mi
      requests:
        cpu: 200m
        memory: 200Mi
复制代码

三、添加jvm参数

agent需要jvm参数中配置javaagent才能生效,根据自己charts模板添加到合适的位置。

   apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "application.name" . }}-jvm-configmap
  namespace: {{ .Values.namespace }}
  labels:
{{ include "application.labels" . | indent 4 }}
data:
{{- (.Files.Glob "files/jvm.conf").AsConfig| nindent 2 }}
# 把探针配置加到 JAVA_OPTS 中
{{- if .Values.skywalking.enabled }}
{{ printf "JAVA_OPTS=\"$JAVA_OPTS -javaagent:%s/agent/skywalking-agent.jar\"" .Values.appHome | indent 4 }}
{{- end }}
复制代码

四、修改 deployment.yml 文件

使用initContainers将agent文件复制到主容器中

   {{- $appHome := .Values.appHome -}}
{{- $appName := .Values.appName -}}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "application.name" . }}
  namespace: {{ .Values.namespace }}
  labels:
{{ include "application.labels" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "application.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
      app: {{ include "application.name" . }}
  template:
    metadata:
      labels:
{{ include "application.labels" . | indent 8 }}
    spec:
# 初始化容器,复制探针文件到共享目录
{{- if .Values.skywalking.enabled }}
      initContainers:
        - name: init-agent
          image: "{{ .Values.skywalking.init.repository }}:{{ .Values.skywalking.init.tag }}"
          imagePullPolicy: {{ .Values.skywalking.init.pullPolicy }}
          command: [ 'sh', '-c', "mkdir -p {{ printf "%s/%s" .Values.appHome "agent" }} && cp -r /home/agent/* {{ printf "%s/%s" .Values.appHome "agent" }}" ]
          resources:
            {{- toYaml .Values.skywalking.init.resources | nindent 12 }}
          volumeMounts:
            - name: agent-dir
              mountPath: {{ printf "%s/%s" .Values.appHome "agent" }}
{{- end }}
      containers:
      - name: {{ include "application.name" . }}
        image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}/{{ .Values.appName }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        resources:
{{- if .Values.resources.requests }}
          requests:
            memory: {{ .Values.resources.requests.memory | quote }}
            cpu: {{ .Values.resources.requests.cpu | quote }}
{{- end }}
          limits:
            memory: {{ .Values.resources.limits.memory | quote }}
            cpu: {{ .Values.resources.limits.cpu | quote }}
        ports:
{{- range $index, $service := .Values.service }}
        - name: {{ $service.name }}
          containerPort: {{ $service.port }}
          protocol: TCP
{{- end }}
{{- if .Values.livenessProbe.enabled }}
        livenessProbe:
          httpGet:
            path: {{ .Values.appUri }}{{ .Values.livenessProbe.path }}
  {{- range $index, $service := .Values.service }}
    {{- if eq $service.name "http" }}
            port: {{ $service.port }}
    {{- end }}
  {{- end }}
          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
          successThreshold: {{ .Values.livenessProbe.successThreshold }}
          periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
{{- end }}
{{- if .Values.readinessProbe.enabled }}
        readinessProbe:
          httpGet:
            path: {{ .Values.appUri }}{{ .Values.readinessProbe.path }}
  {{- range $index, $service := .Values.service }}
    {{- if eq $service.name "http" }}
            port: {{ $service.port }}
    {{- end }}
  {{- end }}
          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
          successThreshold: {{ .Values.readinessProbe.successThreshold }}
          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
{{- end }}
        volumeMounts:
        - name: {{ include "application.name" . }}-log
          mountPath: "{{ .Values.appHome }}/log"
        - name: {{ include "application.name" . }}-jvm-configmap
          mountPath: "{{ .Values.appHome }}/jvm .conf"
          subPath: jvm.conf
# 挂载卷,引入探针文件
{{- if .Values.skywalking.enabled }}
        - name: agent-dir
          mountPath: {{ printf "%s/%s" .Values.appHome "agent" }}
{{- end }}
# 环境变量,用来设置探针所需参数
{{- if .Values.skywalking.enabled }}
        env:
        - name: SW_AGENT_NAME
          value: {{ include "application.name" . }}
        - name: SW_LOGGING_DIR
          value: {{ printf "%s/%s" .Values.appHome "log" }}
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: {{ .Values.skywalking.backendService }}
{{- end }}
      volumes:
      - name: {{ include "application.name" . }}-log
        persistentVolumeClaim:
          claimName: {{ include "application.name" . }}-pvc-log
{{- if (.Files.Glob "files/app.conf") }}
      - name: {{ include "application.name" . }}-jvm-configmap
        configMap:
          name: {{ include "application.name" . }}-jvm-configmap
          items:
            - key: jvm.conf
              path: jvm.conf
{{- end }}
# 声明卷
{{- if .Values.skywalking.enabled }}
      - name: agent-dir
        emptyDir: {}
{{- end }}
      securityContext:
        runAsUser: {{ .Values.storage.securityContext.runAsUser }}
        fsGroup: {{ .Values.storage.securityContext.fsGroup }}
复制代码

相关 [skywalking 探针 k8s] 推荐:

SkyWalking探针在 k8s 中集成

- - 掘金 后端
最近公司需要在 k8s 环境接入 SkyWalking,要让应用无感知接入. 开始打算的是把agent文件放到基础镜像中,这样应用只需要引用包含agent的基础镜像即可. 但是这样会有几个问题,首先不好管理agent,升级需要应用重新打镜像部署,动静太大. 第二,不是所有应用都需要接入,要按需引入不同基础镜像,这样就多个一个步骤,应用会有感知.

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

- - SegmentFault 最新的文章
前面写了两篇文章介绍使用 docker 部署 spring boot 和 tomcat 项目,并将其接入skywalking,这篇文章主要介绍使用 k8s 部署 skywalking 并将 pod 应用接入链路追踪. 二、使用 helm 部署 skywalking. 在 k8s 中使用 helm 的前提是需要先安装 helm 客户端,关于 helm 的安装可以查看官方文档.

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

谈SkyWalking进行服务链监控(12.27)

- - 人月神话的BLOG
在谈Nacos服务注册的时候,刚好看到了Skywalking分布式追踪系统,而这个本身也完全可以用于微服务架构里面的服务链监控上面. 对于APM应用性能监控工具有很多,常说的主要是类似Zipkin, Pinpoint, Cat等,而Skywalking是国产的一款开源APM工具软件,包括了包括了分布式追踪、性能指标分析、应用和服务依赖分析等.

使用 docker 部署 spring boot 并接入 skywalking

- - SegmentFault 最新的文章
最近在研究skywalking,打算使用k8s部署 skywalking 并将 pod 中的应用接入 skywalking 进行服务链路追踪. 这篇文章先不介绍 skywalking 在k8s中的部署和使用,而是先介绍如何使用手动和docker的方式使用 skywalking. 在整个实践过程中查阅了大量文档,遇到了各种问题,这里将我自己的实践过程记录下来,希望对有同样需求的小伙伴提供一些帮助.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

深入掌握K8S Pod - Yabea - 博客园

- -
K8S configmap介绍. Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等. pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口.

浅谈 k8s ingress controller 选型 - 知乎

- -
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云. 业余时间比较喜欢开源,现在是Apache APISIX PPMC. 今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容需要大家对 K8S 有一定的了解,下面是我的分享. 阅读本文需要熟悉以下基本概念:. 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源.

使用kube-proxy让外部网络访问K8S service的ClusterIP

- - zzm
kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:. 修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改为KUBE_PROXY_ARGS=”–proxy-mode=userspace”.

k8s外网如何访问业务应用之Service 池化pod

- - IT瘾-geek
一、废话:先讲述一个k8s重要概念,我觉得这个概念是整个k8s集群实现微服务的最核心的概念. Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象. Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不需要了解后台Pod是如何运行. 只需要将一组跑同一服务的pod池化成一个service,k8s集群会自动给这个service分配整个集群唯一ip和端口号(这个端口号自己在yaml文件中定义),一个service定义了访问pod的方式,就像单个固定的IP地址和与其相对应的DNS名之间的关系.