Проблеми з інʼєкцією Sidecar
Результат інʼєкції sidecar не відповідає очікуванням
Це включає випадки, коли виконано інʼєкцію sidecar тоді, коли це не очікувалося, і відсутність інʼєкції sidecar, коли це було потрібно.
Переконайтеся, що ваш pod не знаходиться в просторі імен
kube-system
абоkube-public
. Автоматична інʼєкція sidecar буде проігнорована для podʼів у цих просторах імен.Переконайтеся, що ваш pod не має
hostNetwork: true
у своїй специфікації. Автоматична інʼєкція sidecar буде проігнорована для podʼів, які знаходяться в мережі хосту.Модель sidecar передбачає, що зміни iptables, необхідні для перехоплення трафіку Envoy, відбуваються всередині podʼа. Для podʼів в мережі хосту це припущення порушується, що може призвести до збоїв маршрутизації на рівні хосту.
Перевірте
namespaceSelector
вебхука, щоб визначити, чи вебхук має область застосування “opt-in” чи “opt-out” для цільового простору імен.namespaceSelector
для opt-in виглядає так:$ kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml | grep "namespaceSelector:" -A5 namespaceSelector: matchLabels: istio-injection: enabled rules: - apiGroups: - ""
Вебхук інʼєкції буде викликано для podʼів, створених у просторах імен з міткою
istio-injection=enabled
.$ kubectl get namespace -L istio-injection NAME STATUS AGE ISTIO-INJECTION default Active 18d enabled istio-system Active 3d kube-public Active 18d kube-system Active 18d
namespaceSelector
для opt-out виглядає так:$ kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml | grep "namespaceSelector:" -A5 namespaceSelector: matchExpressions: - key: istio-injection operator: NotIn values: - disabled rules: - apiGroups: - ""
Вебхук інʼєкції буде викликано для podʼів, створених у просторах імен без мітки
istio-injection=disabled
.$ kubectl get namespace -L istio-injection NAME STATUS AGE ISTIO-INJECTION default Active 18d istio-system Active 3d disabled kube-public Active 18d disabled kube-system Active 18d disabled
Переконайтеся, що простір імен вашого застосунку правильно позначений і (пере)поставте мітки відповідно, наприклад:
$ kubectl label namespace istio-system istio-injection=disabled --overwrite
(повторіть для всіх просторів імен, у яких вебхук інʼєкції має бути викликаний для нових podʼів)
$ kubectl label namespace default istio-injection=enabled --overwrite
Перевірте стандартну політику
Перевірте стандартну політику інʼєкції у
configmap
istio-sidecar-injector
.$ kubectl -n istio-system get configmap istio-sidecar-injector -o jsonpath='{.data.config}' | grep policy: policy: enabled
Дозволені значення політики —
disabled
таenabled
. Стандартна політика застосовується лише в разі відповідностіnamespaceSelector
вебхука до цільового простору імен. Невідомі політики повністю вимикають інʼєкцію.Перевірте переважну анотацію для podʼа
Стандартну політику можна перевизначити за допомогою мітки
sidecar.istio.io/inject
у метаданих шаблону podʼа. Метадані розгортання ігноруються. Значення міткиtrue
виконує примусову інʼєкцію sidecar, тоді як значенняfalse
не виконує примусової інʼєкції sidecar.Наступна мітка перевизначає будь-яку стандартну політику і виконує примусову інʼєкцію sidecar:
$ kubectl get deployment curl -o yaml | grep "sidecar.istio.io/inject:" -B4 template: metadata: labels: app: curl sidecar.istio.io/inject: "true"
Поди не можуть бути створені взагалі
Виконайте команду kubectl describe -n namespace deployment name
для розгортання невдалого podʼа. Невдача виклику вебхука інʼєкції зазвичай буде зафіксована в журналі подій.
Помилки, повʼязані з сертифікатами x509
Warning FailedCreate 3m (x17 over 8m) replicaset-controller Error creating: Internal error occurred: \
failed calling admission webhook "sidecar-injector.istio.io": Post https://istiod.istio-system.svc:443/inject: \
x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying \
to verify candidate authority certificate "Kubernetes.cluster.local")
Помилки x509: certificate signed by unknown authority
зазвичай викликані порожнім caBundle
у конфігурації вебхука.
Перевірте, щоб caBundle
у mutatingwebhookconfiguration
відповідало кореневому сертифікату, змонтованому в podʼі istiod
.
$ kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml -o jsonpath='{.webhooks[0].clientConfig.caBundle}' | md5sum
4b95d2ba22ce8971c7c92084da31faf0 -
$ kubectl -n istio-system get configmap istio-ca-root-cert -o jsonpath='{.data.root-cert\.pem}' | base64 -w 0 | md5sum
4b95d2ba22ce8971c7c92084da31faf0 -
CA сертифікат повинен збігатися. Якщо вони не збігаються, перезапустіть podʼи istiod
.
$ kubectl -n istio-system patch deployment istiod \
-p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
deployment.extensions "istiod" patched
Помилки в статусі розгортання
Коли автоматична інʼєкція sidecar увімкнена для podʼа, і інʼєкція за будь-якої причини не вдається, створення podʼа також зазнає невдачі. У таких випадках ви можете перевірити статус розгортання podʼа, щоб визначити помилку. Помилки також зʼявляться в подіях простору імен, повʼязаного з розгортанням.
Наприклад, якщо pod контролера istiod
не працював, коли ви намагалися розгорнути ваш pod, події покажуть таку помилку:
$ kubectl get events -n curl
...
23m Normal SuccessfulCreate replicaset/curl-9454cc476 Created pod: curl-9454cc476-khp45
22m Warning FailedCreate replicaset/curl-9454cc476 Error creating: Internal error occurred: failed calling webhook "namespace.sidecar-injector.istio.io": failed to call webhook: Post "https://istiod.istio-system.svc:443/inject?timeout=10s": dial tcp 10.96.44.51:443: connect: connection refused
$ kubectl -n istio-system get pod -lapp=istiod
NAME READY STATUS RESTARTS AGE
istiod-7d46d8d9db-jz2mh 1/1 Running 0 2d
$ kubectl -n istio-system get endpoints istiod
NAME ENDPOINTS AGE
istiod 10.244.2.8:15012,10.244.2.8:15010,10.244.2.8:15017 + 1 more... 3h18m
Якщо pod або точки доступу istiod не готові, перевірте журнали podʼа та статус для будь-яких ознак того, чому вебхук podʼа не запускається і не обслуговує трафік.
$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
kubectl -n istio-system logs ${pod} \
done
$ for pod in $(kubectl -n istio-system get pod -l app=istiod -o name); do \
kubectl -n istio-system describe ${pod}; \
done
$
Автоматична інʼєкція sidecar не працює, якщо у сервера API Kubernetes є налаштування проксі
Коли сервер API Kubernetes має налаштування проксі, такі як:
env:
- name: http_proxy
value: http://proxy-wsa.esl.foo.com:80
- name: https_proxy
value: http://proxy-wsa.esl.foo.com:80
- name: no_proxy
value: 127.0.0.1,localhost,dockerhub.foo.com,devhub-docker.foo.com,10.84.100.125,10.84.100.126,10.84.100.127
З такими налаштуваннями інʼєкція sidecar зазнає невдачі. Єдиний повʼязаний запис можна знайти в журналі kube-apiserver
:
W0227 21:51:03.156818 1 admission.go:257] Failed calling webhook, failing open sidecar-injector.istio.io: failed calling admission webhook "sidecar-injector.istio.io": Post https://istio-sidecar-injector.istio-system.svc:443/inject: Service Unavailable
Переконайтеся, що CIDR podʼів і сервісів не оброблені відповідно до змінних *_proxy
. Перевірте файли та журнали kube-apiserver
, щоб перевірити конфігурацію та чи оброблялись якісь запити.
Одним зі способів вирішення є видалення налаштувань проксі з маніфесту kube-apiserver
, іншим — включення istio-sidecar-injector.istio-system.svc
або .svc
у значення no_proxy
. Переконайтеся, що kube-apiserver
перезапущено після кожного способу розвʼязання.
Була сповіщено про проблему у Kubernetes, повʼязану з цим, і згодом вона була закрита. https://github.com/kubernetes/kubernetes/pull/58698#discussion_r163879443
Обмеження при використанні Tcpdump у podʼах
Tcpdump не працює у sidecar podʼі — контейнер не запускається з правами root. Проте будь-який інший контейнер у тому ж podʼі побачить усі пакети, оскільки мережевий простір імен спільний. iptables
також побачить конфігурацію на рівні podʼа.
Комунікація між Envoy та застосунком відбувається на 127.0.0.1 і не є зашифрованою.
Кластер не масштабується автоматично
Через те, що контейнер sidecar монтує локальний том для зберігання, автомастабувач вузлів не може видалити вузли з podʼами, до яких було виконано інʼєкції. Це є відомою проблемою. Вирішенням є додавання анотації podʼа "cluster-autoscaler.kubernetes.io/safe-to-evict": "true"
до podʼів з інʼєкіями.
Pod або контейнери запускаються з мережевими проблемами, якщо istio-proxy не готовий
Багато застосунків виконують команди або перевірки під час запуску, які потребують зʼєднання з мережею. Це може призвести до зависання або перезавантаження контейнерів застосунку, якщо контейнер sidecar istio-proxy
не готовий.
Щоб уникнути цього, встановіть holdApplicationUntilProxyStarts
на true
. Це призведе до інʼєкції sidecar на початку списку контейнерів podʼа та налаштує його так, щоб блокувати запуск усіх інших контейнерів до тих пір, поки проксі не буде готовий.
Це можна додати як глобальну опцію конфігурації:
values.global.proxy.holdApplicationUntilProxyStarts: true
або як анотацію podʼа:
proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'