记录一下:K8s部署SkyWalking链路追踪

发表于
57

1. 环境概览

集群环境:

  • K8s集群:1个Master节点+2个Worker节点

  • Master:4核6G(master01)

  • Worker:4核8G(worker01,worker02)

  • 命名空间:zzyl

  • 镜像仓库:harbor.yinbao77.icu

架构组件:

  • SkyWalking OAP:链路追踪后端服务

  • SkyWalking UI:Web管理界面

  • ElasticSearch:数据存储

  • 项目前端:zzyl-web(Nginx)

  • 项目后端:zzyl-admin(Spring Boot)

  • 数据库:MySQL, Redis

2. SkyWalking 部署

  1. 准备工作

# 创建命名空间
kubectl create ns zzyl

# 给 worker 节点打标签
kubectl label nodes worker01 node-role.kubernetes.io/worker=worker --overwrite
kubectl label nodes worker02 node-role.kubernetes.io/worker=worker --overwrite
  1. SkyWalking 配置文件

创建values-prod.yaml

elasticsearch:
  enabled: true
  replicas: 1  # 单ES避免脑裂
  minimumMasterNodes: 1
  antiAffinity: "soft"
  
  resources:
    requests:
      cpu: "1000m"
      memory: "2Gi"
    limits:
      cpu: "2000m"
      memory: "4Gi"
  
  volumeClaimTemplate:
    accessModes: ["ReadWriteOnce"]
    resources:
      requests:
        storage: "20Gi"

oap:
  replicas: 1
  storageType: elasticsearch
  
  image:
    repository: harbor.yinbao77.icu/skywalking/skywalking-oap-server
    tag: "10.1.0"
  
  resources:
    requests:
      cpu: "500m"
      memory: "1Gi"
    limits:
      cpu: "1000m"
      memory: "2Gi"
  
  javaOpts: "-Xmx1g -Xms1g"
  
  # 调整启动探针超时
  startupProbe:
    tcpSocket:
      port: 12800
    initialDelaySeconds: 120
    periodSeconds: 30
    failureThreshold: 10

ui:
  replicas: 1
  
  image:
    repository: harbor.yinbao77.icu/skywalking/skywalking-ui
    tag: "10.1.0"
  
  # UI可以在master运行
  tolerations:
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
  
  resources:
    requests:
      cpu: "100m"
      memory: "256Mi"
    limits:
      cpu: "500m"
      memory: "512Mi"
  
  service:
    type: NodePort
    nodePort: 30080

satellite:
  enabled: false
  1. 部署 SkyWalking

# 下载SkyWalking Helm Chart
https://www.apache.org/dyn/closer.cgi/skywalking/kubernetes/4.7.0/skywalking-helm-4.7.0-src.tgz

# 解压
tar xf skywalking-helm-4.7.0-src.tgz
cd chart/skywalking
# 将 上面 `values-prod.yaml` 放到这

# 部署
helm upgrade --install skywalking . \
  -f values-prod.yaml \
  -n zzyl --create-namespace
  1. 验证 SkyWalking

# 检查所有组件状态
kubectl get all -n zzyl

# 访问 UI
# 浏览器访问: http://节点IP:30080

3. 应用部署与链路追踪集成

  1. 后端应用配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zzyl-admin
  namespace: zzyl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zzyl-admin
  template:
    metadata:
      labels:
        app: zzyl-admin
    spec:
      # 初始化容器下载SkyWalking agent
      initContainers:
      - name: skywalking-agent
        image: harbor.yinbao77.icu/skywalking/skywalking-java-agent:9.5.0-java11
        command: ['sh', '-c', 'cp -r /skywalking/agent/* /agent/']
        volumeMounts:
        - name: skywalking-agent
          mountPath: /agent
      
      containers:
      - name: zzyl-admin
        image: harbor.yinbao77.icu/zhyl/zzyl-admin
        ports:
        - containerPort: 8123
        
        # 关键:强制指定启动命令,确保加载agent
        command: ["java"]
        args: [
          "-javaagent:/opt/skywalking/agent/skywalking-agent.jar",
          "-jar", 
          "zzyl-admin.jar"
        ]
        
        # SkyWalking配置
        env:
        - name: SW_AGENT_NAME
          value: "zzyl-admin"
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: "skywalking-skywalking-helm-oap.zzyl:11800"
        - name: SW_AGENT_NAMESPACE
          value: "zzyl"
        - name: SW_LOGGING_LEVEL
          value: "INFO"
        
        # 挂载agent目录
        volumeMounts:
        - name: skywalking-agent
          mountPath: /opt/skywalking/agent
      
      # 共享卷
      volumes:
      - name: skywalking-agent
        emptyDir: {}

---
apiVersion: v1
kind: Service
metadata:
  name: zzyl-admin
  namespace: zzyl
spec:
  selector:
    app: zzyl-admin
  ports:
  - protocol: TCP
    port: 8123
    targetPort: 8123
  type: ClusterIP
  1. 前端应用配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zzyl-web
  namespace: zzyl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zzyl-web
  template:
    metadata:
      labels:
        app: zzyl-web
    spec:
      containers:
      - name: zzyl-web
        image: harbor.yinbao77.icu/zhyl/zzyl-web
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"

---
apiVersion: v1
kind: Service
metadata:
  name: zzyl-web
  namespace: zzyl
spec:
  selector:
    app: zzyl-web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zzyl-https-ingress
  namespace: zzyl
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - zzyl.yinbao77.icu
    secretName: zzyl-tls-secret
  rules:
  - host: zzyl.yinbao77.icu
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: zzyl-web
            port:
              number: 80
  1. 部署应用

kubectl apply -f zzyl-admin-skywalking.yaml
kubectl apply -f zzyl-web.yaml
  1. 查看追踪数据

  • 访问SkyWalking UI:http://节点IP:30080

  • 等待数据同步(2-3分钟)

  • 查看路径

    • 常规服务:查看zzyl-admin服务

    • 拓扑图:

    • 链路追踪:

我对链路追踪的理解

概念:链路追踪是分布式系统可观测性的重要组成部分,通过追踪请求在各个服务间的完整调用路径,提供系统行为的全局视图。

实际价值

  • 故障定位: 快速找到出错的服务和具体方法

  • 性能优化: 识别响应时间瓶颈

  • 依赖分析: 理解服务间调用关系

  • 容量规划: 基于真实流量数据

在微服务架构中,链路追踪不是锦上添花,而是必需品。就像给复杂的管道系统安装监控器,你需要知道水流在哪里、流量多大、哪里堵塞了。


下一篇 记录一下:Kubernetes Pod 资源配额与自动扩缩容实践