Kubernetes implementa un clúster de skywalking y acceso a servicios JAVA

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:
Inserte la descripción de la imagen aquí

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:
Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
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
Inserte la descripción de la imagen aquí
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.
Inserte la descripción de la imagen aquí

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.
Inserte la descripción de la imagen aquí

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.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/nangonghen/article/details/110290450
Recomendado
Clasificación