web-dev-qa-db-fra.com

Terminer Istio Sidecar Istio-proxy pour un travail Kubettes / Cronjob

Nous avons récemment commencé à utiliser ISTIO ISTIIO Pour établir un maillage de service dans OUT Kubernettes Paysage.

Nous avons maintenant le problème que les travaux et les cronjobs ne se terminent pas et continuent à courir pour toujours si nous injectons l'ISTIO istio-proxy Conteneur Sidecar dans eux. Le istio-proxy devrait être injecté cependant pour établir des connexions appropriées sur les MTLS aux services dont le travail a besoin de parler et de se conformer à nos règles de sécurité.

J'ai également remarqué les problèmes ouverts dans ISTIIO ( ISTIOIO/Problèmes/6324 ) et Kubettes ( Kubettes/Problèmes/25908 ), mais les deux ne semblent pas fournir une solution valide à tout moment bientôt.

Au début, un crochet pré-stop semblait approprié pour résoudre ce problème, mais il y a une certaine confusion à propos de ce Conecpt lui-même: KubeNettes/Problèmes/55807

lifecycle:
  preStop:
    exec:
      command: 
        ...

Bottomline: Ces crochets ne seront pas exécutés si le conteneur est terminé avec succès.

Il existe également des projets relativement nouveaux sur GitHub essayant de résoudre ce problème avec un contrôleur dédié (que je pense est l'approche la plus préférable), mais à notre équipe, ils ne se sentent pas assez matures pour les mettre tout de suite en production:

Entre-temps, nous nous sommes terminés par la solution suivante qui exécute dans la Sidecar et envoie un signal SIGTERM, mais uniquement si le conteneur principal a terminé avec succès:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: terminate-sidecar-example-service-account
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: terminate-sidecar-example-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get","delete"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: terminate-sidecar-example-rolebinding
subjects:
  - kind: ServiceAccount
    name: terminate-sidecar-example-service-account
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: terminate-sidecar-example-role
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: terminate-sidecar-example-cronjob
  labels:
    app: terminate-sidecar-example
spec:
  schedule: "30 2 * * *"
  jobTemplate:
    metadata:
      labels:
        app: terminate-sidecar-example
    spec:
      template:
        metadata:
          labels:
            app: terminate-sidecar-example
          annotations:
            sidecar.istio.io/inject: "true"
        spec:
          serviceAccountName: terminate-sidecar-example-service-account
          containers:
          - name: ****
            image: ****
            command:
              - "/bin/ash"
              - "-c"
            args:
              - node index.js && kubectl exec -n ${POD_NAMESPACE} ${POD_NAME} -c istio-proxy -- bash -c "sleep 5 && /bin/kill -s TERM 1 &"
            env:
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: POD_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace

Donc, la question ultime à vous tous est: Connaissez-vous de toute solution de contournement, solution, contrôleur, ... qui serait moins hacky/plus approprié pour mettre fin à la istio-proxy conteneur une fois que le conteneur principal a terminé son travail?

15
croeck
0
Montaro
- command:
  - /bin/sh
  - -c
  - |
    until curl -fsI http://localhost:15021/healthz/ready; do echo \"Waiting for Sidecar...\"; sleep 3; done;
    echo \"Sidecar available. Running the command...\";
    <YOUR_COMMAND>;
    x=$(echo $?); curl -fsI -X POST http://localhost:15020/quitquitquit && exit $x
0
Dimitri Kuskov