Splunk4Ninjas Workshops
アプリケーションを K8s にデプロイする
Dockerfile を更新する #
Kubernetes では、環境変数は通常 Docker イメージに組み込むのではなく、.yaml マニフェストファイルで管理します。そのため、Dockerfile から以下の2つの環境変数を削除しましょう
vi /home/splunk/workshop/docker-k8s-otel/helloworld/Dockerfile次の2つの環境変数を削除します
ENV OTEL_SERVICE_NAME=helloworld
ENV OTEL_RESOURCE_ATTRIBUTES='deployment.environment=otel-$INSTANCE'vi で変更を保存するには、
escキーを押してコマンドモードに入り、:wq!と入力してからenter/returnキーを押します。
新しい Docker イメージをビルドする #
環境変数を除外した新しい Docker イメージをビルドしましょう
cd /home/splunk/workshop/docker-k8s-otel/helloworld
docker build -t helloworld:1.2 .注意: 以前のバージョンと区別するために、異なるバージョン (1.2) を使用しています。 古いバージョンをクリーンアップするには、以下のコマンドでコンテナ ID を取得します
bashdocker ps -a | grep helloworld次に、以下のコマンドでコンテナを削除します
bashdocker rm <old container id> --forceコンテナイメージ ID を取得します
bashdocker images | grep 1.1最後に、以下のコマンドで古いイメージを削除します
bashdocker image rm <old image id>
Docker イメージをローカルコンテナリポジトリにインポートする #
通常は Docker イメージを Docker Hub などのリポジトリにプッシュします。
しかし、このワークショップでは、EC2 インスタンス上の localhost:9999 で動作しているローカルコンテナリポジトリに Docker イメージをプッシュします。
# Update the image tag
docker tag helloworld:1.2 localhost:9999/helloworld:1.2
# Import the image into the local repository
docker push localhost:9999/helloworld:1.2.NET アプリケーションをデプロイする #
ヒント: vi で編集モードに入るには、‘i’ キーを押します。変更を保存するには、
escキーを押してコマンドモードに入り、:wq!と入力してからenter/returnキーを押します。
.NET アプリケーションを K8s にデプロイするために、/home/splunk に deployment.yaml というファイルを作成しましょう
vi /home/splunk/deployment.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: localhost:9999/helloworld:1.2
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"Kubernetes の Deployment とは?
deployment.yaml ファイルは、Deployment リソースを定義するための Kubernetes 設定ファイルです。このファイルは Kubernetes でアプリケーションを管理する上での基盤となります!Deployment 設定はデプロイメントの望ましい状態を定義し、Kubernetes が実際の状態をそれに一致させます。これにより、アプリケーション Pod の自己修復が可能になり、アプリケーションの更新やロールバックも容易になります。
次に、同じディレクトリに service.yaml という名前の2つ目のファイルを作成します
vi /home/splunk/service.yaml以下の内容を貼り付けます
apiVersion: v1
kind: Service
metadata:
name: helloworld
labels:
app: helloworld
spec:
type: ClusterIP
selector:
app: helloworld
ports:
- port: 8080
protocol: TCPKubernetes の Service とは?
Kubernetes の Service は抽象化レイヤーであり、仲介者のように機能し、Pod にアクセスするための固定 IP アドレスまたは DNS 名を提供します。これは、Pod が追加、削除、または置き換えられても変わりません。
次に、同じディレクトリに ingress.yaml という名前の3つ目のファイルを作成します
vi /home/splunk/ingress.yaml以下の内容を貼り付けます
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: helloworld-ingress
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
ingressClassName: traefik
rules:
- host: helloworld.localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: helloworld
port:
number: 8080Kubernetes の Ingress とは?
Kubernetes の Ingress は、クラスター内のサービスへの外部アクセス(通常は HTTP および HTTPS トラフィック)を管理する Kubernetes API オブジェクトです。受信接続を適切な内部サービスおよび Pod にルーティングするためのルールセットとして機能し、ロードバランシング、SSL/TLS 終端、名前ベースのバーチャルホスティングなどの機能を処理します。
これらのマニフェストファイルを使用してアプリケーションをデプロイできます
cd /home/splunk
# create the deployment
kubectl apply -f deployment.yaml
# create the service
kubectl apply -f service.yaml
# create the ingress
kubectl apply -f ingress.yamldeployment.apps/helloworld created
service/helloworld created
ingress.networking.k8s.io/helloworld-ingress createdアプリケーションをテストする #
以下のコマンドを使用してアプリケーションにアクセスします
curl http://helloworld.localhost/hello/KubernetesOpenTelemetry を設定する #
.NET OpenTelemetry 計装は既に Docker イメージに組み込まれています。しかし、データの送信先を指定するためにいくつかの環境変数を設定する必要があります。
先ほど作成した deployment.yaml ファイルに以下を追加します
重要 以下の YAML 内の
$INSTANCEをご自身のインスタンス名に置き換えてください。 インスタンス名はecho $INSTANCEを実行して確認できます。
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 の部分はご自身のインスタンス名に置き換えてください)
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: localhost:9999/helloworld:1.2
imagePullPolicy: Always
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" 以下のコマンドで変更を適用します
kubectl apply -f deployment.yamldeployment.apps/helloworld configured次に、以下のコマンドでトラフィックを生成します
curl http://helloworld.localhost/hello/Kubernetes1分ほどで、o11y cloud にトレースが流れ始めるはずです。しかし、トレースをすぐに確認したい場合は…
チャレンジ #
開発者としてトレース ID をすぐに取得したい場合やコンソールのフィードバックを確認したい場合、deployment.yaml ファイルにどの環境変数を追加すればよいでしょうか?
