Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Not. werger.: Beşek yekem ev rêze ji bo naskirina kapasîteyên Istio û nîşandana wan di çalakiyê de hate veqetandin, duyem - rêveçûn û rêveberiya seyrûsefera torê ya xweş awazkirî. Naha em ê li ser ewlehiyê biaxivin: ji bo ku fonksiyonên bingehîn ên bi wê re têkildar nîşan bide, nivîskar karûbarê nasnameya Auth0 bikar tîne, lê pêşkêşkerên din dikarin bi rengek wekhev werin mîheng kirin.

Me komek Kubernetes saz kir ku tê de me Istio û mînakek serîlêdana mîkroxizmetê, Analîziya Sentimentê, damezrand da ku kapasîteyên Istio nîşan bide.

Bi Istio re, me karîbû karûbarên xwe piçûk bihêlin ji ber ku ew ne hewce ne ku qatên mîna Dubarekirin, Demjimêr, Circuit Breakers, Tracing, Monitoring. Wekî din, me teknîkên ceribandin û bicîhkirinê yên pêşkeftî bikar anîn: ceribandina A/B, neynikê û avêtina kanariyan.

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Di materyalê nû de, em ê li ser riya nirxa karsaziyê bi qatên paşîn re mijûl bibin: pejirandin û destûr - û li Istio ew kêfxweşiyek rastîn e!

Nasname û destûrname li Istio

Min çu carî bawer nedikir ku ez ê ji pejirandin û destûrnameyê îlham bibim. Istio dikare ji perspektîfek teknolojiyê çi pêşkêşî bike da ku van mijaran ji we re xweş û, hê bêtir, teşwîq bike?

Bersiv hêsan e: Istio berpirsiyariya van kapasîteyan ji karûbarên we vediguhezîne nûnerê Envoy. Wexta ku daxwaz digihîjin karûbaran, ew berê hatine pejirandin û destûr kirin, ji ber vê yekê ya ku hûn bikin ev e ku kodek karsaziyê-karûbar binivîsin.

Çê kirin? Ka em li hundurê xwe binêrin!

Nasname bi Auth0

Wekî serverek ji bo rêveberiya nasname û gihîştinê, em ê Auth0-ê bikar bînin, ku guhertoyek ceribandinê heye, karanîna xwerû ye û ez tenê jê hez dikim. Lêbelê, heman prensîb dikare li ser her yekê din were sepandin Pêkanîna OpenID Connect: KeyCloak, IdentityServer û gelekên din.

Ji bo ku dest pê bikin, biçin Auth0 Portal bi hesabê xwe re, kirêdarek çêbikin (kirêdar - "kirêdar", yekîneya mentiqî ya veqetandinê, ji bo bêtir agahdarî li binêre belgekirin - nêzîkî. werger.) û biçe Serlêdan > Serlêdana xwerûbi hilbijartina Domain, wekî ku di dîmendera jêrîn de tê xuyang kirin:

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Di pelê de vê domainê diyar bike resource-manifests/istio/security/auth-policy.yaml (kanî):

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

Bi çavkaniyek wusa, Pîlot (yek ji sê hêmanên bingehîn ên Balafira Kontrolê li Istio - nêzîkê werger.) Pêşî şandina wan ji karûbaran re Envoy mîheng dike da ku serlêdanan rast bike: sa-web-app и sa-feedback. Di heman demê de, veavakirin ji bo Karûbarê Envoys nayê sepandin sa-frontend, rê dide me ku em pêşiyê nerast bihêlin. Ji bo sepandina Siyasetê, fermanê bimeşînin:

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

Vegerin rûpelê û daxwazek bikin - hûn ê bibînin ku ew bi statûyê bi dawî dibe 401 Nayê qedexe kirin. Naha werin em bikarhênerên pêşîn beralî bikin ku bi Auth0-ê verast bikin.

Serlêdankirina daxwazên bi Auth0

Ji bo rastkirina daxwazên bikarhênerê paşîn, hûn hewce ne ku API-yek li Auth0-ê biafirînin ku dê karûbarên pejirandî (nirxandin, hûrgulî, û nirxan) temsîl bike. Ji bo afirandina API-ê, biçin Auth0 Portal> API> API biafirînin û formê dagirin:

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Agahdariya girîng li vir e Nasname, ku em ê paşê di skrîptê de bikar bînin. Ka em bi vî awayî binivîsin:

  • Binêrevan: {YOUR_AUDIENCE}

Agahiyên mayî yên ku em hewce ne li ser Portalê Auth0 di beşê de ne Applications - hilbijêre Serlêdana Testê (bi API-ê bixweber hatî çêkirin).

Li vir em ê binivîsin:

  • Domain: {YOUR_DOMAIN}
  • Nasnameya Xerîdar: {YOUR_CLIENT_ID}

Scroll to Serlêdana Testê li qada nivîsê Navnîşanên Callback Destûrdar (URL-yên çareserkirî yên ji bo vegerandina bangê), ku tê de em URL-ya ku divê piştî pejirandinê qediya, li ku derê were şandin destnîşan dikin. Di rewşa me de ev e:

http://{EXTERNAL_IP}/callback

For ji bo URLên Derketinê yên Destûrdar (URLyên destûr ji bo derketinê) lê zêde bike:

http://{EXTERNAL_IP}/logout

Werin em herin pêşiyê.

Rojanekirina Frontend

Switch bo şaxê auth0 depo [istio-mastery]. Di vê şaxê de, koda pêşîn tê guheztin da ku bikarhêneran ji bo pejirandinê berbi Auth0 vegerîne û di daxwazên karûbarên din de nîşana JWT bikar bîne. Ya paşîn bi vî rengî pêk tê (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));
}

Ji bo guhertina pêşiyê ku daneyên kirêdar li Auth0 bikar bînin, vekin sa-frontend/src/services/Auth.js û nirxên ku me li jor nivîsîbûn tê de biguhezînin (Auth.js):

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

Serlêdan amade ye. Dema ku guheztinên çêkirî ava kirin û bicîh kirin ID-ya Docker-a xwe di fermanên jêrîn de diyar bikin:

$ 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

Serlêdanê biceribînin! Hûn ê ji nû ve werin veguheztin Auth0, ku hûn hewce ne ku têkevinê (an qeyd bikin), pişt re hûn ê ji rûpela ku jixwe daxwaznameyên erêkirî têne kirin werin şandin. Ger hûn emrên ku di beşên yekem ên gotarê de bi curl hatine destnîşan kirin biceribînin, hûn ê kodê bistînin 401 Koda Rewşa, nîşan dide ku daxwaz ne destûr e.

Werin em gava paşîn bavêjin - destûr bidin daxwaziyan.

Destûrdana bi Auth0

Nasname rê dide me ku em fêm bikin ka bikarhêner kî ye, lê destûr tê xwestin ku meriv zanibe ku ew gihîştina çi ye. Istio ji bo vê jî amûran pêşkêşî dike.

Wek nimûne, em du komên bikarhêneran biafirînin (li diagrama jêrîn binêrin):

  • Bikarhêner (bikarhêner) - bi tenê gihîştina karûbarên SA-WebApp û SA-Frontend;
  • Moderator (moderator) - bi gihîştina her sê karûbaran.

Bi Istio re vegerin ser mîkroxizmetan. Beş 3
Konsepta Desthilatdariyê

Ji bo afirandina van koman, em ê dirêjkirina Destûrnameya Auth0 bikar bînin û Istio bikar bînin da ku ji wan re astên cûda yên gihîştinê peyda bikin.

Sazkirin û veavakirina Destûrnameya Auth0

Di portalê Auth0 de, biçin pêvekan (niçikan) û saz bikin Destûrnameya Auth0. Piştî sazkirinê, biçin Berfirehkirina Desthilatdariyê, û li wir - ji bo veavakirina kirêdar bi tikandina li jorê rastê û bijartina vebijarka menuya guncaw (Veavakirina). Koman çalak bikin (Grûp) û li ser bişkoka qaîdeya weşanê bikirtînin (Qanûna Weşandinê).

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Avakirina koman

Di Berfirehkirina Destûrnameyê de biçin Groups û komekê ava bikin Moderator. Ji ber ku em ê hemî bikarhênerên pejirandî wekî bikarhênerên birêkûpêk derman bikin, ne hewce ye ku ji wan re komek din biafirînin.

Komek hilbijêrin Moderator, Çapemenî bike Endaman zêde bikin, hesabê xweya sereke lê zêde bike. Hin bikarhêneran bêyî komê bihêlin da ku pê ewle bibin ku ew gihîştina wan nayê red kirin. (Bikarhênerên nû dikarin bi destan werin afirandin Auth0 Portal> Bikarhêner> Bikarhêner Biafirînin.)

Daxwaza Komê li Tokena Têketinê zêde bikin

Bikarhêner li koman hatine zêdekirin, lê divê ev agahdarî di nîşaneyên gihîştinê de jî were xuyang kirin. Ji bo ku bi OpenID Connect-ê re tevbigerin û di heman demê de komên ku em hewce ne vegerînin, pêdivî ye ku token ya xwe zêde bike îdîaya custom. Bi rêgezên Auth0 ve hatî bicîh kirin.

Ji bo afirandina qaîdeyek, biçin Auth0 Portal qaîdeyên, Çapemenî bike Rêgez biafirîne û qaîdeyek vala ji şablonan hilbijêrin.

Bi Istio re vegerin ser mîkroxizmetan. Beş 3

Koda jêrîn kopî bikin û wekî qaîdeyek nû hilînin Daxwaza Komê lê zêde bike (namespacedGroup.js):

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

bingotin: Ev kod yekem koma bikarhênerê ya ku di Berfirehkirina Destûrnameyê de hatî destnîşan kirin digire û wekî îdîayek xwerû (li binê cîhê navê wê, wekî ku ji hêla Auth0 ve tê xwestin) li tokena gihîştinê zêde dike.

Vegere rûpelê qaîdeyên û kontrol bikin ku we du qaîdeyên bi rêza jêrîn hatine nivîsandin:

  • auth0-authorization-extension
  • Daxwaza Komê lê zêde bike

Rêz girîng e ji ber ku qada komê qaîdeyê asynkron distîne auth0-authorization-extension û piştî wê jî ji aliyê qaîdeya duyemîn ve wekî îdîayek tê zêdekirin. Encam nîşanek gihîştina bi vî rengî ye:

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

Naha hûn hewce ne ku proxy Envoy mîheng bikin da ku gihîştina bikarhêner kontrol bike, ji bo ku kom dê ji îdîayê were derxistin (https://sa.io/group) di nîşana gihîştina vegerî de. Ev mijar ji bo beşa paşîn a gotarê ye.

Veavakirina destûrnameyê li Istio

Ji bo ku destûr kar bike, divê hûn RBAC ji bo Istio çalak bikin. Ji bo vê yekê, em ê veavakirina jêrîn bikar bînin:

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" 

Ravekirin:

  • 1 - RBAC tenê ji bo karûbar û cîhên navên ku di zeviyê de têne navnîş kirin çalak bikin Inclusion;
  • 2 - em navnîşek karûbarên xwe navnîş dikin.

Ka em bi fermana jêrîn veavakirinê bicîh bînin:

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

Hemî karûbar naha hewceyê Kontrola Gihîştina Bingeha Rol in. Bi gotineke din, gihîştina hemî karûbaran qedexe ye û dê bibe bersiv RBAC: access denied. Naha em destûrê bidin gihîştina bikarhênerên destûrdar.

Veavakirina gihîştina ji bo bikarhênerên birêkûpêk

Pêdivî ye ku hemî bikarhêner bigihîjin karûbarên SA-Frontend û SA-WebApp. Bi karanîna çavkaniyên Istio yên jêrîn ve hatî bicîh kirin:

  • ServiceRole - mafên ku bikarhêner heye destnîşan dike;
  • ServiceRoleBinding - diyar dike ku ev ServiceRole ji kê re ye.

Ji bo bikarhênerên asayî em ê destûr bidin ku bigihîjin hin karûbaran (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: ["*"]

Û bi rêya regular-user-binding Servîsa Role ji hemî mêvanên rûpelê re bicîh bikin (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"

Ma "hemû bikarhêner" tê vê wateyê ku bikarhênerên nenaskirî jî dê bigihîjin SA WebApp-ê? Na, polîtîka dê rastdariya nîşana JWT kontrol bike.

Ka em mîhengan bicîh bînin:

$ 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

Veavakirina gihîştina ji bo moderatoran

Ji bo moderatoran, em dixwazin ku gihîştina hemî karûbaran çalak bikin (mod-service-role.yaml):

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

Lê em mafên weha tenê ji bo wan bikarhênerên ku tokena gihîştina wan îdîa heye dixwazin https://sa.io/group bi wate 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" 

Ka em mîhengan bicîh bînin:

$ 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

Ji ber veşartina li nûneran, dibe ku çend hûrdeman bidome da ku qaîdeyên destûrnameyê bicîh bibin. Dûv re hûn dikarin piştrast bikin ku bikarhêner û moderator xwedan astên cûda yên gihîştinê ne.

Encam li ser vê beşê

Lêbelê, bi ciddî, ​​we qet nêzîkatiyek hêsan, bêhêz, berbelav û ewledar a rastkirin û destûrnameyê dîtiye?

Tenê sê çavkaniyên Istio (RbacConfig, ServiceRole, û ServiceRoleBinding) hewce bûn ku bigihîjin kontrolek hûrgelê ya li ser verastkirin û destûrdana gihîştina bikarhênerê dawî ya karûbaran.

Ji bilî vê, me ji xizmetên xwe yên nûnerê van mijaran tedbîr girt û bi dest xist:

  • kêmkirina mîqdara koda gelemperî ya ku dibe ku pirsgirêk û xeletiyên ewlehiyê hebin;
  • kêmkirina hejmara rewşên ehmeqî ku tê de yek xala dawî ji derve ve tê gihîştin û ji bîr kir ku wê rapor bike;
  • rakirina hewcedariya nûvekirina hemî karûbaran her gava ku rolek an rastek nû tê zêdekirin;
  • ku karûbarên nû hêsan, ewledar û bilez bimînin.

encamê

Istio destûrê dide tîmê ku çavkaniyên xwe li ser karên krîtîk ên karsaziyê bêyî zêdekirina sermayê li karûbaran, vegerandina wan li ser statûya mîkro bisekine.

Gotar (ji sê beşan) zanîna bingehîn û rêwerzên pratîkî yên amade ji bo destpêkirina bi Istio di projeyên rastîn de peyda kir.

PS ji wergêr

Li ser bloga me jî bixwînin:

Source: www.habr.com

Add a comment