このトピックでは、ACS 計算能力を使用する Alibaba Cloud Container Service for Kubernetes (ACK) クラスターで ACK Virtual Node コンポーネントの拡張機能を使用して、仮想ノードにスケジュールされる Pod に Sidecar コンテナーを自動的にインジェクトする方法について説明します。このメソッドを使用すると、可観測性やセキュリティなどの機能を実装できます。また、このメソッドを OpenKruise SidecarSet と併用して、Sidecar インジェクションルールをカスタマイズし、Sidecar コンテナーを独立して更新することもできます。
機能紹介
ACK では、DaemonSet を使用して物理ノードに可観測性およびセキュリティ用のエージェントをデプロイできます。ただし、仮想ノードは Sidecar モードでのみエージェントのデプロイをサポートします。仮想ノードに明示的にスケジュールされる Pod の場合、OpenKruise を使用して Sidecar のインジェクションを簡素化できます。OpenKruise SidecarSet は、アドミッション Webhook を使用して、Pod の作成中にターゲットラベルに一致するすべての Pod に Sidecar コンテナーをインジェクトします。ただし、スケジューリング前に Pod が仮想ノードにスケジュールされるかどうかを判断できない場合、SidecarSet は仮想ノード上の Pod のみをターゲットにするように構成できません。これを解決するために、ACK Virtual Node コンポーネントを使用して、仮想ノードにスケジュールされる Pod にのみ Sidecar コンテナーを自動的にインジェクトできます。これにより、Pod 内のアプリケーションコンテナーから Sidecar コンテナーが分離されます。
用語
Sidecar コンテナー: メインコンテナーを変更せずに、メインコンテナーの機能を拡張または強化するために Pod に追加されるコンテナー。ACS クラスターで Sidecar コンテナーを構成する方法の詳細については、「特徴」をご参照ください。
SidecarSet: Alibaba Cloud のオープンソースのクラウドネイティブアプリケーション自動化エンジンである OpenKruise のコア機能です。SidecarSet を使用して、クラスターで作成された対象の Pod に Sidecar コンテナーを自動的にインジェクトできます。これにより、モニタリングエージェントやログエージェントなどの Sidecar コンテナーの定義とライフサイクルが、アプリケーションコンテナーから分離されます。
ACS 仮想ノードでの SidecarSet の使用
SidecarSet では、serverless.alibabacloud.com/virtual-node: "true" ラベルを追加して、仮想ノードにスケジュールされたすべての Pod に一致させることができます。このラベルは、Pod が仮想ノードにスケジュールされることが確認された後に追加されます。デフォルトでは、Elastic Container Instance (ECI) インスタンスが優先されます。alibabacloud.com/compute-class: general-purpose を構成して、ACS インスタンスタイプの Pod に一致させることもできます。
DaemonSet のコアコンテナーは、その構成パラメーターを ConfigMap に依存することがよくあります。DaemonSet のコアコンテナーがアプリケーション Pod にインジェクトされると、アプリケーション Pod と ConfigMap は異なる名前空間にあることがよくあります。この場合、namespace/name フォーマットを使用して、Sidecar コンテナーボリューム内の別の名前空間から ConfigMap を参照できます。名前空間をまたいで ConfigMap または Secret にアクセスするには、権限付与が必要です。詳細については、「SidecarSetResourceBinding」をご参照ください。
ACK クラスターの仮想ノードを介して ACS 計算能力を使用する場合にのみ、serverless.alibabacloud.com/virtual-node: "true" ラベルを構成する必要があります。ACS クラスターを使用する場合、追加の構成は必要ありません。
特定の種類の Pod にのみ Sidecar をインジェクトする
デフォルトでは、前述の SidecarSet は、仮想ノードにスケジュールされるすべての Pod に Sidecar コンテナーをインジェクトします。仮想ノード上の特定の Pod にのみ Sidecar コンテナーをインジェクトする場合は、.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 | 必須。仮想ノードにスケジュールされたすべての Pod に一致します。 |
alibabacloud.com/compute-class | オプション。ACS タイプの仮想ノードにのみ Pod をスケジュールする場合に必要です。compute-class の詳細については、「計算タイプの定義」をご参照ください。 |
app | オプション。特定のアプリケーションにのみ Sidecar をインジェクトする場合にカスタムラベルを構成します。 |
SidecarSetResourceBinding
セキュリティ上の理由から、Sidecar コンテナーボリューム内の他の名前空間から ConfigMap または Secret を参照するには、SidecarSetResourceBinding を使用して明示的に権限を付与する必要があります。
この権限付与では、ConfigMap と Secret に対する読み取り専用 (Get、List、および Watch) 権限のみが付与されます。
# filebeat-sidecarset に権限を付与します。SidecarSet に一致する Pod は、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コンテナーの起動と終了の順序、および Job Pod
Sidecar コンテナーには、多くの場合、次の 2 つの要件があります。
Sidecar コンテナーは、アプリケーションコンテナーの前に起動し、アプリケーションコンテナーの後に終了する必要があります。
Job Pod の場合、Sidecar コンテナーは、アプリケーションコンテナーが終了した後にアクティブに終了する必要があります。
ACS シナリオでは、Sidecar コンテナーに環境変数 __IS_SIDECAR__="true" を設定して、これらの要件を満たすことができます。詳細については、「Sidecar コンテナーの起動とシャットダウンの順序を構成する」をご参照ください。
Sidecar コンテナーのアップグレード
Sidecar コンテナーをデプロイした後、Sidecar コンテナーのアップグレードなど、運用およびメンテナンス (O&M) の要件が発生する場合があります。OpenKruise の Sidecar ホットアップグレード機能を使用できます。この機能を使用すると、Pod の可用性に影響を与えることなく Sidecar コンテナーをシームレスにアップグレードでき、仮想ノード方式と完全に互換性があります。
範囲
この機能は、汎用および計算最適化インスタンス計算タイプの CPU Pod でのみサポートされます。
前提条件
ACK マネージドクラスター Pro、ACK 専用クラスター、または ACK Serverless クラスター Pro が作成されていること。クラスターのバージョンは 1.22 以降である必要があります。詳細については、「ACK マネージドクラスターの作成」、「ACK 専用クラスターの作成 (このタイプの新しいクラスターは作成できなくなりました)」、または「ACK Serverless クラスターの作成」をご参照ください。
ACK Virtual Node コンポーネントがインストールされていること。コンポーネントのバージョンは v2.13.0 以降である必要があります。詳細については、「ACK Virtual Node」をご参照ください。
ack-kruise コンポーネントがインストールされていること。コンポーネントのバージョンは v1.3.0 以降である必要があります。詳細については、「ack-kruise」をご参照ください。
SidecarSetServerlessPod=true機能ゲートが有効になっていること。詳細については、「コントロールプレーンコンポーネントのパラメーターのカスタマイズ」をご参照ください。Kube API Server コンポーネントの [featureGates] でSidecarSetServerlessPod=trueを設定できます。
例
次の例は、filebeat コンテナーを Sidecar コンテナーとして nginx アプリケーション Pod にインジェクトする完全なプロセスを示しています。
ConfigMap をデプロイします。
説明この構成ファイルは、kube-system 名前空間の ConfigMap です。この例では、構成ファイルを Sidecar コンテナーにマウントして内容を出力するだけです。関連する変数は有効にならず、置き換える必要もありません。
次の内容で configmap.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 コンテナーは、アプリケーションコンテナーのファイルログと標準出力の両方を収集します。
次の内容で sidecarset.yaml という名前のファイルを作成します。
次のコマンドを実行して SidecarSet をデプロイします。
kubectl apply -f sidecarset.yaml
filebeat コンテナーに kube-system 名前空間の ConfigMap へのアクセス権を付与します。
説明アプリケーション Pod はデフォルトの名前空間にあるため、インジェクトされた 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 アプリケーション Pod をデプロイします。詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。
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次のコマンドを実行して、アプリケーション Pod を表示します。
kubectl get pods nginx-785d5xxxxx-xxxxx予期される出力:
NAME READY STATUS RESTARTS AGE nginx-785d5xxxxx-xxxxx 2/2 Running 0 10m出力は、Pod に 2 つのコンテナーが含まれていることを示しています。これは、インジェクションが成功したことを示します。
filebeat コンテナーがアプリケーション Pod のファイルログと標準出力ログをマウントしたことを確認します。
次のコマンドを実行して filebeat コンテナーにアクセスします。
kubectl exec -it deploy/nginx -c filebeat -- /bin/bashコンテナー内のエラーログを表示します。
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コンテナー内の標準出力ログを表示します。
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 コンテナーが名前空間をまたぐ構成ファイル filebeat-config をマウントしたことを確認します。
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" ]この出力は、ファイルが正しくマウントされていることを示します。