仮想ノードは DaemonSet をサポートしていないため、可観測性エージェントやセキュリティエージェントは、各 Pod 内でサイドカーコンテナーとして実行する必要があります。ACK Virtual Node コンポーネントは OpenKruise SidecarSet と連携し、仮想ノードにスケジュールされた Pod にサイドカーコンテナーを自動的にインジェクトします。これにより、サイドカーのライフサイクル管理がアプリケーションコンテナーから分離されます。
サイドカーインジェクションの仕組み
物理ノードでは、DaemonSet を通じてモニタリングエージェントやセキュリティエージェントをデプロイします。仮想ノードは DaemonSet をサポートしていないため、エージェントはサイドカーコンテナーとして実行する必要があります。
OpenKruise SidecarSet は、admission Webhook を使用して、作成時に指定されたラベルに一致する Pod にサイドカーコンテナーをインジェクトします。しかし、スケジューリングの決定後まで Pod のスケジューリングターゲットが不明な場合、SidecarSet 単体では物理ノード向けの Pod と仮想ノード向けの Pod を区別できません。
ACK Virtual Node コンポーネントは、Pod が仮想ノードにスケジュールされることが確認された後、Pod に serverless.alibabacloud.com/virtual-node: "true" というラベルを追加することでこの問題を解決します。デフォルトでは、Elastic Container Instance (ECI) インスタンスが優先されます。その後、SidecarSet はこのラベルに一致させ、仮想ノードの Pod にのみサイドカーコンテナーをインジェクトします。
ACK クラスターで仮想ノードを介してコンピューティング能力を使用する場合にのみ、serverless.alibabacloud.com/virtual-node: "true" ラベルを設定してください。ACK クラスターを直接使用する場合は、追加の設定は不要です。
サポートされるコンピューティングタイプ
この機能は、以下のコンピューティングタイプの 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フィーチャーゲートが有効になっていること。Kubernetes API サーバーコンポーネントの featureGates でSidecarSetServerlessPod=trueを設定します。詳細については、「コントロールプレーンコンポーネントのパラメーターのカスタマイズ」をご参照ください。
セレクターラベルによる特定の Pod のターゲティング
デフォルトでは、仮想ノードのラベルを使用する SidecarSet は、仮想ノードにスケジュールされたすべての Pod にサイドカーコンテナーをインジェクトします。特定の Pod をターゲットにするには、.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 | いいえ | 特定のコンピューティングタイプ (例:general-purpose) の Pod にインジェクションを制限します。詳細については、「コンピューティングタイプの定義」をご参照ください。 |
カスタムラベル (例:app) | いいえ | 特定のアプリケーションラベルを持つ Pod にインジェクションを制限します。 |
SidecarSetResourceBinding による名前空間をまたがるリソースへのアクセス
サイドカーコンテナーは、その構成のために ConfigMap や Secret に依存することがよくあります。サイドカーが異なる名前空間の Pod にインジェクトされると、デフォルトでは Pod はサイドカーの元の名前空間にあるリソースにアクセスできません。
別の名前空間から ConfigMap または Secret を参照するには、SidecarSet のボリューム定義で namespace/name 形式を使用します。次に、SidecarSetResourceBinding を作成して、名前空間をまたがるアクセスを許可します。
SidecarSetResourceBinding は、指定された ConfigMap および Secret リソースに対して読み取り専用 (Get、List、Watch) 権限のみを付与します。このバインディングは、自身の名前空間にあるリソースのみを許可できます。
apiVersion: sidecarset.alibabacloud.com/v1alpha1
kind: SidecarSetResourceBinding
metadata:
name: filebeat-sidecarset-resourcebinding
namespace: kube-system # kube-system 名前空間のリソースへのアクセスのみを許可できます
spec:
subjects:
- kind: SidecarSet
name: filebeat-sidecarset
resourceRefs:
- kind: ConfigMap
name: filebeat-config
- kind: Secret
name: elasticsearch-master-certsこの権限付与では、ConfigMap と Secret に対する読み取り専用 (Get、List、Watch) 権限のみが付与されます。
コンテナーの起動と終了順序の制御
サイドカーコンテナーは通常、次のことを行う必要があります:
アプリケーションコンテナーの前に起動し、その後に終了する。
Job Pod の場合、アプリケーションコンテナーが終了した後にアクティブに終了する。
ACS シナリオでは、この動作を有効化するために、サイドカーコンテナーで環境変数 __IS_SIDECAR__="true" を設定します。詳細については、「サイドカーコンテナーの起動およびシャットダウンの順序を設定する」をご参照ください。
サイドカーコンテナーの個別アップグレード
サイドカーコンテナーをデプロイした後、OpenKruise のサイドカーホットアップグレード機能を使用して、個別にアップグレードできます。この機能は、Pod の可用性に影響を与えることなくシームレスなアップグレードを実行し、仮想ノード方式と完全に互換性があります。
例:Filebeat サイドカーの Nginx Pod へのインジェクション
以下のウォークスルーでは、Nginx アプリケーション Pod とともに Filebeat サイドカーコンテナーをデプロイします。Filebeat サイドカーは、アプリケーションコンテナーからファイルログと標準出力の両方を収集します。
ステップ 1:ConfigMap のデプロイ
この ConfigMap は Filebeat の構成を提供します。これは kube-system 名前空間に配置されます。この例では、構成はマウントされて表示されるだけで、構成内の環境変数は有効にならず、置き換える必要もありません。
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-systemConfigMap をデプロイします:
kubectl apply -f configmap.yaml
ステップ 2:SidecarSet のデプロイ
この SidecarSet は、Filebeat サイドカーコンテナーとそのインジェクションルールを定義します。
sidecarset.yamlという名前のファイルを作成します:SidecarSet をデプロイします:
kubectl apply -f sidecarset.yaml
ステップ 3:SidecarSetResourceBinding の作成
アプリケーション Pod は default 名前空間で実行されるため、インジェクトされた Filebeat コンテナーは、kube-system 名前空間の ConfigMap と Secret にアクセスするための明示的な権限付与が必要です。
policy.yamlという名前のファイルを作成します:apiVersion: sidecarset.alibabacloud.com/v1alpha1 kind: SidecarSetResourceBinding metadata: name: filebeat-sidecarset-resourcebinding namespace: kube-system # kube-system 名前空間のリソースへのアクセスのみを許可できます spec: subjects: - kind: SidecarSet name: filebeat-sidecarset resourceRefs: - kind: ConfigMap name: filebeat-config - kind: Secret name: elasticsearch-master-certsSidecarSetResourceBinding をデプロイします:
kubectl apply -f policy.yaml
ステップ 4:アプリケーション Pod のデプロイ
Pod を仮想ノードにスケジュールする Nginx Deployment をデプロイします。詳細については、「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:
# 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ステップ 5:インジェクションの検証
Pod のステータスを確認します:期待される出力:`READY` 列の
2/2は、サイドカーコンテナーが正常にインジェクトされたことを示します。kubectl get pods nginx-785d5xxxxx-xxxxxNAME READY STATUS RESTARTS AGE nginx-785d5xxxxx-xxxxx 2/2 Running 0 10mFilebeat コンテナーがアプリケーションコンテナーからファイルログにアクセスできることを確認します:コンテナー内で、エラーログを表示します:期待される出力:
kubectl exec -it deploy/nginx -c filebeat -- /bin/bashcat /var/log/error.log2024/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 29Filebeat コンテナーがアプリケーションコンテナーの標準出力にアクセスできることを確認します:期待される出力:
cat /stdout/nginx/0.log2024-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 upFilebeat コンテナーが名前空間をまたがる構成ファイルをマウントしたことを確認します:期待される出力:この出力は、名前空間をまたがる ConfigMap が正しくマウントされていることを示します。
kubectl exec deploy/nginx -c filebeat -- cat /usr/share/filebeat/filebeat.ymlfilebeat.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" ]