K8S集群中部署SkyWalking

1. 环境准备

  • K8S 集群
  • kubectl
  • helm

2. 为什么要部署SkyWalking?

我也不道啊,老板说要咱就得上啊。咦,好像可以看到服务的各项指标,像SLA,Apdex这些,主要是能够进行请求的链路追踪,bug排查的利器。

总之就是不管三七二十一,先整上去。

3. 部署

部署其实很简单,参考这个仓库的内容 github.com/apache/skyw...

3.1 准备配置文件:

yaml 复制代码
oap:
  image:
    tag: 9.7.0
  storageType: elasticsearch
  replicas: 1
  env: 
    SW_CORE_RECORD_DATA_TTL: "10" # 设置记录数据的保留时间
    SW_CORE_METRICS_DATA_TTL: "10" # 经过聚合处理的指标数据的保留时间
    SW_TELEMETRY: "prometheus"
    SW_HEALTH_CHECKER: "default"
    SW_ENABLE_UPDATE_UI_TEMPLATE: "true"
  readinessProbe: 
    tcpSocket:
      port: 12800
    initialDelaySeconds: 50
    periodSeconds: 10
    failureThreshold: 30
  resources:
    requests:
      memory: 2.6Gi

ui:
  image:
    tag: 9.7.0

elasticsearch:
  enabled: true
  replicas: 1
  minimumMasterNodes: 1
  nodeGroup: "single-node"
  persistence: 
    enabled: true
  initResources:
    requests:
      memory: 1.5Gi
  clusterHealthCheckParams: "wait_for_status=yellow&timeout=1s"
  volumeClaimTemplate:
    accessModes: [ "ReadWriteOnce" ]
    storageClassName: ebs-hdd
    resources:
      requests:
        storage: 512Gi

本来我的Skywalking版本是 9.6.0 但是有个bug,Endpoints 页面如果涉及的Endpoint过多就会报错 后面我升级了 9.7.0 版本。

底层的存储组件使用 单节点ES,存储卷我用的是hdd的,因为是测试的,就省着用。对性能有要求的同学可以使用多节点,挂载SSD类型的磁盘。

注意调整这两个参数,SW_CORE_RECORD_DATA_TTL和SW_CORE_METRICS_DATA_TTL。

我使用机械盘,保持10天的数据就到顶了。如果这个值加大,会比较慢。这个根据自己的需求来确定。

3.2 开始部署

shell 复制代码
# helm chat 的版本
export SKYWALKING_RELEASE_VERSION=4.5.0
# helm 的 release name
export SKYWALKING_RELEASE_NAME=skywalking
# k8s 的命名空间
export SKYWALKING_RELEASE_NAMESPACE=skywalking

# 部署
helm install "${SKYWALKING_RELEASE_NAME}" \
  oci://registry-1.docker.io/apache/skywalking-helm \
  --version "${SKYWALKING_RELEASE_VERSION}" \
  -n "${SKYWALKING_RELEASE_NAMESPACE}" -f ./values-my-es.yaml

执行需要一些时间,完成后可以在K8S中看到

ES 的 Stateful Sets

SkyWalking 的 Deployments

3.3 更新

修改配置文件时,需要更新 对应的 helm release

shell 复制代码
export HELM_EXPERIMENTAL_OCI=1
export SKYWALKING_RELEASE_VERSION=4.5.0

helm upgrade -f ./values-my-es.yaml "skywalking" oci://registry-1.docker.io/apache/skywalking-helm --version "${SKYWALKING_RELEASE_VERSION}" -n skywalking

4. 项目集成

接入采用initContainer无侵入方式在K8s集成,原理是共享磁盘。

4.1 增加挂载点

YAML 复制代码
- name: skywalking-agent
  emptyDir: {}

4.2 创建initContainer

yaml 复制代码
initContainers:
- name: agent-container
      image: apache/skywalking-java-agent:9.1.0-alpine
      imagePullPolicy: IfNotPresent
      volumeMounts:
      - name: skywalking-agent
      mountPath: /agent
      command: [ "/bin/sh" ]
      args: [ "-c", "cp -R /skywalking/agent /agent/" ]
- name: skywalking-agent
      emptyDir: {}

4.3 Container 增加skywalking的配置

YAML 复制代码
containers:  
- name: <example-name>
  image: <image>
  ports:
  - containerPort: <port>
  env:
  - name: VA_OPTS
    value: "-Dfile.encoding=utf-8 -Duser.timezone=UTC"
  - name: JAVA_TOOL_OPTIONS
    value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
  - name: SW_AGENT_NAMESPACE
    value: "dev"
  - name: SW_AGENT_NAME
    value: "dev::example-name"
  - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
    value: "skywalking-skywalking-helm-oap.skywalking.svc.cluster.local:11800"
    
volumeMounts:
- name: skywalking-agent
  mountPath: /skywalking

这样配置之后,启动 deployment 时,会先初始化一个 initContainer,然后在启动核心的 container pod。

完美

Ref

apache/skywalking-helm: Apache SkyWalking Kubernetes Deployment Helm Chart (github.com)

相关推荐
福大大架构师每日一题2 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
weixin_453965003 小时前
[单master节点k8s部署]30.ceph分布式存储(一)
分布式·ceph·kubernetes
weixin_453965003 小时前
[单master节点k8s部署]32.ceph分布式存储(三)
分布式·ceph·kubernetes
tangdou3690986553 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
later_rql6 小时前
k8s-集群部署1
云原生·容器·kubernetes
weixin_453965008 小时前
[单master节点k8s部署]31.ceph分布式存储(二)
分布式·ceph·kubernetes
大G哥11 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝11 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
福大大架构师每日一题13 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
程序那点事儿13 小时前
k8s 之动态创建pv失败(踩坑)
云原生·容器·kubernetes