1. Información general:
1.1 Medio Ambiente
La información de la versión es la siguiente:
a, sistema operativo: centos 7.6
a, versión skywalking: v8.0.1
c, versión kubernetes: v1.18.5
d, versión es: 6.4.3
e, versión helm: helm3
1.2 Descripción general de skywalking
1.2.1 ¿Qué es el skywalking?
SkyWalking es un sistema APM de código abierto que proporciona capacidades de monitoreo, seguimiento de enlaces y diagnóstico para sistemas distribuidos nativos de la nube. Es compatible con la integración de múltiples aplicaciones de lenguaje de programación (java, php, go, lua, etc.), y también puede ser utilizado con rejillas de servicio. Además de admitir la integración de métodos de intrusión de código, un aspecto destacado también es compatible con la integración de intrusión de código cero (la intrusión de código cero está relacionada con lenguajes de programación específicos), que utiliza las características del agente java para modificar el programa en tiempo de ejecución a nivel de jvm , por lo que el programa Durante el período de edición del código, el personal puede lograr el efecto de enterrar puntos sin modificar el código comercial. El almacenamiento de back-end admite múltiples bases de datos como es, mysql, tidb, etc.
El diagrama de arquitectura es el siguiente:
1.2.1 Uso del agente java de skywalking
1) Método 1: modo de línea de comandos
java \
-javaagent:/root/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=app1 \
-Dskywalking.collector.backend_service=localhost:11800 \
-jar myapp.jar
2) Método 2: método de variable de entorno
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=10.0.0.1:11800,10.0.0.2:11800
export SW_AGENT_NAME=demo1
export JAVA_OPTS=-javaagent:/root/skywalking/agent/skywalking-agent.jar
java \
$JAVA_OPTS \
-jar myapp.jar
2 Condiciones previas del departamento:
Tener un clúster k8s:
3 Despliegue:
3.1 implementar clúster es
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: kube-system
spec:
replicas: 3
selector:
matchLabels:
app: elasticsearch
serviceName: elasticsearch
template:
metadata:
creationTimestamp: null
labels:
app: elasticsearch
spec:
containers:
- env:
- name: cluster.name
value: k8s-logs
- name: node.name
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: discovery.zen.ping.unicast.hosts
value: elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch
- name: discovery.zen.minimum_master_nodes
value: "2"
- name: ES_JAVA_OPTS
value: -Xms512m -Xmx512m
image: registry.cn-shenzhen.aliyuncs.com/gzlj/elasticsearch-oss:6.4.3
imagePullPolicy: Always
name: elasticsearch
ports:
- containerPort: 9200
name: rest
protocol: TCP
- containerPort: 9300
name: inter-node
protocol: TCP
resources:
limits:
cpu: "1"
requests:
cpu: 100m
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: data
initContainers:
- command:
- sh
- -c
- chown -R 1000:1000 /usr/share/elasticsearch/data
image: busybox
imagePullPolicy: Always
name: fix-permissions
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: data
- command:
- sysctl
- -w
- vm.max_map_count=262144
image: busybox
imagePullPolicy: Always
name: increase-vm-max-map
resources: {}
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
- command:
- sh
- -c
- ulimit -n 65536
image: busybox
imagePullPolicy: Always
name: increase-fd-ulimit
resources: {}
securityContext:
privileged: true
volumes:
- emptyDir: {}
name: data
---
kind: Service
apiVersion: v1
metadata:
name: elasticsearch
namespace: kube-system
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node
---
kind: Service
apiVersion: v1
metadata:
name: elasticsearch-logging
namespace: kube-system
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
ports:
- port: 9200
name: external
La dirección de modo del clúster es es: 192.168.39.33:18448
3.2 Implementar clúster de caminatas aéreas
Descargue el almacén de paquetes de gráficos de skywalking desde github
cd /tmp
rpm -q git > /dev/null 2>&1 || yum install git -y
git clone https://github.com/apache/skywalking-kubernetes
cd /tmp/skywalking-kubernetes/chart
Dado que el clúster de es ya existe, no es necesario implementarlo a través de helm. Puede comentar el gráfico es del que depende el paquete de gráficos.
vim skywalking/Chart.yaml
Ejecute el comando helm para implementar el clúster de skywalking. En el primer paso, implementé el clúster ES bajo el espacio de nombres del sistema kube, por lo que el clúster ES conectado por skywalking es: elasticsearch-logging.kube-system: 9200.
export SKYWALKING_RELEASE_NAME=skywalking
export SKYWALKING_RELEASE_NAMESPACE=skywalking-ns
kubectl create ns $SKYWALKING_RELEASE_NAMESPACE
helm install "$SKYWALKING_RELEASE_NAME" ./skywalking \
-n "$SKYWALKING_RELEASE_NAMESPACE" \
--set oap.image.tag=8.0.1-es6 \
--set oap.storageType=elasticsearch \
--set oap.service.type=NodePort \
--set oap.javaOpts="-Xmx8g -Xms8g" \
--set ui.image.tag=8.0.1 \
--set ui.service.type=NodePort \
--set elasticsearch.enabled=false \
--set elasticsearch.config.host=elasticsearch-logging.kube-system \
--set elasticsearch.config.port.http=9200 \
--set elasticsearch.config.user="" \
--set elasticsearch.config.password=""
Verifique svc y pod, podemos ver que la implementación de skywalking es exitosa: a
través de k8s svc NodePort, la dirección oap del servicio back-end conectada por el agente de skywalking es: 192.168.39.33:22335.
3.3 Hacer el contenedor init del agente de skywalking
cd / tmp /
wget https://archive.apache.org/dist/skywalking/8.0.1/apache-skywalking-apm-8.0.1.tar.gz
tar xf /apache-skywalking-apm-8.0.1.tar .gz
Escriba Dockerfile: de la siguiente manera:
FROM busybox:latest
ENV LANG=C.UTF-8
RUN set -eux && mkdir -p /opt/skywalking/agent/
ADD apache-skywalking-apm-bin/agent/ /opt/skywalking/agent/
WORKDIR /
Ejecute el comando docker build para crear una imagen y enviarla al almacén.
docker build -t "registro.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1".
docker push registro.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
4 Implementar microservicios springboot
1) El microservicio es de Internet con algunas modificaciones. Los microservicios casi no tienen lógica comercial, solo llamadas http e instrucciones de suspensión.
2) Mi servicio comercial está implementado en otro clúster de k8s, por lo que el agente de skywalking accede al NodePort del servicio oap de skywalking ubicado en otro clúster.
3) Cada archivo yaml se puede usar directamente, y la variable de entorno SW_AGENT_COLLECTOR_BACKEND_SERVICES debe modificarse de acuerdo con la situación real. En mi ejemplo SW_AGENT_COLLECTOR_BACKEND_SERVICES = 192.168.39.33: 22335.
4.1 servicio de interfaz de usuario
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: acme-financial-ui
name: acme-financial-ui
spec:
replicas: 1
selector:
matchLabels:
app: acme-financial-ui
template:
metadata:
labels:
app: acme-financial-ui
spec:
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
name: skywalking-sidecar
command: ["sh"]
args: [
"-c",
"mkdir -p /opt/sw/agent && cp -rf /opt/skywalking/agent/* /opt/sw/agent/"
]
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
containers:
- env:
- name: JAVA_OPTS
value: "-javaagent:/opt/sw/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "acme-financial-ui"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.30.68:22335"
image: registry.cn-shenzhen.aliyuncs.com/gzlj/acme-financial-ui:v0.1
imagePullPolicy: Always
name: ui
ports:
- containerPort: 8081
protocol: TCP
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
volumes:
- name: sw-agent
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: acme-financial-ui
name: acme-financial-ui
spec:
ports:
- name: http
port: 8081
protocol: TCP
targetPort: 8081
selector:
app: acme-financial-ui
sessionAffinity: None
type: NodePort
4.2 Servicio de oficina
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: acme-financial-office
name: acme-financial-office
spec:
replicas: 1
selector:
matchLabels:
app: acme-financial-office
template:
metadata:
labels:
app: acme-financial-office
spec:
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
name: skywalking-sidecar
command: ["sh"]
args: [
"-c",
"mkdir -p /opt/sw/agent && cp -rf /opt/skywalking/agent/* /opt/sw/agent/"
]
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
containers:
- env:
- name: JAVA_OPTS
value: "-javaagent:/opt/sw/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "acme-financial-office"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.30.68:22335"
image: registry.cn-shenzhen.aliyuncs.com/gzlj/acme-financial-office:v0.1
imagePullPolicy: Always
name: office
ports:
- containerPort: 8082
protocol: TCP
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
volumes:
- name: sw-agent
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: acme-financial-office
name: acme-financial-back-office
spec:
ports:
- name: http
port: 8082
protocol: TCP
targetPort: 8082
selector:
app: acme-financial-office
sessionAffinity: None
type: ClusterIP
4.3 servicio de cuenta
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: acme-financial-account
name: acme-financial-account
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: acme-financial-account
template:
metadata:
labels:
app: acme-financial-account
spec:
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
name: skywalking-sidecar
command: ["sh"]
args: [
"-c",
"mkdir -p /opt/sw/agent && cp -rf /opt/skywalking/agent/* /opt/sw/agent/"
]
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
containers:
- env:
- name: JAVA_OPTS
value: "-javaagent:/opt/sw/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "acme-financial-account"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.30.68:22335"
image: registry.cn-shenzhen.aliyuncs.com/gzlj/acme-financial-account:v0.1
imagePullPolicy: Always
name: account
ports:
- containerPort: 8083
protocol: TCP
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
volumes:
- name: sw-agent
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: acme-financial-account
name: acme-financial-account
spec:
ports:
- name: http
port: 8083
protocol: TCP
targetPort: 8083
selector:
app: acme-financial-account
sessionAffinity: None
type: ClusterIP
4.4 servicio al cliente
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: acme-financial-customer
name: acme-financial-customer
spec:
replicas: 1
selector:
matchLabels:
app: acme-financial-customer
template:
metadata:
labels:
app: acme-financial-customer
spec:
initContainers:
- image: registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
name: skywalking-sidecar
command: ["sh"]
args: [
"-c",
"mkdir -p /opt/sw/agent && cp -rf /opt/skywalking/agent/* /opt/sw/agent/"
]
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
containers:
- env:
- name: JAVA_OPTS
value: "-javaagent:/opt/sw/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "acme-financial-customer"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.30.68:22335"
image: registry.cn-shenzhen.aliyuncs.com/gzlj/acme-financial-customer:v0.1
imagePullPolicy: Always
name: customer
ports:
- containerPort: 8084
protocol: TCP
volumeMounts:
- name: sw-agent
mountPath: /opt/sw/agent
volumes:
- name: sw-agent
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
labels:
app: acme-financial-customer
name: acme-financial-customer
namespace: default
spec:
ports:
- name: http
port: 8084
protocol: TCP
targetPort: 8084
selector:
app: acme-financial-customer
sessionAffinity: None
type: ClusterIP
4.5 Resultados de la implementación de microservicios empresariales
La implementación del servicio empresarial se ha realizado correctamente. Como se muestra en la figura, el NodePort del servicio de interfaz de usuario es 30115.
5 Acceda a los microservicios empresariales de springboot y vea Skywalking
5.1 Tres interfaces para acceder a los servicios de IU
Acceda a las tres interfaces del servicio UI a través de NodePort: / hello, / start y / readtimeout.
5.2 Acceso a la interfaz de usuario de Skywalking
Abra la interfaz de skywalking (192.168.39.33:16622), puede ver los datos relacionados con el seguimiento del enlace.