E hoʻi i nā microservices me Istio. Mahele 3

E hoʻi i nā microservices me Istio. Mahele 3

Nānā. unuhi.: Mahele mua Ua hoʻolaʻa ʻia kēia moʻo i ka ʻike i nā hiki o Istio a hōʻike iā lākou i ka hana, kekona - ka hoʻonohonoho pono ʻana i ka hoʻokele a me ka hoʻokele kaʻa pūnaewele. I kēia manawa, e kamaʻilio mākou e pili ana i ka palekana: e hōʻike i nā hana maʻamau e pili ana iā ia, hoʻohana ka mea kākau i ka lawelawe ʻike Auth0, akā hiki ke hoʻonohonoho ʻia nā mea hoʻolako ʻē aʻe ma ke ʻano like.

Hoʻonohonoho mākou i kahi pūʻulu Kubernetes kahi a mākou i kau ai iā Istio a me kahi noi microservice hoʻohālike, Sentiment Analysis, e hōʻike i ka hiki o Istio.

Me Istio, ua hiki iā mākou ke mālama liʻiliʻi i kā mākou lawelawe no ka mea ʻaʻole pono lākou e hoʻokō i nā papa e like me Retries, Timeouts, Circuit Breakers, Tracing, Monitoring. . Eia kekahi, ua hoʻohana mākou i nā ʻenehana hoʻāʻo a me ka hoʻolaha ʻana: hoʻāʻo A/B, mirroring a me nā canary rollouts.

E hoʻi i nā microservices me Istio. Mahele 3

Ma ka mea hou, e hana mākou i nā papa hope ma ke ala i ka waiwai ʻoihana: hōʻoia a me ka ʻae - a ma Istio he mea hauʻoli maoli!

ʻO ka hōʻoia a me ka ʻae ʻia ma Istio

ʻAʻole loa wau i manaʻoʻiʻo e hoʻoikaika ʻia wau e ka hōʻoia a me ka ʻae. He aha ka mea e hiki ai iā Istio ke hāʻawi mai kahi ʻike loea e hoʻohauʻoli ai i kēia mau kumuhana, a ʻoi aku hoʻi, e hoʻoikaika iā ʻoe?

He mea maʻalahi ka pane: Hoʻololi ʻo Istio i ke kuleana no kēia mau mea hiki mai kāu mau lawelawe i ka mea koho Envoy. I ka manawa e hiki ai nā noi i nā lawelawe, ua hōʻoia ʻia a ʻae ʻia lākou, no laila ʻo kāu mea e hana ai, ʻo ke kākau ʻana i nā code pono ʻoihana.

Maikaʻi loa? E nānā kākou i loko!

Hōʻoia me Auth0

Ma ke ʻano he kikowaena no ka ʻike a me ka hoʻokele hoʻokele, e hoʻohana mākou iā Auth0, nona kahi mana hoʻāʻo, he intuitive e hoʻohana a makemake wau. Eia naʻe, hiki ke hoʻohana ʻia nā loina like i kekahi Nā hoʻokō OpenID Connect: KeyCloak, IdentityServer a me na mea e ae.

No ka hoʻomaka, hele i Auth0 Portal me kāu moʻokāki, e hana i mea hoʻolimalima (mea hoaaina - “tenant”, logical unit of isolation, no ka ike hou aku palapala - kokoke. unuhi.) a hele i Nā noi > App Paʻamaukoho ana Domain, e like me ka mea i hōʻike ʻia ma ke kiʻi ma lalo nei:

E hoʻi i nā microservices me Istio. Mahele 3

E wehewehe i kēia kahua ma ka waihona resource-manifests/istio/security/auth-policy.yaml (kumu):

apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
  name: auth-policy
spec:
  targets:
  - name: sa-web-app
  - name: sa-feedback
  origins:
  - jwt:
      issuer: "https://{YOUR_DOMAIN}/"
      jwksUri: "https://{YOUR_DOMAIN}/.well-known/jwks.json"
  principalBinding: USE_ORIGIN

Me ia mea waiwai, Pilot (kekahi o na mea ekolu ma Istio - ma kahi o transl.) hoʻonohonoho ʻo Envoy e hōʻoia i nā noi ma mua o ka hoʻouna ʻana iā lākou i nā lawelawe: sa-web-app и sa-feedback. I ka manawa like, ʻaʻole pili ka hoʻonohonoho ʻana i nā ʻelele lawelawe sa-frontend, e ʻae iā mākou e haʻalele i ka frontend me ka ʻole. No ka hoʻohana ʻana i ke kulekele, e holo i ke kauoha:

$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io “auth-policy” created

E hoʻi i ka ʻaoʻao a hana i kahi noi - e ʻike ʻoe ua pau ia me ke kūlana 401ʻAiʻia. I kēia manawa e hoʻohuli hou i nā mea hoʻohana mua e hōʻoia me Auth0.

Ke hōʻoia ʻana i nā noi me Auth0

No ka hōʻoia ʻana i nā noi mea hoʻohana hope, pono ʻoe e hana i kahi API ma Auth0 e hōʻike i nā lawelawe i hōʻoia ʻia (nā loiloi, nā kikoʻī, a me nā helu). No ka hana ʻana i API, hele i Auth0 Portal > API > Hana API a hoʻopiha i ka palapala:

E hoʻi i nā microservices me Istio. Mahele 3

ʻO ka ʻike nui ma aneʻi Ikea, a mākou e hoʻohana ai ma hope o ka palapala. E kākau kākou penei:

  • ʻO ka poʻe hoʻolohe: {KOU_AUDIENCE}

Aia nā kikoʻī i koe a mākou e pono ai ma ka Auth0 Portal ma ka ʻāpana noi - koho Noi Hoao (i haku ʻia me ka API).

Maanei mākou e kākau ai:

  • Domain: {KOU_DOMAIN}
  • Id mea kūʻai: {KOU_CLIENT_ID}

Holo i Noi Hoao i ke kahua kikokiko ʻAe ʻia nā URL Callback (nā URL i hoʻoholo ʻia no ka callback), a mākou e kuhikuhi ai i ka URL kahi e hoʻouna ʻia ai ke kelepona ma hope o ka pau ʻana o ka hōʻoia. I kā mākou hihia:

http://{EXTERNAL_IP}/callback

A no ka ʻAe ʻia nā URL e haʻalele (ʻae ʻia nā URL no ka haʻalele ʻana) hoʻohui:

http://{EXTERNAL_IP}/logout

E neʻe kākou i ka ʻaoʻao mua.

Hoʻohou hope

E hoʻololi i ka lālā auth0 waihona waihona [istio-mastery]. Ma kēia lālā, hoʻololi ʻia ke code frontend e hoʻohuli i nā mea hoʻohana iā Auth0 no ka hōʻoia ʻana a hoʻohana i ka hōʻailona JWT i nā noi i nā lawelawe ʻē aʻe. Hoʻokō ʻia ka mea hope penei (App.js):

analyzeSentence() {
    fetch('/sentiment', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${auth.getAccessToken()}` // Access Token
        },
        body: JSON.stringify({ sentence: this.textField.getValue() })
    })
        .then(response => response.json())
        .then(data => this.setState(data));
}

No ka hoʻololi ʻana i ka ʻaoʻao mua e hoʻohana i ka ʻikepili hoʻolimalima ma Auth0, wehe sa-frontend/src/services/Auth.js a hoʻololi i loko i nā waiwai a mākou i kākau ai ma luna (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Используется для редиректа после аутентификации
}

Ua mākaukau ka noi. E wehewehe i kāu Docker ID ma nā kauoha ma lalo nei i ka wā e kūkulu ai a hoʻolālā i nā loli i hana ʻia:

$ docker build -f sa-frontend/Dockerfile 
 -t $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0 
 sa-frontend

$ docker push $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0

$ kubectl set image deployment/sa-frontend 
 sa-frontend=$DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0

E ho'āʻo i ka polokalamu! E hoʻihoʻi ʻia ʻoe i Auth0, kahi āu e pono ai e hoʻopaʻa inoa (a i ʻole kākau inoa), a laila e hoʻihoʻi ʻia ʻoe i ka ʻaoʻao kahi e hana ʻia ai nā noi i hōʻoia ʻia. Inā ʻoe e hoʻāʻo i nā kauoha i ʻōlelo ʻia ma nā ʻāpana mua o ka ʻatikala me ka curl, e loaʻa iā ʻoe ke code 401 Code Kūlana, hōʻailona ʻaʻole ʻae ʻia ka noi.

E hana kāua i ka hana aʻe - ʻae i nā noi.

ʻAe ʻia me Auth0

Hāʻawi ka hōʻoia iā mākou e hoʻomaopopo i ka mea hoʻohana, akā koi ʻia ka ʻae e ʻike i ka mea i loaʻa iā lākou. Hāʻawi ʻo Istio i nā mea hana no kēia.

No ka laʻana, e hana kākou i ʻelua pūʻulu mea hoʻohana (e ʻike i ke kiʻikuhi ma lalo nei):

  • mea hoʻohana (mea hoʻohana) - me ke komo wale ʻana i nā lawelawe SA-WebApp a me SA-Frontend;
  • Nā mea hoʻoponopono (nā mea hoʻoponopono) - me ke komo ʻana i nā lawelawe ʻekolu.

E hoʻi i nā microservices me Istio. Mahele 3
Manaʻo mana

No ka hana ʻana i kēia mau pūʻulu, e hoʻohana mākou i ka hoʻonui ʻia Auth0 Authorization a hoʻohana iā Istio e hāʻawi iā lākou i nā pae like ʻole.

Hoʻokomo a me ka hoʻonohonoho ʻana o Auth0 Authorization

Ma ka puka Auth0, hele i nā hoʻonui (hoʻopaneʻei ka palena manawa) a hoʻokomo Auth0 mana. Ma hope o ka hoʻouka ʻana, hele i Hoʻonui i ka mana, a ma laila - i ka hoʻonohonoho ʻana o ka mea hoʻolimalima ma ke kaomi ʻana ma ka ʻaoʻao ʻākau i luna a koho i ke koho papa kuhikuhi kūpono (Hoʻonohonoho). E ho'ā i nā hui (Nā Pūʻulu) a kaomi ma ke pihi hoʻolaha rule (Paʻi i ka lula).

E hoʻi i nā microservices me Istio. Mahele 3

Ke hana nei i nā hui

Ma ka Authorization Extension hele i Groups a hana i hui Nā mea hoʻonālā. No ka mea, e hana mākou i nā mea hoʻohana i hōʻoia ʻia e like me nā mea hoʻohana maʻamau, ʻaʻohe pono e hana i kahi hui hou no lākou.

E koho i kahi hui Nā mea hoʻonālā, Paʻi Pākuʻi i nā lālā, hoʻohui i kāu moʻokāki nui. E waiho i kekahi mau mea hoʻohana me ka ʻole o kahi hui e hōʻoia i ka hōʻole ʻia ʻana. (Hiki ke hana lima ʻia nā mea hoʻohana hou ma o Auth0 Portal > Mea hoʻohana > Hana Mea hoʻohana.)

E hoʻohui i nā koi hui i ke komo ʻana i ka Token

Ua hoʻohui ʻia nā mea hoʻohana i nā hui, akā pono e hōʻike ʻia kēia ʻike i nā hōʻailona komo. No ka hoʻokō ʻana me OpenID Connect a i ka manawa like e hoʻihoʻi i nā pūʻulu e pono ai mākou, pono e hoʻohui ka token i kāna iho koi maʻamau. Hoʻokō ʻia ma o nā lula Auth0.

No ka hana ʻana i lula, e hele i Auth0 Portal i rula, Paʻi Hana i ka Rula a koho i ka rula kaawale mai na mamana.

E hoʻi i nā microservices me Istio. Mahele 3

E kope i ke code ma lalo a mālama iā ia ma ke ʻano he lula hou Hoʻohui i ke koi hui (namespacedGroup.js):

function (user, context, callback) {
    context.accessToken['https://sa.io/group'] = user.groups[0];
    return callback(null, user, context);
}

i hoʻopuka: Lawe kēia code i ka pūʻulu mea hoʻohana mua i wehewehe ʻia ma ka Authorization Extension a hoʻohui iā ia i ka hōʻailona komo ma ke ʻano he koi maʻamau (ma lalo o kona inoa inoa, e like me ke koi ʻia e Auth0).

E hoʻi i ka ʻaoʻao rula a e nānā inā loaʻa iā ʻoe ʻelua mau lula i kākau ʻia ma ke ʻano penei:

  • auth0-mana-hoonui
  • Hoʻohui i ke koi hui

He mea koʻikoʻi ke kauoha no ka loaʻa ʻole ʻana o ka lula i ka māla hui auth0-mana-hoonui a ma hope o ia mea, ua hoʻohui ʻia ma ke ʻano he koi e ka lula ʻelua. ʻO ka hopena he hōʻailona komo e like me kēia:

{
 "https://sa.io/group": "Moderators",
 "iss": "https://sentiment-analysis.eu.auth0.com/",
 "sub": "google-oauth2|196405271625531691872"
 // [сокращено для наглядности]
}

I kēia manawa pono ʻoe e hoʻonohonoho i ka proxy Envoy e nānā i ke komo ʻana o ka mea hoʻohana, kahi e huki ʻia ai ka hui mai ka koi (https://sa.io/group) ma ka hōʻailona komo i hoʻihoʻi ʻia. ʻO kēia ke kumuhana no ka pauku aʻe o ka ʻatikala.

Hoʻonohonoho ʻae ʻia ma Istio

No ka ʻae ʻana e hana, pono ʻoe e ʻae iā RBAC no Istio. No ka hana ʻana i kēia, e hoʻohana mākou i kēia hoʻonohonoho:

apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
  name: default
spec:
  mode: 'ON_WITH_INCLUSION'                     # 1
  inclusion:
    services:                                   # 2
    - "sa-frontend.default.svc.cluster.local"
    - "sa-web-app.default.svc.cluster.local"
    - "sa-feedback.default.svc.cluster.local" 

Nā ʻōlelo wehewehe:

  • 1 - hiki iā RBAC wale nō no nā lawelawe a me nā inoa inoa i helu ʻia ma ke kula Inclusion;
  • 2 — papa inoa mākou i ka papa inoa o kā mākou lawelawe.

E hoʻohana i ka hoʻonohonoho me kēia kauoha:

$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created

Pono nā lawelawe a pau i kēia manawa i ka Mana Mana Manaʻo Kūʻē Kūʻē. I nā huaʻōlelo ʻē aʻe, pāpā ʻia ke komo ʻana i nā lawelawe āpau a e hopena i kahi pane RBAC: access denied. I kēia manawa e ʻae kākou i ke komo ʻana i nā mea hoʻohana ʻae ʻia.

E komo i ka hoʻonohonoho no nā mea hoʻohana maʻamau

Pono nā mea hoʻohana a pau e komo i nā lawelawe SA-Frontend a me SA-WebApp. Hoʻokō ʻia me ka hoʻohana ʻana i nā kumuwaiwai Istio:

  • ServiceRole - hoʻoholo i nā kuleana i loaʻa i ka mea hoʻohana;
  • ServiceRoleBinding — hoʻoholo i ka mea nona kēia ServiceRole.

No nā mea hoʻohana maʻamau e ʻae mākou i ke komo ʻana i kekahi mau lawelawe (servicerole.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: regular-user
  namespace: default
spec:
  rules:
  - services: 
    - "sa-frontend.default.svc.cluster.local" 
    - "sa-web-app.default.svc.cluster.local"
    paths: ["*"]
    methods: ["*"]

A ma o regular-user-binding e hoʻohana i ServiceRole i nā malihini ʻaoʻao āpau (regular-user-service-role-binding.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: regular-user-binding
  namespace: default
spec:
  subjects:
  - user: "*"
  roleRef:
    kind: ServiceRole
    name: "regular-user"

ʻO ka manaʻo o "nā mea hoʻohana āpau" e loaʻa pū i nā mea hoʻohana ʻole i ka SA WebApp? ʻAʻole, e nānā ke kulekele i ka pono o ka hōʻailona JWT.

E hoʻohana i nā hoʻonohonoho:

$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding created

E komo i ka hoʻonohonoho no nā mea hoʻoponopono

No nā mea hoʻoponopono, makemake mākou e hiki ke komo i nā lawelawe āpau (mod-service-role.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: mod-user
  namespace: default
spec:
  rules:
  - services: ["*"]
    paths: ["*"]
    methods: ["*"]

Akā makemake mākou i kēlā mau kuleana no nā mea hoʻohana wale nō i loaʻa i ka hōʻailona komo ke koi https://sa.io/group me ke ano Moderators (mod-service-role-binding.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: mod-user-binding
  namespace: default
spec:
  subjects:
  - properties:
      request.auth.claims[https://sa.io/group]: "Moderators"
  roleRef:
    kind: ServiceRole
name: "mod-user" 

E hoʻohana i nā hoʻonohonoho:

$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding created

Ma muli o ka hoʻopaʻa ʻana i nā ʻelele, hiki i ʻelua mau minuke ke hoʻokō ʻia nā lula ʻae. A laila hiki iā ʻoe ke hōʻoia i nā mea hoʻohana a me nā moderators i loaʻa nā pae like ʻole.

Ka hopena ma kēia ʻāpana

ʻOiaʻiʻo, ua ʻike paha ʻoe i kahi ala maʻalahi, hoʻoikaika ʻole, scalable a palekana i ka hōʻoia a me ka ʻae?

ʻEkolu wale nō kumu waiwai Istio (RbacConfig, ServiceRole, a me ServiceRoleBinding) i koi ʻia e hoʻokō i ka mana maikaʻi ma luna o ka hōʻoia ʻana a me ka ʻae ʻana i ke komo ʻana o ka mea hoʻohana hope i nā lawelawe.

Eia kekahi, ua mālama mākou i kēia mau pilikia mai kā mākou lawelawe ʻelele, e loaʻa ana:

  • e ho'ēmi i ka nui o nā code generic i loaʻa i nā pilikia palekana a me nā pōʻino;
  • e hōʻemi ana i ka helu o nā kūlana naʻaupō i ʻike ʻia kahi hopena i hiki ke loaʻa mai waho a poina e hōʻike;
  • hoʻopau i ka pono e hōʻano hou i nā lawelawe āpau i kēlā me kēia manawa i hoʻohui ʻia kahi kuleana hou a i ʻole kuleana;
  • e noho maʻalahi nā lawelawe hou, palekana a wikiwiki hoʻi.

hopena

Hāʻawi ʻo Istio i nā hui e kālele i kā lākou waiwai i nā hana koʻikoʻi ʻoihana me ka ʻole o ka hoʻohui ʻana i nā lawelawe, e hoʻihoʻi iā lākou i ke kūlana micro.

ʻO ka ʻatikala (ma ʻekolu ʻāpana) hāʻawi i ka ʻike kumu a me nā ʻōlelo aʻoaʻo i mākaukau no ka hoʻomaka ʻana me Istio i nā papahana maoli.

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka