为kubernetes作业/ cronjob终止istio sidecar istio-proxy

cro*_*eck 5 kubernetes istio

我们最近开始使用istio Istio建立内出了服务网格Kubernetes景观。

现在,如果将istio istio-proxysidecar容器注入到作业中,作业和cronjobs不会终止并永远运行,这是一个问题。本istio-proxy应注射虽然建立到工作需要交谈的服务适当的MTLS连接并符合我们的安全规定。

我还注意到了Istio(istio / issues / 6324)和kubernetes(kubernetes / issues / 25908)中的未解决问题,但是似乎两者都无法在短期内提供有效的解决方案。

起初,停止前挂钩似乎很适合解决此问题,但此概念本身存在一些困惑:kubernetes / issues / 55807

lifecycle:
  preStop:
    exec:
      command: 
        ...
Run Code Online (Sandbox Code Playgroud)

底线:如果容器成功完成,则不会执行这些钩子。

GitHub上还有一些相对较新的项目试图使用专用控制器(我认为这是最可取的方法)来解决这个问题,但是对我们的团队而言,他们还不够成熟,无法立即将它们投入生产:

同时,我们自己完成了以下变通方法,该变通方法可以执行到边车中并发送SIGTERM信号,但前提是主容器成功完成:

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
Run Code Online (Sandbox Code Playgroud)

因此,对大家的最终问题是:您是否知道任何更好的解决方法,解决方案,控制器...会更不容易/更适合istio-proxy在主容器完成工作后终止容器?

Mac*_*eks 9

对于那些认为curl 很奢侈的人,我的wget 版本的Dimitri 代码

command:
  - /bin/sh
  - -c
  - |
    until wget -q --spider http://127.0.0.1:15021/healthz/ready 2>/dev/null; do echo "Waiting for Istio sidecar..."; sleep 3; done;
    echo \"Sidecar available. Running...\";
    <COMMAND>;
    x=$?; wget -q --post-data='' -S -O /dev/null http://127.0.0.1:15020/quitquitquit && exit $x
Run Code Online (Sandbox Code Playgroud)

对于那些连 wget 都买不起的人,可以使用 bash:

exec 3<>/dev/tcp/127.0.0.1/15020
echo -e "POST /quitquitquit HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 0\r\nConnection: close\r\n\r\n" >&3
cat <&3
Run Code Online (Sandbox Code Playgroud)


小智 8

- 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
Run Code Online (Sandbox Code Playgroud)


小智 5

我通过按照链接 Istio 文档编辑 istio-sidecar-injector 的配置映射找到了解决方法

https://istio.io/docs/setup/additional-setup/sidecar-injection/

apiVersion: v1 kind: ConfigMap metadata: name: istio-sidecar-injector data: config: |- policy: enabled neverInjectSelector: - matchExpressions: - {key: job-name, operator: Exists} 但是,随着这个变化,我们的 cronjob sidecar 将不会注入,并且 istio 策略将不适用于 cronjob 作业,在我们的例子中,我们不希望 istio 执行任何策略

注意:- 默认情况下,作业名称是在 pod 创建中添加的标签


TJ *_*man 4

这不是配置错误,而是上游 Kubernetes 中的错误。截至 2019 年 9 月,Istio/quitquitquit通过向 Pilot 代理引入端点来解决这个问题。

不幸的是,Kubernetes并没有那么坚定地自行解决这个问题。所以它在某些方面仍然存在。然而,/quitquitquitIstio 中的端点应该已经解决了这个特定用例的问题。