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 的安装可以查看官方文档.

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

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

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).

k8s水平扩容

- - Bboysoul's Blog
k8s 的好处就是可以弹性水平扩容和纵向扩容,平时纵向扩容用的不太多,所以今天说说水平扩容,在创建hpa之前你要确定集群中已经安装了metrics-server,我使用的是k3s,直接自带. 首先创建需要的容器,下面是dockerfile. 原理就是当你访问index.php的时候会进行一个循环计算来提高cpu的使用率.

# [k8s] HPA: Horizontal Pod Autoscaling

- - V2EX - 技术
HPA 是 K8S 的一大利器. 通过 HPA, 我们可以让服务的 pod 数量根据特定指标自动增加或减少, 使得在高峰期有足够的资源服务请求, 在低峰期又可以避免占用过多的资源. 同时, 在 SOA 架构下, 我们也习惯通过 HPA 来避免劳心劳力的为每个微服务计算所需的资源.. minReplicas: 允许的最小 pod 数量.

使用 docker 部署 spring boot 并接入 skywalking

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

K8S 1.24.0 安装部署

- - Share
在 v1.2x 版本中, Kubernetes 支持的最大节点数为 5000. 更具体地说,我们支持满足以下所有条件的配置:. 每个节点的 pod 数量不超过. Kubernetes v1.20 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先使用 docker 作为容器运行引擎,如果宿主机上未安装 docker 只安装了 containerd,将使用 containerd 作为容器运行引擎;.

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端口.