Kubernetes déploie un cluster Skywalking et l'accès aux services JAVA

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:
Insérez la description de l'image ici

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:
Insérez la description de l'image ici

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
Insérez la description de l'image iciInsérez la description de l'image ici

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

Insérez la description de l'image ici
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:
Insérez la description de l'image ici
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.
Insérez la description de l'image ici

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.
Insérez la description de l'image ici

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.
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/nangonghen/article/details/110290450
conseillé
Classement