我们最近开始使用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在主容器完成工作后终止容器?
对于那些认为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 创建中添加的标签
| 归档时间: |
|
| 查看次数: |
1038 次 |
| 最近记录: |