コンテンツにスキップ

Kubernetes クラスタ アプリケーションが SkyWalking でリンクトレーシングデータを収集


概要

Kubernetes クラスタでは、アプリケーションはすべてイメージとしてデプロイされます。SkyWalking でアプリケーションのリンクトレーシングデータを収集する際に、従来の方法で SkyWalking Agent を各アプリケーションイメージに組み込んでデプロイすると、イメージが肥大化し、後の SkyWalking バージョンアップも不便になります。本記事では、公式の SkyWalking イメージを使用し、initContainers 方式でアプリケーションに SkyWalking Agent を提供してリンクトレーシングデータを収集する方法を紹介します。

前提条件

DataKit のインストール

Input の有効化

SkyWalking コレクターを有効にするには、DataKit が動作するサーバーに /usr/local/datakit/conf.d/skywalking/skywalking.conf ファイルを作成します。DaemonSet でデプロイする場合は、ConfigMap を定義してから、ファイルを DataKit コンテナにマウントする必要があります。ここでは、DataKit のデプロイ時に使用した datakit.yaml を使用します。

skywalking.conf の定義

datakit.yaml ファイルの ConfigMap リソースに、skywalking.conf の定義を追加します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: datakit-conf
  namespace: datakit
data:  
    ## 以下は新規追加内容
    skywalking.conf: |- 
        [[inputs.skywalking]]
          ## skywalking grpc server listening on address
          address = "0.0.0.0:11800"

skywalking.conf のマウント

datakit.yaml ファイルの volumeMounts に以下の内容を追加します。

        - mountPath: /usr/local/datakit/conf.d/skywalking/skywalking.conf
          name: datakit-conf
          subPath: skywalking.conf

DataKit の再起動

kubectl delete -f datakit.yaml
kubectl apply -f datakit.yaml

Java リンクトレーシングデータの取り込み

テストアプリケーションの作成

サンプルでは datakit-springboot-demo を使用します。ダウンロード後、jar ファイル(service-demo-1.0-SNAPSHOT.jar)を作成します。

イメージの作成

Dockerfile を作成します。

FROM openjdk:8u292

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV jar service-demo-1.0-SNAPSHOT.jar

ENV workdir /data/app/
RUN mkdir -p ${workdir}
COPY ${jar} ${workdir}
WORKDIR ${workdir}
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar} ${PARAMS} "]

イメージを作成し、イメージレジストリにプッシュします。

docker build -t 172.16.0.246/df-demo/service-demo:v1  .
docker push 172.16.0.246/df-demo/service-demo:v1

アプリケーションのデプロイ

アプリケーションのデプロイファイル skywalking-demo.yaml で、initContainers を使用して apache/skywalking-java-agent:8.7.0-alpine イメージを初期化します。これにより、同じ Pod 内のアプリケーションが skywalking-agent.jar にアクセスできるようになります。そして JAVA_OPTS で jar の起動コマンドを定義します。-Dskywalking.agent.service_name=skywalking-demo-master でアプリケーションのエイリアスを skywalking-demo-master と指定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-demo-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-demo-pod
  template:
    metadata:
      labels:
        app: skywalking-demo-pod
      annotations:
    spec:
      containers:
      - name: skywalking-demo-demo-container
        image: 172.16.0.246/df-demo/service-demo:v1
        env:
        - name: HOST_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.hostIP
        - name: HOST_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName      
        - name: JAVA_OPTS
          value: |-
                -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking-demo-master  -Dskywalking.collector.backend_service=$(HOST_IP):11800           
        ports:
        - containerPort: 8090
          protocol: TCP
        volumeMounts:
        - mountPath: /skywalking
          name: skywalking-agent
      initContainers:
        - name: agent-container
          image: apache/skywalking-java-agent:8.7.0-alpine
          volumeMounts:
            - name: skywalking-agent   
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]  
      restartPolicy: Always
      volumes:
        - name: skywalking-agent
          emptyDir: {}
kubectl apply -f skywalking-demo.yaml 

アプリケーションへのアクセス

Pod のポートを確認します。

image

アプリケーションを呼び出して、リンクトレーシングデータを生成します。

curl 10.244.36.98:8090/ping

APM

Guance』にログインし、『APM』モジュールに移動して、skywalking-demo-master アプリケーションを確認します。

image

フィードバック

このページは役に立ちましたか?