Kubernetes APM鏈路追蹤Skywalking


隨着RPC框架、微服務、雲計算、大數據的發展,業務的規模和深度相比過往也都在增加。一個業務可能橫跨多個模塊/服務/容器,依賴的中間件也越來越多,其中任何一個節點出現異常,都可能導致業務出現波動或者異常,這就導致服務質量監控和異常診斷/定位變得異常復雜。於是催生了新的業務監控模式:調用鏈跟蹤系統APM

在諸多優秀的開源APM產品中SkywalkingPinpoint脫穎而出,兩款產品都通過字節碼注入的方式,實現了對代碼完全無任何侵入。對比如下:

 

 

前面我們介紹過單純Docker方式(docker-compose)部署Pinpoint, 可以提供參考。本節我們介紹在Kubernetes上部署Skywalking。

1、Helm3

curl -LO https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar -zxf helm-v3.2.4-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/helm3

2、服務端

Skywalking后端存儲,使用EFK日志系統的ES集群。注意index加前綴區分
詳細的Elasticsearch集群部署可以參考:Kubernetes日志系統EFK

cd ~/k8s/helm/charts git clone https://github.com/apache/skywalking-kubernetes.git cd skywalking-kubernetes/chart helm dep up skywalking # 創建namespace kubectl create ns skywalking # 准備values文件, 詳見Values vim skywalking/values.yaml # helm3 install skywalking skywalking -n skywalking --values ./skywalking/values.yaml helm3 -n skywalking list helm3 -n skywalking delete skywalking helm3 -n skywalking upgrade skywalking --values ./skywalking/values.yaml

Helm Values

oap: name: oap dynamicConfigEnabled: false image: repository: apache/skywalking-oap-server tag: 8.1.0-es7 pullPolicy: IfNotPresent storageType: elasticsearch7 # 存儲類型es7 ports: grpc: 11800 rest: 12800 replicas: 2 service: type: ClusterIP javaOpts: -Xmx2g -Xms2g antiAffinity: "soft" nodeAffinity: {} nodeSelector: {} tolerations: [] resources: {} env: SW_NAMESPACE: "skywalking" # es索引前綴skywalking_, _下划線會自動加上 ui: name: ui replicas: 1 image: repository: apache/skywalking-ui tag: 8.1.0 pullPolicy: IfNotPresent ingress: enabled: true annotations: {} path: / hosts: - skywalking.boer.xyz # ingress地址 tls: [] elasticsearch: enabled: false # 關閉內置es,我們使用EFK日志系統的ES集群 config: port: http: 9200 host: "elasticsearch-logging.logging.svc" # 日志系統ES地址 user: "elastic" password: "<your-es-password>"

3、客戶端

制作skywalking-agent鏡像

cd ~/k8s/apps/skywalking-agent tar -zxf apache-skywalking-apm-es7-8.1.0.tar.gz cp apache-skywalking-apm-bin-es7/agent agent vim Dockerfile # 准備Dockerfile, 詳見Dockerfile docker build -t registry.boer.xyz/public/skywalking-agent:8.1.0 . docker push registry.boer.xyz/public/skywalking-agent:8.1.0

Dockerfile

FROM busybox:latest ENV LANG=C.UTF-8 WORKDIR /usr/skywalking/agent COPY agent/ .

skywalking-agent配置

# vim agent/config agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # 服務名:區分不同服務,通過環境變量設置 agent.instance_name=${HOSTNAME} # 實例名:區分多實例,取Pod主機名 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:skywalking-oap.skywalking.svc:11800} # 服務端地址 logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log} logging.level=${SW_LOGGING_LEVEL:INFO} logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:31457280}

4、使用示例

使用skywalking-agent一般會想到兩種方法:

  • 將 agent 包構建到已經存在的基礎鏡像中
  • 通過initContainer方式拷貝Agent

initContainer方式將skywalking-agent拷貝到應用Pod中,無需修改基礎JVM鏡像,所以更推薦此方法:

apiVersion: apps/v1 kind: Deployment metadata: name: produce-deployment annotations: kubernetes.io/change-cause: <CHANGE_CAUSE> spec: selector: matchLabels: app: produce replicas: 2 template: metadata: labels: app: produce spec: initContainers: - image: registry.boer.xyz/public/skywalking-agent:8.1.0 name: skywalking-agent imagePullPolicy: IfNotPresent command: ['sh'] args: ['-c','cp -r /usr/skywalking/agent/* /skywalking/agent'] volumeMounts: - mountPath: /skywalking/agent name: skywalking-agent containers: - name: produce image: <IMAGE>:<IMAGE_TAG> imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /usr/skywalking/agent name: skywalking-agent ports: - containerPort: 10080 resources: requests: memory: "512Mi" cpu: "200m" limits: memory: "1Gi" cpu: "600m" env: - name: ENVIRONMENT value: "pro" - name: SW_AGENT_NAME # sw服務名 value: "springboot-produce" - name: JVM_OPTS value: "-Xms512m -Xmx512m -javaagent:/usr/skywalking/agent/skywalking-agent.jar" livenessProbe: httpGet: path: /actuator/health port: 10080 initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 readinessProbe: httpGet: path: /actuator/health port: 10080 initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 lifecycle: preStop: exec: command: - "curl" - "-XPOST" - "http://127.0.0.1:10080/actuator/shutdown" imagePullSecrets: - name: regcred volumes: - name: skywalking-agent emptyDir: {}

5、Skywalking ES存儲索引管理

詳細iLM索引生命周期,見Kubernetes日志系統EFK一文

PUT _ilm/policy/skywalking-policy   
{
  "policy": { "phases": { "warm": { "min_age": "2d", "actions": { "forcemerge": { "max_num_segments": 1 } } }, "delete": { "min_age": "3d", "actions": { "delete": {} } } } } } 

PUT template/skywalking-template
{
"index_patterns": ["skywalking
*"], // 這里完全匹配skywalking索引前綴,即SW_NAMESPACE
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0,
"index.lifecycle.name": "skywalking-policy",
"index.refresh_interval": "30s",
"index.translog.durability": "async",
"index.translog.sync_interval":"60s"
}
}

6、The show


Ref


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM