このトピックでは、Container Service for Kubernetes (ACK) Serverless クラスターで Simple Log Service のカスタムリソース定義 (CRD) を使用してログ収集を設定し、コンテナーログの自動収集を実装する方法について説明します。
背景情報
Simple Log Service は、エンドツーエンドのデータロギングサービスです。Simple Log Service を使用すると、追加の開発を行うことなく、ログデータの収集、消費、配信、クエリ、分析ができます。詳細については、「Simple Log Service とは」をご参照ください。
前提条件
ACK Serverless クラスターで Simple Log Service が有効化されていること。Simple Log Service コンソールにログインします。クラスターで Simple Log Service が有効化されていない場合は、画面の指示に従ってサービスを有効化するように求められます。
使用上の注意
Simple Log Service CRD を使用して有効化されたログ収集機能は、CRD の作成後に作成された Elastic Container Instance Pod に対してのみ有効です。既存の Pod のログを収集する場合は、既存の Pod のローリングリリースを実行する必要があります。
ログ収集の設定
クラスターに alibaba-log-controller コンポーネントをデプロイした後、AliyunLogConfig CRD (ログ収集設定用の CRD) を使用してログ収集を設定できます。
クラスターに alibaba-log-controller コンポーネントをデプロイする
ACK コンソールにログインします。
上部のナビゲーションバーで、リージョンを選択します。
[クラスター] ページで、コンテナーログを収集する ACK Serverless クラスターの名前をクリックして、クラスターの管理ページに移動します。
クラスターに alibaba-log-controller コンポーネントをデプロイします。
詳細ページの左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。
[ログとモニタリング] タブをクリックし、[Alibaba-log-controller] コンポーネントのカードを見つけて、[インストール] をクリックします。
表示されるメッセージで、[OK] をクリックします。
alibaba-log-controller がインストールされると、[alibaba-log-controller] のカードの右上に「インストール済み」の文字が表示されます。
AliyunLogConfig CRD の作成
ACK Serverless クラスターに接続します。
AliyunLogConfig CRD の YAML 構成ファイルをコンパイルします。
重要 AliyunLogConfig CRD を作成すると、生成された Logstore と Logtail 構成を Simple Log Service コンソールで表示できます。CRD を使用して Logtail 構成を作成し、Simple Log Service コンソールで構成を変更した場合、その変更は CRD に同期されません。Logtail 構成を更新する場合は、AliyunLogConfig CRD リソースを変更してください。構成の不整合を防ぐため、Simple Log Service コンソールで操作を実行しないでください。
AliyunLogConfig CRD YAML テンプレート
apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
name: simple-stdout-example
spec:
project: k8s-my-project
logstore: k8s-stdout
logstoreMode: standard
shardCount: 2
lifeCycle: 90
logtailConfig:
inputType: plugin
configName: simple-stdout-example
inputDetail:
...
基本パラメーター
パラメーター | タイプ | 必須 | 説明 |
project | string | いいえ | プロジェクトの名前。デフォルト値は、Logtail コンポーネントのインストールに使用するプロジェクトの名前です。 プロジェクトを作成する場合は、プロジェクトの名前を指定します。プロジェクトが存在しない場合、システムは自動的にプロジェクトを作成します。 |
logstore | string | はい | Logstore の名前。指定した Logstore が存在しない場合、システムは自動的に Logstore を作成します。 |
logstoreMode | string | いいえ | Logstore のタイプ。このパラメーターは、Logstore を作成する場合にのみ有効です。有効な値: query: クエリ用の Logstore standard: 標準 Logstore
詳細については、「Logstore の管理」をご参照ください。 |
shardCount | int | いいえ | シャードの数。有効な値: 1~10。デフォルト値: 2。 |
lifeCycle | int | いいえ | Logstore 内のデータの保持期間。有効な値: 1~3650。デフォルト値: 90。単位: 日。値 3650 は、データが Logstore に永続的に保存されることを指定します。このパラメーターは、Logstore を作成する場合にのみ有効です。 |
machineGroups | array | いいえ | マシングループ。Logtail コンポーネントをインストールすると、Simple Log Service は自動的に k8s-group-${your_k8s_cluster_id} という名前のマシングループを作成します。 |
logtailConfig | object | はい | Logtail 構成。この構成には次のパラメーターが含まれます: configName: Logtail 構成の名前。名前は metadata.name で指定された名前と同じである必要があります。 inputType: ログ入力のタイプ。有効な値: inputDetail: ログ入力の構成。 outputType: ログ出力のタイプ。値を LogService に設定します。ログは Simple Log Service にのみアップロードできます。 outputDetail: ログ出力の構成。 logSample: サンプルログ。
パラメーター設定の詳細については、「Logtail 構成」をご参照ください。 |
コンテナーのフィルタリング
v1.0.34 より前の Logtail を使用している場合、環境変数とコンテナーラベルを使用してのみコンテナーをフィルタリングできます。
Kubernetes クラスターの名前空間と Kubernetes クラスター内のコンテナーの名前は、コンテナーラベルにマッピングできます。名前空間のラベル名の値は io.kubernetes.pod.namespace です。コンテナー名のラベル名の値は io.kubernetes.container.name です。これら 2 つのコンテナーラベルを使用してコンテナーをフィルタリングすることをお勧めします。コンテナーラベルがビジネス要件を満たさない場合は、環境変数のホワイトリストまたは環境変数のブラックリストを使用してコンテナーをフィルタリングできます。
Logtail 1.0.34 以降のバージョンを使用している場合、Pod 名、名前空間、コンテナー名、コンテナーラベルなどの Kubernetes レベルの情報に基づいてコンテナーをフィルタリングできます。
コンテナーフィルタリングパラメーターは、logtailConfig.inputDetail.advanced.k8s フィールドで設定する必要があります。サポートされているパラメーター:
IncludeK8sLabel: データを収集するコンテナーを指定する Kubernetes ラベルのホワイトリスト。
ExcludeK8sLabel: データを収集しないコンテナーを指定する Kubernetes ラベルのブラックリスト。
K8sNamespaceRegex: 名前空間。
K8sPodRegex: Pod の名前。
K8sContainerRegex: コンテナー名。
詳細については、「DaemonSet モードで Kubernetes コンテナーからテキストログを収集する」および「DaemonSet モードで Kubernetes コンテナーから stdout と stderr を収集する (旧バージョン)」をご参照ください。
AliyunLogConfig CRD のサンプル YAML 構成ファイル
テキストログの収集に使用される CRD のサンプル YAML 構成ファイル
log-file.yaml という名前のファイルを作成し、次のテンプレートをファイルにコピーします。
apiVersion: log.alibabacloud.com/v1alpha1 # デフォルト値を使用します。このパラメーターを変更する必要はありません。
kind: AliyunLogConfig # デフォルト値を使用します。このパラメーターを変更する必要はありません。
metadata:
name: test-file # リソース名。現在の Kubernetes クラスター内で一意である必要があります。
spec:
project: k8s-log-c326bc86**** # オプション。プロジェクト名。プロジェクトが存在しない場合、システムは自動的にプロジェクトを作成します。
logstore: test-file # 必須。Logstore 名。Logstore が存在しない場合、システムは自動的に Logstore を作成します。
logtailConfig: # Logtail 構成。
inputType: file # データソースのタイプ。値 file はテキストログを指定し、値 plugin は stdout ログを指定します。
configName: test-file # Logtail 構成の名前。名前は metadata.name で指定されたリソース名と同じである必要があります。
inputDetail: # Logtail 構成の詳細。
logType: common_reg_log # シンプルモードでテキストログを収集します。
logPath: /log/ # ログファイルのパス。
filePattern: "*.log" # ログファイルの名前。名前にアスタリスク (*) と疑問符 (?) を含めることができます。例: log_*.log。
dockerFile: true # Docker コンテナーからログを収集するかどうかを指定します。
advanced: # コンテナーのフィルター条件を設定します。
k8s:
K8sNamespaceRegex: ^(default)$
K8sPodRegex: '^(eci-sls-demo.*)$'
stdout ログの収集に使用される CRD のサンプル YAML 構成ファイル
log-stdout.yaml という名前のファイルを作成し、次のテンプレートをファイルにコピーします。
apiVersion: log.alibabacloud.com/v1alpha1 # デフォルト値を使用します。このパラメーターを変更する必要はありません。
kind: AliyunLogConfig # デフォルト値を使用します。このパラメーターを変更する必要はありません。
metadata:
name: test-stdout # リソース名。現在の Kubernetes クラスター内で一意である必要があります。
spec:
project: k8s-log-c326bc86**** # オプション。プロジェクト名。プロジェクトが存在しない場合、システムは自動的にプロジェクトを作成します。
logstore: test-stdout # 必須。Logstore 名。Logstore が存在しない場合、システムは自動的に Logstore を作成します。
shardCount: 2 # オプション。シャードの数。デフォルト値: 2。有効な値: 1、2、3、4、5、6、7、8、9、10。
lifeCycle: 90 # オプション。Logstore 内のログの保持期間。このパラメーターは、Logstore を作成する場合にのみ有効です。有効な値: 1~3650。デフォルト値: 90。単位: 日。値 3650 は、ログが永続的に予約されることを示します。
logtailConfig: # Logtail 構成。
inputType: plugin # データソースのタイプ。値 file はテキストログを指定し、値 plugin は stdout ログを指定します。
configName: test-stdout # Logtail 構成の名前。名前は metadata.name で指定されたリソース名と同じである必要があります。
inputDetail: # Logtail 構成の詳細。
plugin:
inputs:
- type: service_docker_stdout
detail:
Stdout: true
Stderr: true
# IncludeEnv:
# aliyun_logs_test-stdout: "stdout"
AliyunLogConfig CRD を作成します。
次のコードはサンプルコマンドです。Logtail 構成が適用されると、Logtail は各コンテナーから stdout またはテキストログを収集し、収集したログを Simple Log Service に送信します。
kubectl apply -f log-file.yaml
kubectl apply -f log-stdout.yaml
重要 ログが収集された後、インデックスを作成する必要があります。その後、Logstore でログをクエリおよび分析できます。詳細については、「インデックスの作成」をご参照ください。
ログ収集のテスト
AliyunLogConfig CRD を作成すると、Simple Log Service は後で作成される Pod のログを自動的に収集します。次のアプリケーションを作成して、ログ収集の効果をテストできます。
アプリケーションを作成します。
次のサンプル YAML ファイルは、Deployment の作成方法を説明しています。この例では、コンテナーの起動後に関連コマンドを実行して、stdout とログファイルを継続的に表示します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-sls-demo
labels:
app: sls
spec:
replicas: 1
selector:
matchLabels:
app: sls
template:
metadata:
name: sls-test
labels:
app: sls
alibabacloud.com/eci: "true"
spec:
containers:
- args:
- -c
- mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;done
command:
- /bin/sh
image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/busybox:1.30
imagePullPolicy: Always
name: busybox
test-sls-crd.yaml という名前のファイルを作成し、上記の YAML ファイルテンプレートをファイルにコピーします。次のコマンドを実行してアプリケーションを作成します:
kubectl create -f test-sls-crd.yaml
アプリケーションのステータスを確認します。
kubetcl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE
eci-sls-demo-7bf8849b9f-cgpbn 1/1 Running 0 2m14s
ログを表示します。
Simple Log Service コンソールにログインします。
プロジェクトの名前をクリックします。
コンテナーのログが保存されている Logstore を見つけます。Logstore の名前をクリックしてログを表示します。
テキストログの収集

stdout ログの収集

ログ収集の無効化
AliyunLogConfig CRD を作成すると、システムは条件を満たすすべての Pod のログを自動的に収集します。特定の Pod のログを収集したくない場合は、Pod の metadata セクションに k8s.aliyun.com/eci-sls-enable: "false" アノテーションを追加してログ収集を無効にできます。これにより、Logtail 構成の自動作成によるリソースの浪費を防ぎます。
重要 アノテーションは、Pod の構成ファイルの metadata に追加する必要があります。たとえば、Deployment を作成する場合、spec.template.metadata セクションにアノテーションを追加する必要があります。
Elastic Container Instance 関連のアノテーションは、Pod の作成時にのみ適用されます。既存の Pod にこれらのアノテーションを追加または変更しても効果はありません。
サンプル構成:
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-sls-demo2
labels:
app: sls
spec:
replicas: 1
selector:
matchLabels:
app: sls
template:
metadata:
name: sls-test
labels:
app: sls
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-sls-enable: "false" # ログ収集を無効にします。
spec:
containers:
- args:
- -c
- mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;
done
command:
- /bin/sh
image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
imagePullPolicy: Always
name: busybox