记录一下:K8s部署SkyWalking链路追踪
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 部署
准备工作
# 创建命名空间
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
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
部署 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
验证 SkyWalking
# 检查所有组件状态
kubectl get all -n zzyl
# 访问 UI
# 浏览器访问: http://节点IP:30080
3. 应用部署与链路追踪集成
后端应用配置
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
前端应用配置
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
部署应用
kubectl apply -f zzyl-admin-skywalking.yaml
kubectl apply -f zzyl-web.yaml
查看追踪数据
访问SkyWalking UI:
http://节点IP:30080
等待数据同步(2-3分钟)
查看路径
常规服务:查看zzyl-admin服务
拓扑图:
链路追踪:
我对链路追踪的理解
概念:链路追踪是分布式系统可观测性的重要组成部分,通过追踪请求在各个服务间的完整调用路径,提供系统行为的全局视图。
实际价值
故障定位: 快速找到出错的服务和具体方法
性能优化: 识别响应时间瓶颈
依赖分析: 理解服务间调用关系
容量规划: 基于真实流量数据
在微服务架构中,链路追踪不是锦上添花,而是必需品。就像给复杂的管道系统安装监控器,你需要知道水流在哪里、流量多大、哪里堵塞了。