αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž…αŸ†αžŽαžΆαŸ†αŸ” αž”αž€αž”αŸ’αžšαŸ‚: αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„ αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž§αž‘αŸ’αž‘αž·αžŸαžŠαž›αŸ‹αž€αžΆαžšαžŸαŸ’αž‚αžΆαž›αŸ‹αžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹ Istio αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž‘αžΈαž–αžΈαžš - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αžšαžΆαž…αžšαžŽαŸαž”αžŽαŸ’αžαžΆαž‰αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž™αŸ‰αžΆαž„αž›αŸ’αž’αž·αžαž›αŸ’αž’αž“αŸ‹αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž˜αž»αžαž„αžΆαžšαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αžœαžΆ αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽ Auth0 αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž˜αžšαž”αŸ€αž”αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸαŸ‡αŸ”

αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Istio αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ microservice αž€αžΆαžšαžœαž·αž—αžΆαž‚αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹ Istio αŸ”

αž‡αžΆαž˜αž½αž™αž“αžΉαž„ Istio αž™αžΎαž„αž’αžΆαž…αžšαž€αŸ’αžŸαžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αž±αŸ’αž™αž“αŸ…αžαžΌαž… αžŠαŸ„αž™αžŸαžΆαžšαž–αž½αž€αž‚αŸαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž’αž“αž»αžœαžαŸ’αžαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžŠαžΌαž…αž‡αžΆ αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αž‘αžΎαž„αžœαž·αž‰ αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αžŸαŸ€αž‚αŸ’αžœαžΈ αž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αŸ– αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž A/B αž€αžΆαžšαž†αŸ’αž›αž»αŸ‡αž€αž‰αŸ’αž…αž€αŸ‹ αž“αž·αž„αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Canary αŸ”

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αŸ’αž—αžΆαžšαŸˆαžαŸ’αž˜αžΈ αž™αžΎαž„αž“αžΉαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž›αžΎαž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαž˜αŸ’αž›αŸƒαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αŸ– αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž - αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Istio αžœαžΆαž–αž·αžαž‡αžΆαžšαžΈαž€αžšαžΆαž™αžŽαžΆαžŸαŸ‹!

αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž“αŸ…αž€αŸ’αž“αž»αž„ Istio

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžŠαŸ‚αž›αž‡αžΏαžαžΆαžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž•αž»αžŸαž‚αŸ†αž“αž·αžαžŠαŸ„αž™αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ” តើ Istio αž’αžΆαž…αž•αŸ’αžαž›αŸ‹αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αž–αžΈαž‘αžŸαŸ’αžŸαž“αŸˆαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αžΆαž“αž—αžΆαž–αžŸαž”αŸ’αž”αžΆαž™αžšαžΈαž€αžšαžΆαž™ αž αžΎαž™αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž€αžΆαžšαž”αŸ†αž•αž»αžŸαž‚αŸ†αž“αž·αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€?

αž…αž˜αŸ’αž›αžΎαž™αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αŸ– Istio αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αžŸαž˜αžαŸ’αžαž—αžΆαž–αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž–αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ…αž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈ Envoy αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžˆαžΆαž“αžŠαž›αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαžšαž½αž…αž αžΎαž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αŸ”

αž–αž·αžαž‡αžΆβ€‹αž›αŸ’αž’β€‹αžŽαžΆαžŸαŸ‹? αžαŸ„αŸ‡αž˜αžΎαž›αžαžΆαž„αž€αŸ’αž“αž»αž„!

αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‡αžΆαž˜αž½αž™ Auth0

αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽ αž“αž·αž„αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ Auth0 αžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αžŸαžΆαž€αž›αŸ’αž”αž„ αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžœαž·αž…αžΆαžšαžŽαž‰αžΆαžŽαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž…αžΌαž›αž…αž·αžαŸ’αžαžœαžΆαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž’αŸ’αžœαžΈαŸ—αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž OpenID ConnectαŸ– KeyCloak, IdentityServer αž“αž·αž„αž’αŸ’αž“αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αžœαž·αž”αž•αžαžαž› Auth0 αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž‡αž½αž› (αž—αžαž·αž€αŸˆ - "αž—αžαž·αž€αŸˆ" αž―αž€αžαžΆαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž“αŸƒαž—αžΆαž–αž―αž€αŸ„ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαžŸαžΌαž˜αž˜αžΎαž› αž―αž€αžŸαžΆαžš - αž”αŸ’αžšαž αŸ‚αž› αž”αž€αž”αŸ’αžšαŸ‚αŸ” ) αž αžΎαž™αž‘αŸ… αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ > αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αžŠαŸ„αž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ αžŠαŸ‚αž“αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ‚αž“αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš resource-manifests/istio/security/auth-policy.yaml (αž”αŸ’αžšαž—αž–):

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

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αž“αž’αžΆαž“αž”αŸ‚αž”αž“αŸαŸ‡ Pilot (αž’αžΆαžαž»αž•αŸ’αžŸαŸ†αž˜αž½αž™αž“αŸƒαž™αž“αŸ’αžαž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αžΆαŸ†αž„αž”αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ Istio - αž”αŸ’αžšαž αŸ‚αž›αŸ” αž”αž€αž”αŸ’αžšαŸ‚αŸ” ) αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸαžŸαž€αž‡αž“αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŸαŸ†αžŽαžΎ αž˜αž»αž“αž–αŸαž›αž”αž‰αŸ’αž‡αžΌαž“αž–αž½αž€αž‚αŸαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ– sa-web-app ΠΈ sa-feedback. αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αžŸαŸαžœαžΆ Envoys αž‘αŸαŸ” sa-frontendαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž…αžΆαž€αž…αŸαž‰αž–αžΈ frontend αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž‚αŸ„αž›αž€αžΆαžšαžŽαŸ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

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

αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž‘αŸ†αž–αŸαžšαž αžΎαž™αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎ - αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αžαžΆαžœαžΆαž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αžŸαŸ’αžαžΆαž“αž—αžΆαž– 401 αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž. αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αžŸαžΌαž˜β€‹αž”αŸ’αžŠαžΌαžšβ€‹αž‘αž·αžŸβ€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎ frontend αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹β€‹αž‡αžΆαž˜αž½αž™ Auth0αŸ”

αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŸαŸ†αžŽαžΎαž‡αžΆαž˜αž½αž™ Auth0

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŸαŸ†αžŽαžΎαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαž API αž€αŸ’αž“αž»αž„ Auth0 αžŠαŸ‚αž›αž“αžΉαž„αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ (αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™ αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αž αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒ)αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž API αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Auth0 Portal > APIs > αž”αž„αŸ’αž€αžΎαž API αž αžΎαž™αž”αŸ†αž–αŸαž‰αž‘αž˜αŸ’αžšαž„αŸ‹αž”αŸ‚αž”αž”αž‘αŸ–

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž–αŸαžαŸŒαž˜αžΆαž“αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊ αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαŸ”αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ” αž…αžΌαžšαž™αžΎαž„αžŸαžšαžŸαŸαžšαžœαžΆαžŠαžΌαž…αž“αŸαŸ‡αŸ–

  • αž‘αžŸαŸ’αžŸαž“αž·αž€αž‡αž“αŸ– {YOUR_AUDIENCE}

αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž›αžΎαžœαž·αž”αž•αžαžαž› Auth0 αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ αž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ - αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ (αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžšαž½αž˜αž‡αžΆαž˜αž½αž™ API) αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžŸαžšαžŸαŸαžšαŸ–

  • αžŠαŸ‚αž“αŸ– {YOUR_DOMAIN}
  • αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž’αžαž·αžαž·αž‡αž“αŸ– {YOUR_CLIENT_ID}

αžšαž˜αžΌαžšαž‘αŸ… αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ αž‘αŸ…αžœαžΆαž›αž’αžαŸ’αžαž”αž‘ URLs αž αŸ…αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαž (αž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ URLs αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž αŸ…αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰) αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αž™αžΎαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ URL αžŠαŸ‚αž›αž€αžΆαžšαž αŸ…αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αžœαžΆαž‚αžΊαŸ–

http://{EXTERNAL_IP}/callback

αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αž’αž“αž»αž‰αŸ’αž‰αžΆαž URL αž…αŸαž‰ (αž’αž“αž»αž‰αŸ’αž‰αžΆαž URLs αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸαž‰) αž”αž“αŸ’αžαŸ‚αž˜αŸ–

http://{EXTERNAL_IP}/logout

αžαŸ„αŸ‡αž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαŸ”

αž€αžΆαžšαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž

αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ auth0 αžƒαŸ’αž›αžΆαŸ†αž„ [istio-mastery]. αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž“αŸαŸ‡ αž›αŸαžαž€αžΌαžŠαžαžΆαž„αž˜αž»αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹ Auth0 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆ JWT αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž€αŸ’αžšαŸ„αž™αž˜αž€αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ (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));
}

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ’αž“αž€αž‡αž½αž›αž€αŸ’αž“αž»αž„ Auth0 αžŸαžΌαž˜αž”αžΎαž€ sa-frontend/src/services/Auth.js αž αžΎαž™αž‡αŸ†αž“αž½αžŸαžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŸαžšαžŸαŸαžšαžαžΆαž„αž›αžΎ (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° послС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
}

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž½αž…αžšαžΆαž›αŸ‹αž αžΎαž™αŸ” αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ Docker αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαŸ–

$ 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

αžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ! αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ… Auth0 αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž› (αž¬αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžšαž½αž…αž αžΎαž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŸαžΆαž€αž›αŸ’αž”αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αž“αŸƒαž’αžαŸ’αžαž”αž‘αž‡αžΆαž˜αž½αž™ curl αž’αŸ’αž“αž€αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž›αŸαžαž€αžΌαžŠ 401 αž›αŸαžαž€αžΌαžŠαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αžΆαžŸαž‰αŸ’αž‰αžΆαžαžΆαžŸαŸ†αžŽαžΎαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ”

αžαŸ„αŸ‡αž‘αŸ…αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹ - αž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŸαŸ†αžŽαžΎαŸ”

αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž‡αžΆαž˜αž½αž™ Auth0

αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž™αž›αŸ‹αžαžΆαž’αŸ’αž“αž€αžŽαžΆαž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž‚αžΊαžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αžŠαžΉαž„αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” Istio αž•αŸ’αžαž›αŸ‹αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž•αž„αžŠαŸ‚αžšαŸ”

αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αžΈαžš (αžŸαžΌαž˜αž˜αžΎαž›αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžαžΆαž„αž€αŸ’αžšαŸ„αž˜)αŸ–

  • αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” (αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹) β€” αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αž…αžΌαž›β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ‚β€‹αžŸαŸαžœαžΆ SA-WebApp αž“αž·αž„ SA-Frontend;
  • αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž› (αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›) - αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž”αžΈαŸ”

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3
αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž Auth0 αž αžΎαž™αž”αŸ’αžšαžΎ Istio αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž–αž½αž€αž‚αŸαž“αžΌαžœαž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž Auth0

αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž”αž•αžαžαž› Auth0 αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ (αž•αŸ’αž“αŸ‚αž€β€‹αž”αž“αŸ’αžαŸ‚αž˜) αž“αž·αž„αžŠαŸ†αž‘αžΎαž„ αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž 0. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž αžΎαž™αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ - αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αž½αž›αžŠαŸ„αž™αž…αž»αž…αž›αžΎαž€αŸ†αž–αžΌαž›αžαžΆαž„αžŸαŸ’αžαžΆαŸ† αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‡αž˜αŸ’αžšαžΎαžŸαž˜αŸ‰αžΊαž“αž»αž™αžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™ (αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’). αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αŸ’αžšαž»αž˜αžŸαž€αž˜αŸ’αž˜ (αž€αŸ’αžšαž»αž˜) αž αžΎαž™αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„ αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž…αŸ’αž”αžΆαž”αŸ‹ (αž…αŸ’αž”αžΆαž”αŸ‹αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™).

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜

αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αž€αŸ’αžšαž»αž˜ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜ αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›. αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž“αžΉαž„αž…αžΆαžαŸ‹αž‘αž»αž€αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆ αž“αŸ„αŸ‡αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž‚αŸαž‘αŸαŸ”

αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αŸ’αžšαž»αž˜ αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›, αž…αž»αž…β€‹αž›αžΎ αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αžΆαž‡αž·αž€αž”αž“αŸ’αžαŸ‚αž˜αž‚αžŽαž“αžΈαž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž‘αž»αž€αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ’αžšαž»αž˜αžŽαžΆαž˜αž½αž™ αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” (αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αžŠαŸƒαžαžΆαž˜αžšαž™αŸˆ αžœαž·αž”αž•αžαžαž› Auth0 > αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ > αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹.)

αž”αž“αŸ’αžαŸ‚αž˜β€‹αž€αžΆαžšβ€‹αž‘αžΆαž˜αž‘αžΆαžšβ€‹αž€αŸ’αžšαž»αž˜β€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹αžŸαž‰αŸ’αž‰αžΆβ€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αž…αžΌαž›β€‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹

αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αŸ’αžšαž»αž˜ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αž“αŸαŸ‡β€‹αž€αŸβ€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αžŸαž‰αŸ’αž‰αžΆβ€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αž…αžΌαž›β€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αž›αŸ„αž˜αžαžΆαž˜ OpenID Connect αž αžΎαž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž”αŸ’αžšαž‚αž›αŸ‹αž€αŸ’αžšαž»αž˜αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžšαž”αžŸαŸ‹αžœαžΆ αž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“. αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž™αŸˆαž…αŸ’αž”αžΆαž”αŸ‹ Auth0 αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹ αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Auth0 Portal αž‘αŸ… αž€αŸ’αž”αž½αž“, αž…αž»αž…β€‹αž›αžΎ αž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹ αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž…αŸ’αž”αžΆαž”αŸ‹αž‘αž‘αŸαž–αžΈαž‚αŸ†αžšαžΌαŸ”

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž‡αžΆαž˜αž½αž™ Istio αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 3

αž…αž˜αŸ’αž›αž„αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž‡αžΆαž…αŸ’αž”αžΆαž”αŸ‹αžαŸ’αž˜αžΈαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžšαž€αŸ’αžšαž»αž˜ (namespacedGroup.js):

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

αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αŸ– αž€αžΌαžŠαž“αŸαŸ‡αž™αž€αž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎαž‡αžΆαž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ (αž€αŸ’αžšαŸ„αž˜αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžœαžΆ αžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαŸ„αž™ Auth0)αŸ”

αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αž‘αŸ†αž–αŸαžš αž€αŸ’αž”αž½αž“ αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αŸ’αž“αž€αž˜αžΆαž“αž…αŸ’αž”αžΆαž”αŸ‹αž–αžΈαžšαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

  • auth0-authorization-extension
  • αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžšαž€αŸ’αžšαž»αž˜

αž›αŸ†αžŠαžΆαž”αŸ‹β€‹αž‚αžΊβ€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αž–αŸ’αžšαŸ„αŸ‡β€‹αžœαžΆαž›β€‹αž€αŸ’αžšαž»αž˜β€‹αž‘αž‘αž½αž›β€‹αž€αŸ’αž”αž½αž“β€‹αžŠαŸ„αž™β€‹αž’αžŸαž˜αž€αžΆαž› auth0-authorization-extension αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‡αžΆαž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžšαžŠαŸ„αž™αž…αŸ’αž”αžΆαž”αŸ‹αž‘αžΈαž–αžΈαžšαŸ” αž›αž‘αŸ’αž’αž•αž›αž‚αžΊαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αž₯αž‘αžΌαžœαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈ Envoy αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αžŠαŸ‚αž›αž€αŸ’αžšαž»αž˜αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž…αŸαž‰αž–αžΈαž€αžΆαžšαž‘αžΆαž˜αž‘αžΆαžš (https://sa.io/group) αž“αŸ…αž€αŸ’αž“αž»αž„αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž…αžΌαž›αž”αŸ’αžšαžΎαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž“αŸ…αž€αŸ’αž“αž»αž„ Istio

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αžΎαž€ RBAC αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ IstioαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

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" 

αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αŸˆ

  • 1 β€” αž”αžΎαž€ RBAC αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž“αž·αž„αž…αž“αŸ’αž›αŸ„αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž›αž”αžΆαž“αžšαžΆαž™αž€αŸ’αž“αž»αž„αžœαžΆαž› Inclusion;
  • 2 - αž™αžΎαž„αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αžαŸ„αŸ‡αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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

αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž₯αž‘αžΌαžœαž“αŸαŸ‡αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžαž½αž“αžΆαž‘αžΈαŸ” αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αž αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αžΆαž˜αžƒαžΆαžαŸ‹ αž αžΎαž™αž“αžΉαž„αž˜αžΆαž“αž›αž‘αŸ’αž’αž•αž›αž†αŸ’αž›αžΎαž™αžαž” RBAC: access denied. αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αžΌαž›αž”αŸ’αžšαžΎαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ”

αž…αžΌαž›αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆαŸ”

αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ SA-Fronten αž“αž·αž„ SA-WebApp αŸ” αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αž“αž’αžΆαž“ Istio αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αžαž½αž“αžΆαž‘αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ - αž€αŸ†αžŽαžαŸ‹αžŸαž·αž‘αŸ’αž’αž·αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αžΆαž“;
  • αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ β€” αž€αŸ†αžŽαžαŸ‹αžαžΆαžαžΎαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡ αž‡αžΆαž€αž˜αŸ’αž˜αžŸαž·αž‘αŸ’αž’αž·αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŽαžΆαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆ αž™αžΎαž„αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αž½αž™αž…αŸ†αž“αž½αž“ (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: ["*"]

αž“αž·αž„αžαžΆαž˜αžšαž™αŸˆ regular-user-binding αž’αž“αž»αžœαžαŸ’αž ServiceRole αžŠαž›αŸ‹αž’αŸ’αž“αž€αž‘αžŸαŸ’αžŸαž“αžΆαž‘αŸ†αž–αŸαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (normal-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"

តើ "αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹" αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž“αžΉαž„αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎ SA WebApp αžŠαŸ‚αžšαž¬αž‘αŸ? αž‘αŸ αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŸαž»αž–αž›αž—αžΆαž–αž“αŸƒαž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆ JWT αŸ”

αžαŸ„αŸ‡αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ–

$ 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

αž…αžΌαž›αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž› αž™αžΎαž„αž…αž„αŸ‹αž”αžΎαž€αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (mod-service-role.yaml):

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

αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž™αžΎαž„β€‹αž…αž„αŸ‹β€‹αž”αžΆαž“β€‹αžŸαž·αž‘αŸ’αž’αž·β€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αžαŸ‚β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžŠαŸ‚αž›β€‹αžŸαž‰αŸ’αž‰αžΆβ€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αž…αžΌαž›β€‹αž”αŸ’αžšαžΎβ€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž‘αžΆαž˜αž‘αžΆαžšβ€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” https://sa.io/group αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžαŸ’αžαž“αŸαž™ 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" 

αžαŸ„αŸ‡αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ–

$ 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

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž”αŸαžŸαž€αž‡αž“αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αžœαžΆαž’αžΆαž…αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž–αžΈαžšαž”αžΈαž“αžΆαž‘αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž…αŸ’αž”αžΆαž”αŸ‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž…αžΌαž›αž‡αžΆαž’αžšαž˜αžΆαž“αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αžΆαžαžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›αž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαž»αžŸαŸ—αž‚αŸ’αž“αžΆαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“αž›αžΎαž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡αŸ”

αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αžαžΎαž’αŸ’αž“αž€αž’αŸ’αž›αžΆαž”αŸ‹αžƒαžΎαž‰αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαžΆαž˜αž‰αŸ’αž‰ αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŠαŸ‚αžšαž¬αž‘αŸ?

αž˜αžΆαž“αžαŸ‚αž’αž“αž’αžΆαž“ Istio αž”αžΈαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (RbacConfig, ServiceRole, αž“αž·αž„ ServiceRoleBinding) αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžš αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž‚αž»αžŽαž—αžΆαž–αž›αžΎαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž²αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž™αžΎαž„αž”αžΆαž“αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎαž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž…αŸαž‰αž–αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αŸαžŸαž€αž‡αž“αžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ„αž™αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαŸ–

  • αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž…αŸ†αž“αž½αž“αž€αžΌαžŠαž‘αžΌαž‘αŸ…αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž€αŸ†αž αž»αžŸαŸ”
  • αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž…αŸ†αž“αž½αž“αž“αŸƒαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž†αŸ„αžαž›αŸ’αž„αž„αŸ‹αžŠαŸ‚αž›αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹αž˜αž½αž™αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž’αžΆαž…αž…αžΌαž›αž”αžΆαž“αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ…αž αžΎαž™αž—αŸ’αž›αŸαž…αžšαžΆαž™αž€αžΆαžšαžŽαŸαžœαžΆ;
  • αž€αžΆαžšαž›αž»αž”αž”αŸ†αž”αžΆαžαŸ‹αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαž½αž“αžΆαž‘αžΈαžαŸ’αž˜αžΈ αž¬αžŸαž·αž‘αŸ’αž’αž·αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αŸ”
  • αžαžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αž˜αžΈαž“αŸ…αžαŸ‚αžŸαžΆαž˜αž‰αŸ’αž‰ αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž›αžΏαž“αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

Istio αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αŸ’αžšαž»αž˜αž•αŸ’αžαŸ„αžαž›αžΎαž’αž“αž’αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž›αžΎαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž˜αž·αž“αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αžŠαŸ„αž™αž”αž„αŸ’αžœαŸ‚αžšαž–αž½αž€αž‚αŸαž‘αŸ…αž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžαŸ’αž“αžΆαžαžαžΌαž…αžœαž·αž‰αŸ”

αž’αžαŸ’αžαž”αž‘ (αž‡αžΆαž”αžΈαž•αŸ’αž“αŸ‚αž€) αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ Istio αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž–αž·αžαŸ”

PS αž–αžΈαž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚

αžŸαžΌαž˜αž’αžΆαž“αž•αž„αžŠαŸ‚αžšαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹