Міграція домену довіри
Це завдання показує, як мігрувати з одного домену довіри в інший без зміни політики авторизації.
У Istio 1.4 ми представили альфа-функцію для підтримки міграції домену довіри для політики авторизації. Це означає, що якщо Istio mesh потрібно змінити свій домен довіри, політику авторизації не потрібно змінювати вручну. В Istio, якщо робоче навантаження працює в просторі імен foo зі службовим обліковим записом bar, а домен довіри системи my-td, ідентифікатор цього робочого навантаження — spiffe://my-td/ns/foo/sa/bar. Стандартно домен довіри Istio mesh — cluster.local, якщо ви не вказали його під час установки.
Перед початком
Перед початком цього завдання виконайте наступне:
Ознайомтеся з поняттями авторизації Istio.
Встановіть Istio з власним доменом довіри та увімкненою взаємною TLS.
$ istioctl install --set profile=demo --set meshConfig.trustDomain=old-tdРозгорніть демонстраційний застосунок httpbin у просторі імен
default, а curl — у просторах іменdefaultтаcurl-allow:$ kubectl label namespace default istio-injection=enabled $ kubectl apply -f @samples/httpbin/httpbin.yaml@ $ kubectl apply -f @samples/curl/curl.yaml@ $ kubectl create namespace curl-allow $ kubectl label namespace curl-allow istio-injection=enabled $ kubectl apply -f @samples/curl/curl.yaml@ -n curl-allowЗастосуйте політику авторизації нижче, щоб заборонити всі запити до
httpbin, крім запитів відcurlу просторі іменcurl-allow.$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: service-httpbin.default.svc.cluster.local namespace: default spec: rules: - from: - source: principals: - old-td/ns/curl-allow/sa/curl to: - operation: methods: - GET selector: matchLabels: app: httpbin --- EOFЗверніть увагу, що може знадобитися кілька секунд для розповсюдження політики авторизації на sidecar.
Перевірте, що запити до
httpbinз:curlв просторі іменdefaultвідхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403curlв просторі іменcurl-allowдозволені.$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200
Міграція домену довіри без аліасів домену довіри
Встановіть Istio з новим доменом довіри.
$ istioctl install --set profile=demo --set meshConfig.trustDomain=new-tdПерезапустіть istiod, щоб застосувати зміни домену довіри.
$ kubectl rollout restart deployment -n istio-system istiodIstio mesh тепер працює з новим доменом довіри,
new-td.Перезавантажте застосунки
httpbinіcurl, щоб вони отримали зміни від нової панелі управління Istio.$ kubectl delete pod --all$ kubectl delete pod --all -n curl-allowПеревірте, що запити до
httpbinз обох просторів іменcurlуdefaultтаcurl-allowвідхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403Це тому, що ми вказали політику авторизації, яка забороняє всі запити до
httpbin, крім запитів з ідентифікатораold-td/ns/curl-allow/sa/curl, що є старим ідентифікатором програмиcurlу просторі іменcurl-allow. Коли ми перейшли до нового домену довіри, тобтоnew-td, ідентифікатор цієї програмиcurlтеперnew-td/ns/curl-allow/sa/curl, що відрізняється відold-td/ns/curl-allow/sa/curl. Тому запити з програмиcurlу просторі іменcurl-allowдоhttpbin, які раніше були дозволені, тепер відхиляються. До Istio 1.4 єдиний спосіб це виправити — змінити політику авторизації вручну. У Istio 1.4 ми представляємо простий спосіб, як показано нижче.
Міграція домену довіри з аліасами домену довіри
Встановіть Istio з новим доменом довіри та псевдонімами домену довіри.
$ cat <<EOF > ./td-installation.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: trustDomain: new-td trustDomainAliases: - old-td EOF $ istioctl install --set profile=demo -f td-installation.yaml -yНе змінюючи політику авторизації, перевірте, що запити до
httpbinз:curlв просторі іменdefaultвідхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403curlв просторі іменcurl-allowдозволені.$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200
Найкращі практики
Починаючи з Istio 1.4, при написанні політики авторизації слід розглянути можливість використання значення cluster.local як частини домену довіри в політиці. Наприклад, замість old-td/ns/curl-allow/sa/curl, це має бути cluster.local/ns/curl-allow/sa/curl. Зверніть увагу, що в цьому випадку cluster.local не є доменом довіри Istio mesh (домен довіри залишається old-td). Однак, у політиці авторизації cluster.local є покажчиком, який вказує на поточний домен довіри, тобто old-td (а пізніше new-td), а також на його псевдоніми. Використовуючи cluster.local у політиці авторизації, коли ви мігруєте до нового домену довіри, Istio виявить це та розгляне новий домен довіри як старий домен довіри без необхідності включення псевдонімів.
Очищення
$ kubectl delete authorizationpolicy service-httpbin.default.svc.cluster.local
$ kubectl delete deploy httpbin; kubectl delete service httpbin; kubectl delete serviceaccount httpbin
$ kubectl delete deploy curl; kubectl delete service curl; kubectl delete serviceaccount curl
$ istioctl uninstall --purge -y
$ kubectl delete namespace curl-allow istio-system
$ rm ./td-installation.yaml