K8s 上 pod 中的容器初始化顺序

Gal*_* I. 5 kubernetes kubernetes-pod

我想在一个 Pod 上运行两个容器。

container1是一个尝试连接到在container2.

如何确保 sql 容器 ( container2) 将运行并在启动前准备就绪container1

initContainer在这里不起作用,因为它将在两个容器之前运行。

这是我的 compose.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: sql-test-pod
  labels:
    name: sql-test
spec:
  restartPolicy: Never
  containers:
    - name: my-sqldb
      image: docker-registry.com/database
      imagePullPolicy: Always
      resources:
        limits:
          memory: "4096Mi"
          cpu: "750m"
        requests:
          memory: "4096Mi"
          cpu: "750m"
    - name: tests
      tty: true
      stdin: true
      image: docker-registry.com/test
      imagePullPolicy: Always
      resources:
        limits:
          memory: "4096Mi"
          cpu: "750m"
        requests:
          memory: "4096Mi"
          cpu: "750m"
      env:
      - name: sqlhostname
        value: "SqlHostnamePlaceholder"
  nodeSelector:
    kubernetes.io/os: windows
  tolerations:
  - key: "windows"
    operator: "Equal"
    value: "2019"
    effect: "NoSchedule"
Run Code Online (Sandbox Code Playgroud)

Gal*_* I. 4

为了确保仅在SQL Server 启动container1后启动,我发现的唯一方法是使用container2postStart容器的生命周期事件。 postStart在创建容器后触发,确实不能保证在调用容器的入口点之前调用 postStart 处理程序,但事实证明,启动容器的 Kubelet 代码会阻塞下一个容器的启动,直到启动后处理程序终止。

这就是我的新撰写文件的样子:

apiVersion: v1
kind: Pod
metadata:
  name: sql-test-pod
  labels:
    name: sql-test
spec:
  restartPolicy: Never
  containers:
    - name: my-sqldb
      image: docker-registry.com/database
      imagePullPolicy: Always
      lifecycle:
        postStart:
          exec:
            command: ['powershell.exe', '-command', "$connectionString = 'Server=sql-test-pod;User Id=user;Password=password'; $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $connectionString; $i=0; while($i -lt 6) {Try { $i++;$sqlConnection.Open();$sqlConnection.Close(); return}Catch {Write-Error $_; start-sleep 30}}"]
      resources:
        limits:
          memory: "4096Mi"
          cpu: "750m"
        requests:
          memory: "4096Mi"
          cpu: "750m"
    - name: tests
      tty: true
      stdin: true
      image: docker-registry.com/test
      imagePullPolicy: Always
      resources:
        limits:
          memory: "4096Mi"
          cpu: "750m"
        requests:
          memory: "4096Mi"
          cpu: "750m"
      env:
      - name: sqlhostname
        value: "sql-test-pod"
  nodeSelector:
    kubernetes.io/os: windows
  tolerations:
  - key: "windows"
    operator: "Equal"
    value: "2019"
    effect: "NoSchedule"
Run Code Online (Sandbox Code Playgroud)

类似的案例你可以在这里找到