ロギング¶
Kubernetesログを中央ディレクトリに収集するには、ログプロセッサおよびフォワーダーであるFluent Bitを使用できます。これはKnativeの実行には必須ではありませんが、自動的にPodと関連ログを削除するKnative Servingで役立ちます。
Fluent Bitは、多数の他のログプロバイダーへのエクスポートをサポートしています。すでにSplunk、Datadog、ElasticSearch、またはStackdriverなどの既存のログプロバイダーがある場合は、FluentBitドキュメントに従ってログフォワーダーを構成できます。
ロギングコンポーネントの設定¶
ログ収集の設定には2つの手順が必要です。
- 各ノードでログ転送DaemonSetを実行します。
- クラスター内のどこかでコレクターを実行します。
ヒント
次の例では、Kubernetes PersistentVolumeClaimにログを保存するStatefulSetを使用していますが、HostPathを使用することもできます。
コレクターの設定¶
fluent-bit-collector.yaml
ファイルは、StatefulSetと、クラスター内からのログへのアクセスと読み取りを可能にするKubernetes Serviceを定義します。提供された構成は、logging
という名前空間に監視構成を作成します。
重要
フォワーダーの前にコレクターを設定してください。フォワーダーを構成するときにコレクターのアドレスが必要になり、フォワーダーはコレクターの準備が整うまでログをキューに入れる可能性があります。
手順¶
-
次のコマンドを入力して構成を適用します。
デフォルトの構成では、ログは次のように分類されます。kubectl apply -f https://github.com/knative/docs/raw/main/docs/serving/observability/logging/fluent-bit-collector.yaml
- Knativeサービス、または
app=Knative
ラベルが付いたPod。 - 非Knativeアプリ。
注
ログはデフォルトでPod名でロギングされます。これは、インストール前またはインストール後に
log-collector-config
ConfigMapを更新することで変更できます。警告
ConfigMapを更新したら、Fluent Bitを再起動する必要があります。これは、Podを削除してStatefulSetに再作成させることで実行できます。
- Knativeサービス、または
-
Webブラウザーからログにアクセスするには、次のコマンドを入力します。
kubectl port-forward --namespace logging service/log-collector 8080:80
-
http://localhost:8080/
に移動します。 -
オプション:
nginx
Podでシェルを開き、次のコマンドを入力してUnixツールを使用してログを検索できます。kubectl exec --namespace logging --stdin --tty --container nginx log-collector-0
フォワーダーの設定¶
デフォルトでログをElasticSearchに転送するFluent Bit DaemonSetの設定については、Fluent Bitドキュメントを参照してください。
インストール手順中にConfigMapを作成する場合は、次のいずれかを行う必要があります。
- ElasticSearch構成を
fluent-bit-configmap.yaml
に置き換えるか、 -
次のブロックをConfigMapに追加し、
@INCLUDE output-elasticsearch.conf
を@INCLUDE output-forward.conf
に更新します。output-forward.conf: | [OUTPUT] Name forward Host log-collector.logging Port 24224 Require_ack_response True
ローカルコレクターの設定¶
警告
この手順では、開発環境の設定について説明しており、実稼働環境での使用には適していません。
開発にローカルKubernetesクラスターを使用している場合は、デスクトップオペレーティングシステムにログを保存するためのhostPath
PersistentVolumeを作成できます。これにより、Kubernetes固有のツールを必要とせずに、通常のデスクトップツールをファイルに使用できます。
PersistentVolumeClaim
は次のようになります。
apiVersion: v1
kind: PersistentVolume
metadata:
name: shared-logs
labels:
app: logs-collector
spec:
accessModes:
- "ReadWriteOnce"
storageClassName: manual
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: logs-log-collector-0
namespace: logging
capacity:
storage: 5Gi
hostPath:
path: <see below>
注
hostPath
は、Kubernetesソフトウェアとホストオペレーティングシステムによって異なります。
次の例に示すように、StatefulSetのvolumeClaimTemplates
を更新して、shared-logs
ボリュームを参照する必要があります。
volumeClaimTemplates:
metadata:
name: logs
spec:
accessModes: ["ReadWriteOnce"]
volumeName: shared-logs
Kind¶
クラスターを作成するときは、次の例に示すように、kind-config.yaml
を使用し、各ノードにextraMounts
を指定する必要があります。
apiversion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraMounts:
- hostPath: ./logs
containerPath: /shared/logs
- role: worker
extraMounts:
- hostPath: ./logs
containerPath: /shared/logs
次に、PersistentVolumeのspec.hostPath.path
として/shared/logs
を使用できます。ディレクトリパス./logs
は、Kindクラスターが作成されたディレクトリからの相対パスであることに注意してください。
Docker Desktop¶
Docker Desktopは、ホストオペレーティングシステムとゲストオペレーティングシステムの間でいくつかの共有マウントを自動的に作成するため、ホームディレクトリへのパスのみを知っておく必要があります。以下は、異なるオペレーティングシステムの例です。
ホストOS | hostPath |
---|---|
Mac OS | /Users/${USER} |
Windows | /run/desktop/mnt/host/c/Users/${USER}/ |
Linux | /home/${USER} |
Minikube¶
Minikubeでは、Kubernetesを実行している仮想マシン(VM)にディレクトリをマウントするために明示的なコマンドが必要です。
次のコマンドは、現在のディレクトリ内のlogs
ディレクトリをVM内の/mnt/logs
にマウントします。
minikube mount ./logs:/mnt/logs
また、PersistentVolumeのhostPath.path
として/mnt/logs
を参照する必要があります。