0

新年快乐,我有 2 个部署,MySQL 和应用程序,我的应用程序依赖于 MySQL pod,我有 initContainers 确保应用程序在 MySQL pod 完全应用程序并准备好之后运行,但我正在尝试制作下一个场景工作。

我希望应用程序 pod 检查 MySQL pod,如果端口 3306 不可用,那么应用程序 pod 本身将重新启动,这将一直发生,直到 MySQL pod 完全准备好。

我在应用程序部署/吊舱中使用它

livenessProbe:
  httpGet:
    host: ???
    path: /
    port: 3306

但不是“???”我不知道我需要写什么,因为,我知道我不能写他们的DNS名称,我被告知livenessProbe不适用于DNS,所以我尝试输入这个IP ENV 的地址,但仍然无法正常工作。

我怎样才能做到这一点 ?

SQL 部署 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.deployment.mysql.name }}
  namespace: {{ .Values.namespace }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.deployment.mysql.name }}
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: {{ .Values.deployment.mysql.name }}
    spec:
      containers:
      - image: {{ .Values.deployment.mysql.image }}
        name: {{ .Values.deployment.mysql.name }}
        env:
         - name: MYSQL_ROOT_PASSWORD
           valueFrom: 
             secretKeyRef:
              name: mysql-secret
              key: mysql-root-password   
        ports:
        - containerPort: {{ .Values.deployment.mysql.port }}
          name: {{ .Values.deployment.mysql.name }} 
        volumeMounts:
        - name: sqlvol
          mountPath: /var/lib/mysql/
          readOnly: false
        # - name: db
        #   mountPath: /etc/notebook-db/
        # command:
        #   - mysql < /etc/notebook-db/crud.sql
        livenessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 20
      initContainers:
      - name: init-myservice
        image: busybox:1.28
        command: ['sh', '-c', "sleep 10"]
      volumes:
      - name: sqlvol
        persistentVolumeClaim:
          claimName: mysqlvolume
          readOnly: false

应用程序部署 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.deployment.nodejs.name }}
  namespace: {{ .Values.namespace }}
  labels:
    app: {{ .Values.deployment.nodejs.name }}
    name: {{ .Values.deployment.nodejs.name }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.deployment.nodejs.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.deployment.nodejs.name }}
    spec:
      containers:
      - name: {{ .Values.deployment.nodejs.name }}
        image: {{ .Values.deployment.nodejs.image }}:{{ .Values.deployment.nodejs.tag }}
        ports:
        - containerPort: {{ .Values.deployment.nodejs.targetPort }}
         livenessProbe:
           httpGet:
             host: $MYSQL_CLUSTERIP_SERVICE_HOST
             path: /
             port: 3306
      initContainers:
        - name: init-myservice
          image: busybox:1.28
          command: ['sh', '-c', "sleep 60"]

$MYSQL_CLUSTERIP_SERVICE_HOST - 这是 ENV(它对我不起作用)。

那么如果 pod mysql 未准备好,我该如何重新启动 pod 应用程序?

4

3 回答 3

0
  • 为 MySQL Deployment 创建一个服务,这样可以解决两个问题
    • 服务 IP 不变
    • dns 查找和反向查找适用于服务
Example: 
kubectl get svc -n default
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx        ClusterIP   10.104.97.252   <none>        8080/TCP   33m

FQDN of the above service (in the fomat : <nameoftheservice>.<namespace>.cluster.local ):
nginx.default.svc.cluster.local

  • host然后在livenessProbe应用程序部署中使用服务的 FQDN 。
liveness probe for with respect above service: 

livenessProbe:
  httpGet:
    host: nginx.default.svc.cluster.local
    path: /
    port: 8080
于 2022-01-02T13:31:35.920 回答
0

TL;博士

DNS 不适用于 liveness probe,kubelet 网络空间基本上无法解析任何集群内的 DNS。

您可以考虑将您的两个服务作为 sidecar 放在一个 pod 中。这样,如果一个容器发生故障,它们将共享相同的地址空间,然后重新启动整个 pod。

另一种选择是为您的 pod/应用程序创建一个操作符,基本上让它通过集群内 DNS 分别检查两个 pod 的活跃度,并通过 Kubernetes API 重新启动这些 pod。

您也可以在 pod 中创建自己的脚本,调用 curl 来检查 200 OK 和 kubectl 来重新启动您的 pod,如果您得到其他东西。

请注意,对于上述 2 个选项,您需要确保 Coredns 稳定可靠,否则您的健康检查可能无法使您的服务有潜在的停机时间。

from :一个 pod 通过另一个 pod 的 Liveness-Probe

于 2022-03-03T09:14:25.183 回答
0

如果 MySQL 还没有准备好,你的应用程序会崩溃吗?如果您的应用程序是 Deployment,则 Kubernetes 将应用自我修复,因此您的 Pod 将重新启动,直到重新启动正常(实际上您可以配置最大重试次数)。

于 2022-01-03T20:06:21.047 回答