OpenTelemetry、Docker、K8sを実践で学ぶ

アプリケーションをK8sにデプロイ

15 minutes

Dockerfile の更新

Kubernetesでは、環境変数は通常、Dockerイメージに組み込むのではなく .yaml マニフェストファイルで管理されます。そこで、Dockerfileから以下の2つの環境変数を削除しましょう

bash
vi /home/splunk/workshop/docker-k8s-otel/helloworld/Dockerfile

次に、以下の2つの環境変数を削除します

dockerfile
ENV OTEL_SERVICE_NAME=helloworld
ENV OTEL_RESOURCE_ATTRIBUTES='deployment.environment=otel-$INSTANCE'

vi での変更を保存するには、esc キーを押してコマンドモードに入り、:wq! と入力してから enter/return キーを押します。

新しい Docker イメージのビルド

環境変数を除外した新しいDockerイメージをビルドしましょう

bash
cd /home/splunk/workshop/docker-k8s-otel/helloworld

docker build -t helloworld:1.2 .

Note: we’ve used a different version (1.2) to distinguish the image from our earlier version. To clean up the older versions, run the following command to get the container id:

bash
docker ps -a

Then run the following command to delete the container:

bash
docker rm <old container id> --force

Now we can get the container image id:

bash
docker images | grep 1.1

Finally, we can run the following command to delete the old image:

bash
docker image rm <old image id>

Docker イメージを Kubernetes にインポート

通常であれば、DockerイメージをDocker Hubなどのリポジトリにプッシュします。 しかし、今回のセッションでは、k3sに直接インポートする回避策を使用します。

bash
cd /home/splunk

# Import the image into k3d
sudo k3d image import helloworld:1.2 --cluster $INSTANCE-cluster

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

ヒント:vi で編集モードに入るには「i」キーを押します。変更を保存するには、esc キーを押してコマンドモードに入り、:wq! と入力してから enter/return キーを押します。

.NETアプリケーションをK8sにデプロイするために、/home/splunkdeployment.yaml という名前のファイルを作成しましょう

bash
vi /home/splunk/deployment.yaml

そして以下を貼り付けます

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  selector:
    matchLabels:
      app: helloworld
  replicas: 1
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          image: docker.io/library/helloworld:1.2
          imagePullPolicy: Never
          ports:
            - containerPort: 8080
          env:
            - name: PORT
              value: "8080"

Kubernetes における Deployment とは?

deployment.yaml ファイルは、deployment リソースを定義するために使用される kubernetes 設定ファイルです。このファイルは Kubernetes でアプリケーションを管理するための基盤となります!deployment 設定は deployment の 望ましい状態 を定義し、Kubernetes が 実際の状態 がそれと一致するよう保証します。これにより、アプリケーション pod の自己修復が可能になり、アプリケーションの簡単な更新やロールバックも可能になります。

次に、同じディレクトリに service.yaml という名前の2つ目のファイルを作成します

bash
vi /home/splunk/service.yaml

そして以下を貼り付けます

yaml
apiVersion: v1
kind: Service
metadata:
  name: helloworld
  labels:
    app: helloworld
spec:
  type: ClusterIP
  selector:
    app: helloworld
  ports:
    - port: 8080
      protocol: TCP

Kubernetes における Service とは?

Kubernetes の Service は抽象化レイヤーであり、仲介者のような役割を果たします。Pod にアクセスするための固定 IP アドレスや DNS 名を提供し、時間の経過とともに Pod が追加、削除、または交換されても同じままです。

これらのマニフェストファイルを使用してアプリケーションをデプロイできます

bash
# create the deployment
kubectl apply -f deployment.yaml

# create the service
kubectl apply -f service.yaml

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

アプリケーションにアクセスするには、まずIPアドレスを取得する必要があります

bash
kubectl describe svc helloworld | grep IP:

その後、前のコマンドから返されたCluster IPを使用してアプリケーションにアクセスできます。

例:

bash
curl http://10.43.102.103:8080/hello/Kubernetes

OpenTelemetry の設定

.NET OpenTelemetry計装はすでにDockerイメージに組み込まれています。しかし、データの送信先を指定するためにいくつかの環境変数を設定する必要があります。

先ほど作成した deployment.yaml ファイルに以下を追加します

重要 以下の YAML の $INSTANCE をあなたのインスタンス名に置き換えてください。 インスタンス名は echo $INSTANCE を実行することで確認できます。

yaml
env:
  - name: PORT
    value: "8080"
  - name: NODE_IP
    valueFrom:
      fieldRef:
        fieldPath: status.hostIP
  - name: OTEL_EXPORTER_OTLP_ENDPOINT
    value: "http://$(NODE_IP):4318"
  - name: OTEL_SERVICE_NAME
    value: "helloworld"
  - name: OTEL_RESOURCE_ATTRIBUTES
    value: "deployment.environment=otel-$INSTANCE"

完全な deployment.yaml ファイルは以下のようになります($INSTANCE ではなくあなたのインスタンス名を使用してください)

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  selector:
    matchLabels:
      app: helloworld
  replicas: 1
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          image: docker.io/library/helloworld:1.2
          imagePullPolicy: Never
          ports:
            - containerPort: 8080
          env:
            - name: PORT
              value: "8080"
            - name: NODE_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://$(NODE_IP):4318"
            - name: OTEL_SERVICE_NAME
              value: "helloworld"
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: "deployment.environment=otel-$INSTANCE"

以下のコマンドで変更を適用します

bash
kubectl apply -f deployment.yaml

その後、curl を使用してトラフィックを生成します。

1分ほど経過すると、o11y cloudでトレースが流れているのが確認できるはずです。ただし、より早くトレースを確認したい場合は、以下の方法があります…

チャレンジ

開発者として、トレースIDを素早く取得するか、コンソールフィードバックを見たい場合、deployment.yamlファイルにどのような環境変数を追加できるでしょうか?

答えを見るにはここをクリック

セクション4「.NET ApplicationをOpenTelemetryで計装する」のチャレンジで思い出していただければ、OTEL_TRACES_EXPORTER 環境変数を使ってtraceをconsoleに書き込むトリックをお見せしました。この変数をdeployment.yamlに追加し、アプリケーションを再deployして、helloworldアプリからlogをtailすることで、trace idを取得してSplunk Observability Cloudでtraceを見つけることができます。(ワークショップの次のセクションでは、debug exporterの使用についても説明します。これはK8s環境でアプリケーションをdebugする際の典型的な方法です。)

まず、viでdeployment.yamlファイルを開きます

bash
vi deployment.yaml

次に、OTEL_TRACES_EXPORTER 環境変数を追加します

yaml
env:
  - name: PORT
    value: "8080"
  - name: NODE_IP
    valueFrom:
      fieldRef:
        fieldPath: status.hostIP
  - name: OTEL_EXPORTER_OTLP_ENDPOINT
    value: "http://$(NODE_IP):4318"
  - name: OTEL_SERVICE_NAME
    value: "helloworld"
  - name: OTEL_RESOURCE_ATTRIBUTES
    value: "deployment.environment=YOURINSTANCE"
  # NEW VALUE HERE:
  - name: OTEL_TRACES_EXPORTER
    value: "otlp,console"

変更を保存してからアプリケーションを再deployします

bash
kubectl apply -f deployment.yaml

helloworldのlogをtailします

bash
kubectl logs -l app=helloworld -f

次に、別のterminal windowでcurlコマンドを使ってtraceを生成します。logをtailしているconsoleでtrace idが表示されるはずです。Activity.TraceId: の値をコピーして、APMのTrace検索フィールドに貼り付けてください。

Last Modified ·