このトピックでは、ACK Virtual Node を使用して、ACSコンピューティングパワーが使用されている ACK クラスタ内の仮想ノードにスケジュールされているポッドのみにサイドカーコンテナーを挿入する方法について説明します。これにより、可観測性とセキュリティに関連する機能を使用できるようになります。また、この方法を OpenKruise SidecarSet と併用して、カスタムサイドカーコンテナー挿入ルールを作成し、サイドカーコンテナーを個別に更新することもできます。
説明
ACK では、非仮想ノードに DaemonSet を作成して、可観測性エージェントまたはセキュリティエージェントをデプロイできます。ACS は仮想ノードを使用します。したがって、ACS を使用する場合は、これらのエージェントをサイドカーコンテナーにのみデプロイできます。OpenKruise を使用すると、仮想ノードにスケジュールされているポッドへのサイドカーコンテナーの挿入を簡素化できます。OpenKruise が提供する SidecarSet コントローラーは、アドミッション Webhook を活用して、ポッドの作成中に指定されたラベルに一致する各ポッドにサイドカーコンテナーを自動的に挿入します。SidecarSet は、仮想ノードにスケジュールされているポッドを識別できません。この場合、仮想ノードにスケジュールされているポッドのみにサイドカーコンテナーを挿入するには、ack-virtual-node をクラスターにインストールします。これにより、サイドカーコンテナーが仮想ノード上のビジネスコンテナーから分離されます。
概要
サイドカーコンテナー:ポッドにアタッチされた補助コンテナー。サイドカーコンテナーは、プライマリコンテナーの構成を変更することなく、ポッドのプライマリコンテナーの機能を強化または拡張するために使用されます。Alibaba Cloud Container Compute Service (ACS) クラスタでサイドカーコンテナーを構成する方法の詳細については、「説明」をご参照ください。
SidecarSet: Alibaba Cloud によって開発されたオープンソースのクラウドネイティブ アプリケーション自動化エンジンである OpenKruise によって提供される主要なコントローラー。このコントローラーは、ポッドの作成中に指定されたラベルに一致する各ポッドにサイドカーコンテナーを自動的に挿入できます。サイドカーコンテナーは、監視エージェントまたはロギングエージェントとして機能できます。このように、SidecarSet コントローラーは、サイドカーコンテナーのライフサイクル管理をビジネスコンテナーのライフサイクル管理から分離します。
ACS 仮想ノードの SidecarSet 使用上の注意
serverless.alibabacloud.com/virtual-node: "true"
ラベルを SidecarSet に追加して、仮想ノードにスケジュールされているポッドを選択できます。このラベルは、ポッドが仮想ノードにスケジュールされた後に、ポッドに自動的に追加されます。デフォルトでは、仮想ノードのデプロイにはエラスティックコンテナーインスタンスが優先的に使用されます。alibabacloud.com/compute-class: general-purpose
ラベルを使用して、指定されたコンピューティングクラスが割り当てられている ACS ポッドを選択できます。
DaemonSet によって作成されたキーコンテナーは、コンテナーの構成とパラメーターのために ConfigMap を参照する場合があります。DaemonSet のキーコンテナーをビジネスポッドに挿入した後、キーコンテナーによって参照される ConfigMap がビジネスポッドと同じ名前空間に存在しない場合があります。この場合、ConfigMap をボリュームとしてサイドカーコンテナーにマウントするときに、namespace/name
形式で ConfigMap 名を指定できます。名前空間をまたいで ConfigMap とシークレットを参照するには、最初に承認を完了する必要があります。詳細については、「SidecarSetResourceBinding」をご参照ください。
serverless.alibabacloud.com/virtual-node: "true"
ラベルは、ACK クラスタ内の仮想ノードで ACS コンピューティングパワーが使用されている場合にのみ必要です。ACS クラスタを使用する場合は、このラベルは必要ありません。
特定のポッドへのサイドカーコンテナーの挿入
デフォルトでは、SidecarSet は仮想ノードにスケジュールされているすべてのポッドにサイドカーコンテナーを挿入します。仮想ノードにスケジュールされている特定のポッドにサイドカーコンテナーをスケジュールする場合は、.spec.selector
パラメーターを変更します。次のコードブロックは例です。
apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: filebeat-sidecarset
spec:
containers:
...
selector:
matchLabels:
serverless.alibabacloud.com/virtual-node: "true"
alibabacloud.com/compute-class: general-purpose
app: nginx
パラメーター | 説明 |
パラメーター | 説明 |
serverless.alibabacloud.com/virtual-node | 必須。このパラメーターは、仮想ノードにスケジュールされているポッドを選択するために使用されるラベルを指定します。 |
alibabacloud.com/compute-class | オプション。SidecarSet を適用する仮想ノード上のポッドのコンピューティングクラスを指定する場合に必要です。コンピューティングクラスの詳細については、「コンピューティングクラス」をご参照ください。 |
app | オプション。指定されたアプリケーションにサイドカーコンテナーを挿入する場合は、このパラメーターを使用してカスタム値を指定できます。 |
SidecarSetResourceBinding
セキュリティ上の理由から、他の名前空間の ConfigMap とシークレットをボリュームとしてサイドカーコンテナーにマウントする場合は、SidecarSetResourceBinding を作成して、SidecarSet が ConfigMap とシークレットにアクセスすることを明示的に承認する必要があります。
SidecarSetResourceBinding は、ConfigMap とシークレットに対して次の操作を実行するための権限のみを付与します:取得、一覧表示、および監視。
# filebeat-sidecarset SidecarSet に一致するポッドに、kube-system 名前空間の filebeat-config ConfigMap へのアクセスを承認します。
apiVersion: sidecarset.alibabacloud.com/v1alpha1
kind: SidecarSetResourceBinding
metadata:
name: filebeat-sidecarset-resourcebinding
namespace: kube-system # SidecarSetResourceBinding は、kube-system 名前空間のリソースに対する権限のみを付与します。
spec:
subjects:
- kind: SidecarSet
name: filebeat-sidecarset
resourceRefs:
- kind: ConfigMap
name: filebeat-config
- kind: Secret
name: elasticsearch-master-certs
コンテナーの起動と終了の優先順位、およびジョブによって作成されたポッド
サイドカーコンテナーには、通常、次の要件があります。
サイドカーコンテナーは、ビジネスコンテナーよりも早く起動し、ビジネスコンテナーよりも遅く終了する必要があります。
ジョブによって作成されたポッドの場合、サイドカーコンテナーは、ビジネスコンテナーの終了後に積極的に終了する必要があります。
ACS シナリオでこの目標を達成するには、サイドカーコンテナーの構成で環境変数 __IS_SIDECAR__="true"
を指定できます。詳細については、「サイドカーコンテナーの起動と終了の優先順位を指定する」をご参照ください。
サイドカーコンテナーの更新
ポッドに挿入した後、サイドカーコンテナーを更新する必要がある場合があります。OpenKruise が提供する ホットサイドカー更新 機能を使用して、ビジネスポッドの可用性に影響を与えることなく、サイドカーコンテナーをシームレスに更新できます。この機能は仮想ノードと互換性があります。
前提条件
ACK Pro マネージドクラスター、ACK 専用クラスター、または ACK Serverless Pro クラスター が作成されており、クラスターの Kubernetes バージョンが 1.22 以降であること。詳細については、「ACK マネージドクラスターを作成する」、「ACK 専用クラスターを作成する」、または「ACK Serverless クラスターを作成する」をご参照ください。
ACK 仮想ノードコンポーネントがインストールされており、コンポーネントのバージョンが 2.13.0 以降であること。詳細については、「ACK Virtual Node」をご参照ください。
ack-kruise 1.3.0 以降がインストールされていること。詳細については、「ack-kruise」をご参照ください。
SidecarSetServerlessPod=true
機能ゲートが有効になっていること。kube-apiserver の [featuregates] パラメーターでSidecarSetServerlessPod=true
を指定します。詳細については、「コントロールプレーンコンポーネントのパラメーターをカスタマイズする」をご参照ください。
例
次の例では、filebeat がサイドカーコンテナーにデプロイされ、NGINX アプリケーションポッドに挿入されます。
ConfigMap をデプロイします。
構成ファイルは、kube-system 名前空間の ConfigMap です。この例では、構成ファイルはサイドカーコンテナーにマウントされ、出力されます。関連する変数は有効にならないため、置き換える必要はありません。
configmap.yaml という名前のファイルを作成し、次の YAML テンプレートをコピーします。
apiVersion: v1 data: filebeat.yml: | filebeat.inputs: - type: log paths: - /var/log/* - /stdout/* output.elasticsearch: host: '${NODE_NAME}' hosts: '["https://${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}"]' username: '${ELASTICSEARCH_USERNAME}' password: '${ELASTICSEARCH_PASSWORD}' protocol: https ssl.certificate_authorities: [ "/usr/share/filebeat/certs/ca.crt" ] kind: ConfigMap metadata: name: filebeat-config namespace: kube-system
次のコマンドを実行して、ConfigMap を作成します。
kubectl apply -f configmap.yaml
filebeat コンテナーを挿入するために使用される SidecarSet をデプロイします。
この例では、filebeat コンテナーは、ビジネスコンテナーからのテキストログと stdout の両方を収集します。
sidecarset.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
次のコマンドを実行して、SidecarSet を作成します。
kubectl apply -f sidecarset.yaml
filebeat コンテナーに kube-system 名前空間の ConfigMap へのアクセスを承認します。
アプリケーションポッドはデフォルトの名前空間にデプロイされます。filebeat コンテナーに別の名前空間の ConfigMap へのアクセスを明示的に承認する必要があります。
policy.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: sidecarset.alibabacloud.com/v1alpha1 kind: SidecarSetResourceBinding metadata: name: filebeat-sidecarset-resourcebinding namespace: kube-system # SidecarSetResourceBinding は、kube-system 名前空間のリソースに対する権限のみを付与します。 spec: subjects: - kind: SidecarSet name: filebeat-sidecarset resourceRefs: - kind: ConfigMap name: filebeat-config - kind: Secret name: elasticsearch-master-certs
次のコマンドを実行して、SidecarSetResourceBinding を作成します。
kubectl apply -f policy.yaml
次のテンプレートを使用して NGINX アプリケーションポッドをデプロイします。詳細については、「デプロイメントを使用してステートレスアプリケーションを作成する」をご参照ください。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default spec: containers: - name: nginx image: mirrors-ssl.aliyuncs.com/nginx:latest resources: limits: cpu: "1" memory: 200Mi requests: cpu: 100m memory: 100Mi volumeMounts: # volumeMount を介してログディレクトリを filebeat サイドカーコンテナーと共有します - mountPath: /var/log/nginx name: varlog volumes: - name: varlog emptyDir: {} nodeSelector: type: virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Equal value: alibabacloud effect: NoSchedule
次のコマンドを実行して、アプリケーションポッドをクエリします。
kubectl get pods nginx-785d5xxxxx-xxxxx
予期される出力:
NAME READY STATUS RESTARTS AGE nginx-785d5xxxxx-xxxxx 2/2 Running 0 10m
出力は、ポッドで 2 つのコンテナーが実行されていることを示しています。これは、挿入が成功したことを意味します。
アプリケーションポッドのテキストログと stdout が filebeat コンテナーにマウントされていることを確認します。
次のコマンドを実行して、filebeat コンテナーにログインします。
kubectl exec -it deploy/nginx -c filebeat -- /bin/bash
filebeat コンテナーのエラーログを表示します。
cat /var/log/error.log
予期される出力:
2024/11/08 07:20:54 [notice] 1#1: using the "epoll" event method 2024/11/08 07:20:54 [notice] 1#1: nginx/1.27.2 2024/11/08 07:20:54 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 2024/11/08 07:20:54 [notice] 1#1: OS: Linux 5.10.134-17.2.1.lifsea8.x86_64 2024/11/08 07:20:54 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2024/11/08 07:20:54 [notice] 1#1: start worker processes 2024/11/08 07:20:54 [notice] 1#1: start worker process 29
filebeat コンテナーの stdout を表示します。
cat /stdout/nginx/0.log
予期される出力:
2024-11-08T15:20:53.99215101+08:00 stdout F /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 2024-11-08T15:20:53.992173978+08:00 stdout F /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ 2024-11-08T15:20:54.003081339+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 2024-11-08T15:20:54.085010761+08:00 stdout F 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 2024-11-08T15:20:54.276107913+08:00 stdout F 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf 2024-11-08T15:20:54.276263126+08:00 stdout F /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh 2024-11-08T15:20:54.276842182+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh 2024-11-08T15:20:54.345892283+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh 2024-11-08T15:20:54.347524813+08:00 stdout F /docker-entrypoint.sh: Configuration complete; ready for start up
別の名前空間の filebeat-config ConfigMap が filebeat コンテナーにマウントされていることを確認します。
kubectl exec deploy/nginx -c filebeat -- cat /usr/share/filebeat/filebeat.yml
予期される出力:
filebeat.inputs: - type: log paths: - /var/log/* - /stdout/* output.elasticsearch: host: '${NODE_NAME}' hosts: '["https://${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}"]' username: '${ELASTICSEARCH_USERNAME}' password: '${ELASTICSEARCH_PASSWORD}' protocol: https ssl.certificate_authorities: [ "/usr/share/filebeat/certs/ca.crt" ]
出力は、別の名前空間の filebeat-config ConfigMap が filebeat コンテナーにマウントされていることを示しています。