コンセプト

Kubernetes の Pod リソース初期化コンテナ (Init Container) は、Pod 内の他のコンテナが開始される前に特定のタスクまたは初期化操作を実行するために使用される特別なタイプのコンテナです。Init Container は、構成の読み込み、データベースの初期化、ファイルの準備など、いくつかの前処理タスクを実行するために使用できます。

コンテナ アプリケーションの初期化によく使用されます。

  • メインコンテナイメージにないツールやカスタムコードを提供する
  • 初期化コンテナは、メインのアプリケーション コンテナよりも前に起動して連続して実行する必要があるため、nginx コンテナなどの依存関係条件が満たされるまでアプリケーション コンテナの起動を遅らせるために使用できます。
  • nginx コンテナを起動する前に mysql や redis などのコンテナを起動する必要があり、このとき mysql や redis コンテナが動作しているかどうかを検出するために 2 つの初期化コンテナが必要です。
  • メインコンテナのいくつかのディレクトリ権限を変更する

集中

初期化コンテナで実行するコマンドが実行されると、ポッドは初期化コンテナを自動的に削除します。

初期化コンテナは通常、メインコンテナの前提環境を準備するために使用されます。初期化コンテナの起動時に実行されるコマンドを無限ループとして記述できます。環境に問題がなければループは終了します。初期化コンテナが削除され、メインコンテナが起動します。環境に問題がある場合はループが継続します。環境に問題がなくなり、メインコンテナが起動するまで、初期化コンテナは検出を続けます。

注:初期化コンテナのコマンド設定は true である必要があり、コマンドが正常に実行された場合のみ、初期化コンテナは削除され、メイン コンテナが起動されます。

設定パラメータ

# kubectl explain pod.spec.initContainers
KIND:     Pod
VERSION:  v1
RESOURCE: initContainers <[]Object>
DESCRIPTION:
FIELDS:
   args	<[]string>						//设置容器启动参数
   command	<[]string>					//设置容器启动命令
   env	<[]Object>						//设置容器的环境变量
   image	<string>					//容器的镜像
   imagePullPolicy	<string>			//容器镜像的拉取策略
   name	<string> -required-					//初始化容器的名称
   ports	<[]Object>						//端口号设置

場合

以下は、MySQL と Redis が開始されているかどうかを検出する初期化コンテナーを含む Pod YAML 構成ファイルの例です。これらが開始されていない場合、Nginx コンテナーは開始されません。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: nginx
      image: nginx:latest
      # Nginx 容器的配置

  initContainers:
    - name: mysql-check
      image: mysql:latest
      command: ["sh", "-c", "until nc -z mysql-service 3306; do sleep 1; done"]
      # 使用 nc 命令检测 MySQL 是否启动,mysql-service 是 MySQL 服务的服务名

    - name: redis-check
      image: redis:latest
      command: ["sh", "-c", "until nc -z redis-service 6379; do sleep 1; done"]
      # 使用 nc 命令检测 Redis 是否启动,redis-service 是 Redis 服务的服务名

上の例では、MySQL サービスが開始されているかどうかを検出するコマンドmysql-checkを使用する という名前の初期化コンテナーを定義しました。ncMySQL サービスが開始しない場合、コンテナは 1 秒待機してから、MySQL サービスが開始するまで再度検出します。redis-check同様に、 Redis サービスが開始されているかどうかを検出するために、という名前の初期化コンテナーも定義しました。

只有当 MySQL 和 Redis 两个服务都启动后,Kubernetes 才会继续启动 Nginx 容器。这样可以确保在 Nginx 容器启动之前,必要的后端服务已经可用。

请注意,上述示例中使用了 nc 命令来进行连接检测,你可能需要根据实际情况修改命令以适应你的环境和需求。另外,确保将 mysql-serviceredis-service 替换为你实际使用的 MySQL 和 Redis 服务的服务名或地址