1. Vue d'ensemble:
1.1 Environnement
Les informations de version sont les suivantes:
a, système d'exploitation: centos 7.6
a, version skywalking: v8.0.1
c, version kubernetes: v1.18.5
d, version es: 6.4.3
e, version helm: helm3
1.2 Vue d'ensemble du skywalking
1.2.1 Qu'est-ce que le skywalking
SkyWalking est un système APM open source qui fournit des capacités de surveillance, de suivi des liens et de diagnostic pour les systèmes distribués natifs du cloud. Il prend en charge l'intégration de plusieurs applications de langage de programmation (java, php, go, lua, etc.), et peut également être utilisé avec les grilles de service. En plus de prendre en charge l'intégration des méthodes d'intrusion de code, un point fort majeur prend également en charge l'intégration de l'intrusion de code zéro (l'intrusion de code zéro est liée à des langages de programmation spécifiques), qui utilise les caractéristiques de l'agent Java pour modifier le programme d'exécution au niveau jvm , donc le programme Pendant la période d'édition du code, le personnel peut obtenir l'effet d'enfouir des points sans modifier le code métier. Le stockage back-end prend en charge plusieurs bases de données telles que es, mysql, tidb, etc.
Le schéma d'architecture est le suivant:
1.2.1 Utilisation de l'agent Java de skywalking
1) Méthode 1: mode ligne de commande
java \
-javaagent:/root/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=app1 \
-Dskywalking.collector.backend_service=localhost:11800 \
-jar myapp.jar
2) Méthode 2: méthode des variables d'environnement
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 Conditions préalables au département:
Avoir un cluster k8s:
3 Déploiement:
3.1 déployer le cluster 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
L'adresse de mode du cluster es est: 192.168.39.33:18448
3.2 Déployer le cluster Skywalking
Téléchargez l'entrepôt de packages de cartes de Skywalking à partir de 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
Étant donné que le cluster es existe déjà, il n'est pas nécessaire de déployer es via helm. Vous pouvez commenter le graphique es dont dépend le package de graphiques.
vim skywalking/Chart.yaml
Exécutez la commande helm pour déployer le cluster skywalking. Dans la première étape, j'ai déployé le cluster ES sous l'espace de noms kube-system, donc le cluster ES connecté par skywalking est: 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=""
Vérifiez svc et pod, nous pouvons voir que le déploiement de skywalking est réussi:
via k8s svc NodePort, l'adresse oap du service back-end connecté par l'agent skywalking est: 192.168.39.33:22335.
3.3 Création du conteneur d'initialisation de l'agent 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
Écrivez Dockerfile: comme suit:
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 /
Exécutez la commande docker build pour créer une image et la pousser vers l'entrepôt.
docker build -t "registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1".
docker push registry.cn-shenzhen.aliyuncs.com/gzlj/sw-agent:8.0.1
4 Déployer des microservices springboot
1) Le microservice provient d'Internet avec quelques modifications. Les microservices n'ont pratiquement pas de logique métier, uniquement des appels http et des instructions de mise en veille.
2) Mon service métier est déployé dans un autre cluster k8s, donc l'agent skywalking accède au NodePort du service skywalking oap situé dans un autre cluster.
3) Chaque fichier yaml peut être utilisé directement, et la variable d'environnement SW_AGENT_COLLECTOR_BACKEND_SERVICES doit être modifiée en fonction de la situation réelle. Dans mon exemple SW_AGENT_COLLECTOR_BACKEND_SERVICES = 192.168.39.33: 22335.
4.1 Service d'interface utilisateur
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 Service de bureau
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 Service de compte
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 service client
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 Résultats du déploiement des microservices métier
Le déploiement du service métier a réussi. Comme indiqué sur la figure, le NodePort du service d'interface utilisateur est 30115.
5 Accédez aux microservices d'entreprise de Springboot et visualisez le skywalking
5.1 Trois interfaces pour accéder aux services d'interface utilisateur
Accédez aux trois interfaces du service d'interface utilisateur via NodePort: / hello, / start et / readtimeout.
5.2 Accès à l'interface utilisateur de skywalking
Ouvrez l'interface skywalking (192.168.39.33:16622), vous pouvez voir les données liées au suivi des liens.