如何使用 pod affinity

How to use pod affinity

我有这个吊舱

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  labels:
    app: myapp
    myapp: db
    subdomain: name
  annotations:
    app.myapp.com/uuid: some-uuid
    app.myapp.com/domain: domain

我想用this让另一个pod等待mysql,可以吗?

Pod 亲和性只是一种告诉调度程序相对于其他容器放置 pods 位置的方法。然而,调度程序在执行此操作时不会查看 Pod 状态。因此,无法使用 pod 亲和力来“等待 mysql”。

通常,在 pods 启动期间实现一些“等待某事”的简单方法是添加一些 initContainer。

在 StatefulSets、Deployments、ReplicationControllers、Daemonsets 等中,除了描述容器的 containers 数组应该始终是 运行 之外,还有一个可选的 initContainers 数组。这个是为了列出容器,这些容器将在 containers 数组中的容器启动之前启动,然后退出。

参见:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

文档给出了以下示例:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
[...]

我不确定我是否会使用一些 nslookup...通常,由于您的主容器映像具有适当的运行时来查询您的数据库,您应该能够 re-use 它与您的 init 容器。

在你的情况下,它可能会从你的 mysql 数据库中列出 table,然后重试直到你得到答案。