Мы недавно начали использовать istio Istio для создания сервис-сетки в пределах Kubernetes ландшафт.
Теперь у нас есть проблема, что задания и cronjobs не завершаютсяи продолжайте работать вечно, если мы введем в них контейнер с коляской istio istio-proxy
.istio-proxy
должен быть введен, хотя для установления надлежащих соединений mTLS со службами, с которыми работа должна поговорить, и для соблюдения наших правил безопасности.
Я также заметил открытые проблемы в Istio ( istio / проблемы/ 6324 ) и kubernetes ( kubernetes / Issues / 25908 ), но оба, похоже, не могут обеспечить правильное решение в ближайшее время.
Сначала ловушка предстопа казалась подходящейчтобы решить эту проблему, но есть некоторая путаница с самим этим понятием: kubernetes / Issues / 55807
lifecycle:
preStop:
exec:
command:
...
Итог: Эти хуки не будут выполнены, если контейнер успешно завершен.
Есть также несколько относительно новых проектов на 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
Итакглавный вопрос для всех вас: Знаете ли вы о каком-нибудь лучшем обходном пути, решении, контроллере, ... который был бы менее хакерским / более подходящим для завершения контейнера istio-proxy
, как только основной контейнер завершил свою работу