Pada si microservices pẹlu Istio. Apa 3

Pada si microservices pẹlu Istio. Apa 3

Akiyesi. itumọ.: Apa akọkọ jara yii jẹ iyasọtọ lati mọ awọn agbara ti Istio ati ṣafihan wọn ni iṣe, ikeji - afisona aifwy daradara ati iṣakoso ijabọ nẹtiwọọki. Bayi a yoo sọrọ nipa aabo: lati ṣe afihan awọn iṣẹ ipilẹ ti o nii ṣe pẹlu rẹ, onkọwe lo iṣẹ idanimọ Auth0, ṣugbọn awọn olupese miiran le tunto ni ọna kanna.

A ṣeto iṣupọ Kubernetes kan ninu eyiti a fi Istio ranṣẹ ati apẹẹrẹ ohun elo microservice kan, Itupalẹ ẹdun, lati ṣafihan awọn agbara Istio.

Pẹlu Istio, a ni anfani lati jẹ ki awọn iṣẹ wa kere nitori wọn ko nilo lati ṣe awọn ipele bii Awọn igbiyanju, Awọn akoko, Awọn fifọ Circuit, Wapa, Abojuto. Ni afikun, a lo idanwo to ti ni ilọsiwaju ati awọn imuṣiṣẹ imuṣiṣẹ: Idanwo A/B, mirroring ati canary rollouts.

Pada si microservices pẹlu Istio. Apa 3

Ninu ohun elo tuntun, a yoo ṣe pẹlu awọn ipele ikẹhin lori ọna si iye iṣowo: ijẹrisi ati aṣẹ - ati ni Istio o jẹ idunnu gidi!

Ijeri ati aṣẹ ni Istio

Emi yoo ko gbagbọ rara pe Emi yoo ni atilẹyin nipasẹ ijẹrisi ati aṣẹ. Kini Istio le funni lati irisi imọ-ẹrọ lati jẹ ki awọn koko-ọrọ wọnyi dun ati, paapaa diẹ sii, iwunilori fun ọ?

Idahun si rọrun: Istio yi ojuse fun awọn agbara wọnyi lati awọn iṣẹ rẹ si aṣoju Aṣoju. Ni akoko ti awọn ibeere de ọdọ awọn iṣẹ naa, wọn ti jẹri ati aṣẹ tẹlẹ, nitorinaa gbogbo ohun ti o ni lati ṣe ni kọ koodu iwulo iṣowo.

O dara? Jẹ ki a wo inu!

Ijeri pẹlu Auth0

Gẹgẹbi olupin fun idanimọ ati iṣakoso wiwọle, a yoo lo Auth0, eyiti o ni ẹya idanwo kan, jẹ ogbon inu lati lo ati pe Mo fẹran rẹ ni irọrun. Sibẹsibẹ, awọn ilana kanna le ṣee lo si eyikeyi miiran OpenID So awọn imuṣẹ: KeyCloak, IdentityServer ati ọpọlọpọ awọn miiran.

Lati bẹrẹ, lọ si Auth0 Portal pẹlu akọọlẹ rẹ, ṣẹda agbatọju kan (ayálégbé - “ayalégbé”, ẹyọ ọgbọ́n tí a yà sọ́tọ̀, fún ẹ̀kúnrẹ́rẹ́ ẹ wo iwe - isunmọ. itumọ.) ki o si lọ si Awọn ohun elo> Ohun elo aiyipadanipa yiyan -ašẹ, bi o ṣe han ninu sikirinifoto ni isalẹ:

Pada si microservices pẹlu Istio. Apa 3

Pato agbegbe yii ninu faili naa resource-manifests/istio/security/auth-policy.yaml (orisun):

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

Pẹlu iru awọn oluşewadi, Pilot (ọkan ninu awọn paati Iṣakoso Iṣakoso mẹta ni Istio - isunmọ. transl.) tunto Aṣoju lati jẹrisi awọn ibeere ṣaaju fifiranṣẹ wọn si awọn iṣẹ: sa-web-app и sa-feedback. Ni akoko kanna, iṣeto naa ko lo si Awọn aṣoju iṣẹ sa-frontend, gbigba wa lati lọ kuro ni frontend laigba aṣẹ. Lati lo Ilana naa, ṣiṣe aṣẹ naa:

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

Pada si oju-iwe naa ki o ṣe ibeere - iwọ yoo rii pe o pari pẹlu ipo naa 401 Laigba aṣẹ. Bayi jẹ ki a darí awọn olumulo iwaju lati jẹri pẹlu Auth0.

Ijeri awọn ibeere pẹlu Auth0

Lati jẹri awọn ibeere olumulo ipari, o nilo lati ṣẹda API ni Auth0 ti yoo ṣe aṣoju awọn iṣẹ ti o jẹri (awọn atunwo, awọn alaye, ati awọn idiyele). Lati ṣẹda API kan, lọ si Auth0 Portal > APIs > Ṣẹda API ki o si fọwọsi fọọmu naa:

Pada si microservices pẹlu Istio. Apa 3

Alaye pataki nibi ni da, eyi ti a yoo lo nigbamii ni akosile. Jẹ ki a kọ silẹ bi eleyi:

  • jepe: {YOUR_AUDIENCE}

Awọn alaye ti o ku ti a nilo wa lori Portal Auth0 ni apakan ohun elo - yan Ohun elo Idanwo (ti a ṣẹda laifọwọyi pẹlu API).

Nibi a yoo kọ:

  • -ašẹ: {YOUR_DOMAIN}
  • Id Onibara: {YOUR_CLIENT_ID}

Yi lọ si Ohun elo Idanwo si aaye ọrọ Awọn URL Ipepada ti a gba laaye (Awọn URL ti o yanju fun ipe pada), ninu eyiti a ṣe pato URL nibiti o yẹ ki o fi ipe ranṣẹ lẹhin ti ijẹrisi ti pari. Ninu ọran tiwa o jẹ:

http://{EXTERNAL_IP}/callback

Ati fun Awọn URL Iwajade ti a gba laaye (Awọn URL ti a gba laaye fun jijade) ṣafikun:

http://{EXTERNAL_IP}/logout

Jẹ ki a lọ si iwaju iwaju.

Imudojuiwọn iwaju

Yipada si ẹka auth0 ibi ipamọ [istio-mastery]. Ni ẹka yii, koodu iwaju ti yipada lati darí awọn olumulo si Auth0 fun ijẹrisi ati lo aami JWT ni awọn ibeere si awọn iṣẹ miiran. Awọn igbehin ti wa ni imuse bi wọnyi (Ohun elo):

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));
}

Lati yi iwaju iwaju pada lati lo data ayalegbe ni Auth0, ṣii sa-frontend/src/services/Auth.js ki o rọpo ninu rẹ awọn iye ti a kowe loke (Auth.js):

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

Ohun elo ti šetan. Pato ID Docker rẹ ninu awọn aṣẹ ti o wa ni isalẹ nigbati o ba kọ ati gbigbe awọn ayipada ti a ṣe:

$ 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

Gbiyanju ohun elo naa! Iwọ yoo darí rẹ si Auth0, nibiti o nilo lati wọle (tabi forukọsilẹ), lẹhin eyi a yoo fi ọ ranṣẹ pada si oju-iwe ti eyiti awọn ibeere ti jẹri tẹlẹ yoo ṣe. Ti o ba gbiyanju awọn aṣẹ ti a mẹnuba ni awọn apakan akọkọ ti nkan naa pẹlu curl, iwọ yoo gba koodu naa 401 koodu ipo, ṣe afihan pe ko gba aṣẹ fun ibeere naa.

Jẹ ki a ṣe igbesẹ ti n tẹle - fun laṣẹ awọn ibeere.

Aṣẹ pẹlu Auth0

Ijeri gba wa laaye lati ni oye tani olumulo kan jẹ, ṣugbọn a nilo aṣẹ lati mọ kini wọn ni iwọle si. Istio nfunni awọn irinṣẹ fun eyi paapaa.

Gẹgẹbi apẹẹrẹ, jẹ ki a ṣẹda awọn ẹgbẹ olumulo meji (wo aworan ni isalẹ):

  • users (olumulo) - pẹlu wiwọle si SA-WebApp nikan ati awọn iṣẹ SA-Frontend;
  • Awọn oniwontunniwonsi (awọn oniwontunniwonsi) - pẹlu wiwọle si gbogbo awọn mẹta awọn iṣẹ.

Pada si microservices pẹlu Istio. Apa 3
Ilana aṣẹ

Lati ṣẹda awọn ẹgbẹ wọnyi, a yoo lo Ifaagun Aṣẹ Auth0 ati lo Istio lati pese wọn pẹlu awọn ipele iraye si oriṣiriṣi.

Fifi sori ẹrọ ati iṣeto ni ti Aṣẹ Auth0

Ni oju-ọna Auth0, lọ si awọn amugbooro (Amugbooro) ati fi sori ẹrọ Auth0 Aṣẹ. Lẹhin fifi sori ẹrọ, lọ si Itẹsiwaju Aṣẹ, ati nibẹ - si atunto agbatọju nipa tite lori oke apa ọtun ati yiyan aṣayan akojọ aṣayan ti o yẹ (Iṣeto ni). Mu awọn ẹgbẹ ṣiṣẹ (Awọn ẹgbẹ) ki o si tẹ lori awọn jade ofin bọtini (Ofin atẹjade).

Pada si microservices pẹlu Istio. Apa 3

Ṣiṣẹda awọn ẹgbẹ

Ni Ifaagun Aṣẹ lọ si Awọn ẹgbẹ ki o si ṣẹda ẹgbẹ kan Awọn alakoso. Niwọn igba ti a yoo tọju gbogbo awọn olumulo ti o jẹri bi awọn olumulo deede, ko si iwulo lati ṣẹda ẹgbẹ afikun fun wọn.

Yan ẹgbẹ kan Awọn alakoso, najmite na Ṣafikun Awọn ọmọ ẹgbẹ, ṣafikun akọọlẹ akọkọ rẹ. Fi diẹ ninu awọn olumulo silẹ laisi ẹgbẹ eyikeyi lati rii daju pe wọn ko iwọle si. (Awọn olumulo titun le ṣẹda pẹlu ọwọ nipasẹ Auth0 Portal> Awọn olumulo> Ṣẹda olumulo.)

Ṣafikun ẹtọ Ẹgbẹ si Tokini Wiwọle

Awọn olumulo ti ni afikun si awọn ẹgbẹ, ṣugbọn alaye yii gbọdọ tun ṣe afihan ni awọn ami iraye si. Lati ni ibamu pẹlu OpenID Connect ati ni akoko kanna pada awọn ẹgbẹ ti a nilo, aami yoo nilo lati fi ara rẹ kun aṣa nipe. Ti ṣe nipasẹ awọn ofin Auth0.

Lati ṣẹda ofin kan, lọ si Auth0 Portal si ofin, najmite na Ṣẹda Ofin ki o si yan ohun ṣofo ofin lati awọn awoṣe.

Pada si microservices pẹlu Istio. Apa 3

Daakọ koodu ni isalẹ ki o fipamọ bi ofin titun Fi Ipe Ẹgbẹ (namespacedGroup.js):

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

Daakọ: Koodu yii gba ẹgbẹ olumulo akọkọ ti asọye ni Ifaagun Aṣẹ ati ṣafikun rẹ si ami iraye si bi ẹtọ aṣa (labẹ aaye orukọ rẹ, bi a ti beere nipasẹ Auth0).

Pada si oju-iwe ofin ati ṣayẹwo pe o ni awọn ofin meji ti a kọ sinu ilana atẹle:

  • auth0-aṣẹ-itẹsiwaju
  • Fi Ipe Ẹgbẹ

Ilana naa ṣe pataki nitori aaye ẹgbẹ gba ofin ni asynchronously auth0-aṣẹ-itẹsiwaju ati lẹhin eyi o jẹ afikun bi ẹtọ nipasẹ ofin keji. Abajade jẹ ami iwọle bi eleyi:

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

Bayi o nilo lati tunto aṣoju Aṣoju lati ṣayẹwo iwọle olumulo, fun eyiti ẹgbẹ yoo fa lati ẹtọ (https://sa.io/group) ninu awọn pada wiwọle àmi. Eyi ni koko-ọrọ fun apakan atẹle ti nkan naa.

Iṣeto ni aṣẹ ni Istio

Fun aṣẹ lati ṣiṣẹ, o gbọdọ mu RBAC ṣiṣẹ fun Istio. Lati ṣe eyi, a yoo lo eto atẹle:

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" 

Awọn alaye:

  • 1 - mu RBAC ṣiṣẹ nikan fun awọn iṣẹ ati awọn aaye orukọ ti a ṣe akojọ si ni aaye Inclusion;
  • 2 - a ṣe atokọ atokọ ti awọn iṣẹ wa.

Jẹ ki a lo iṣeto ni pẹlu aṣẹ atẹle:

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

Gbogbo awọn iṣẹ ni bayi nilo Iṣakoso Wiwọle orisun-Ipa. Ni awọn ọrọ miiran, iraye si gbogbo awọn iṣẹ jẹ eewọ ati pe yoo ja si esi kan RBAC: access denied. Bayi jẹ ki a gba iwọle si awọn olumulo ti a fun ni aṣẹ.

Wiwọle iṣeto ni fun deede awọn olumulo

Gbogbo awọn olumulo gbọdọ ni iwọle si awọn iṣẹ SA-Frontend ati SA-WebApp. Ti ṣe imuse nipa lilo awọn orisun Istio atẹle:

  • Ipa Iṣẹ - ipinnu awọn ẹtọ ti olumulo ni;
  • IṣẹRoleBinding - pinnu ẹni ti Iṣẹ Iṣẹ yii jẹ ti.

Fun awọn olumulo lasan a yoo gba iraye si awọn iṣẹ kan (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: ["*"]

Ati nipasẹ regular-user-binding lo IṣẹRole si gbogbo awọn alejo oju-iwe (deede-olumulo-iṣẹ-ipa-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"

Njẹ "gbogbo awọn olumulo" tumọ si pe awọn olumulo ti ko ni idaniloju yoo tun ni iwọle si SA WebApp? Rara, eto imulo naa yoo ṣayẹwo iwulo ti ami JWT.

Jẹ ki a lo awọn atunto:

$ 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

Wiwọle iṣeto ni fun awọn oniwontunniwonsi

Fun awọn oniwontunniwonsi, a fẹ lati jẹ ki iraye si gbogbo awọn iṣẹ (moodi-iṣẹ-ipa.yaml):

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

Ṣugbọn a fẹ iru awọn ẹtọ nikan fun awọn olumulo ti ami iraye si ni ẹtọ ninu https://sa.io/group pẹlu itumo Moderators (moodi-iṣẹ-ipa-abuda.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" 

Jẹ ki a lo awọn atunto:

$ 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

Nitori caching ni awọn aṣoju, o le gba to iṣẹju diẹ fun awọn ofin aṣẹ lati ni ipa. O le lẹhinna rii daju wipe awọn olumulo ati awọn oniwontunniwonsi ni orisirisi awọn ipele ti wiwọle.

Ipari lori apakan yii

Ni pataki botilẹjẹpe, njẹ o ti rii irọrun, ailagbara, iwọn ati ọna aabo si ijẹrisi ati aṣẹ?

Awọn orisun Istio mẹta nikan (RbacConfig, ServiceRole, ati ServiceRoleBinding) ni a nilo lati ṣaṣeyọri iṣakoso ti o dara lori ijẹrisi ati aṣẹ ti iraye si olumulo ipari si awọn iṣẹ.

Ni afikun, a ti ṣe abojuto awọn ọran wọnyi lati inu awọn iṣẹ aṣoju wa, ṣiṣe aṣeyọri:

  • idinku iye koodu jeneriki ti o le ni awọn iṣoro aabo ati awọn idun;
  • idinku nọmba awọn ipo aṣiwere ninu eyiti aaye ipari kan ti jade lati wa lati ita ati gbagbe lati jabo rẹ;
  • imukuro iwulo lati ṣe imudojuiwọn gbogbo awọn iṣẹ ni gbogbo igba ti ipa tuntun tabi ẹtọ ti ṣafikun;
  • pe awọn iṣẹ tuntun wa rọrun, aabo ati iyara.

ipari

Istio ngbanilaaye awọn ẹgbẹ lati dojukọ awọn orisun wọn lori awọn iṣẹ ṣiṣe to ṣe pataki ti iṣowo laisi fifi afikun si awọn iṣẹ, yi wọn pada si ipo micro.

Nkan naa (ni awọn ẹya mẹta) pese imọ ipilẹ ati awọn ilana iṣe adaṣe ti o ṣetan fun bibẹrẹ pẹlu Istio ni awọn iṣẹ akanṣe gidi.

PS lati onitumọ

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun