ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex

ืื™ืš ืคืึธืจืฉื˜ืขืœืŸ ืฆื• ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืึท ื˜ื•ื˜ืึธืจื™ืึทืœ ืคึฟืึทืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ืึทืงืกืขืก ืฆื• ืึท Kubernetes ืงื ื•ื™ืœ ื ื™ืฆืŸ Dex, dex-k8s-authenticator ืื•ืŸ GitHub.

ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
ืœืืงืืœืข ืžืขืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืจื•ืกื™ืฉ-ืฉืคึผืจืึทืš Kubernetes ืฉืžื•ืขืกืŸ ืื™ืŸ ื˜ืขืœืขื’ืจืึทื

ื”ืงื“ืžื”

ืžื™ืจ ื ื•ืฆืŸ Kubernetes ืฆื• ืฉืึทืคึฟืŸ ื“ื™ื ืึทืžื™ืฉ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ืคึฟืึทืจ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื•ืŸ ืงืึท ืžืึทื ืฉืึทืคึฟื˜. ืึทื–ื•ื™ ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื’ืขื‘ืŸ ื–ื™ื™ ืึทืงืกืขืก ืฆื• ื“ื™ ืงื ื•ื™ืœ ืคึฟืึทืจ ื‘ื™ื™ื“ืข ื“ื™ ื“ืึทืฉื‘ืึธืจื“ ืื•ืŸ ืงื•ื‘ืขืงื˜ืœ. ื ื™ื˜ ืขื ืœืขืš OpenShift, ื•ื•ืึทื ื™ืœ ืงื•ื‘ืขืจื ืขื˜ืขืก ื”ืื˜ ื ื™ืฉื˜ ื’ืขื‘ื•ื™ืจืŸ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ, ืึทื–ื•ื™ ืžื™ืจ ื ื•ืฆืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ืžื›ืฉื™ืจื™ื ืคึฟืึทืจ ื“ืขื.

ืื™ืŸ ื“ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืžื™ืจ ื ื•ืฆืŸ:

  • dex-k8s-authenticatorโ€Š - ื•ื•ืขื‘ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ kubectl config
  • ื“ืขืงืก - OpenID Connect ืฉืคึผื™ื™ึทื–ืขืจ
  • GitHub - ืคืฉื•ื˜ ื•ื•ื™ื™ึทืœ ืžื™ืจ ื ื•ืฆืŸ GitHub ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคื™ืจืžืข

ืžื™ืจ ื’ืขืคืจื•ื•ื•ื˜ ืฆื• ื ื•ืฆืŸ Google OIDC, ืึธื‘ืขืจ ืœื™ื™ื“ืขืจ ืžื™ืจ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ื–ื™ื™ ืžื™ื˜ ื’ืจื•ืคึผืขืก, ืึทื–ื•ื™ ื“ื™ ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ืžื™ื˜ GitHub ืคึผืึทืกื™ืง ืื•ื ื“ื– ื’ืึทื ืฅ ื’ื•ื˜. ืึธืŸ ื’ืจื•ืคึผืข ืžืึทืคึผื™ื ื’, ืขืก ื•ื•ืขื˜ ื ื™ื˜ ื–ื™ื™ืŸ ืžืขื’ืœืขืš ืฆื• ืฉืึทืคึฟืŸ RBAC ืคึผืึทืœืึทืกื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื’ืจื•ืคึผืขืก.

ื•ื•ื™ ืึทื–ื•ื™ ืึทืจื‘ืขื˜ ืื•ื ื“ื–ืขืจ Kubernetes ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืคึผืจืึธืฆืขืก ืื™ืŸ ืึท ื•ื•ื™ื–ืฉืึทื•ื•ืึทืœ ืคืึทืจื˜ืจืขื˜ื•ื ื’:

ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืคึผืจืึธืฆืขืก

ื ื‘ื™ืกืœ ืžืขืจ ื“ืขื˜ืึทืœ ืื•ืŸ ืคื•ื ื˜ ื“ื•ืจืš ืคื•ื ื˜:

  1. ื‘ืึทื ื™ืฆืขืจ ืœืึธื’ืก ืื™ืŸ dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator ืคืึธืจื•ื•ืขืจื“ื™ื“ ื“ื™ ื‘ืงืฉื” ืฆื• Dex (dex.k8s.example.com)
  3. ื“ืขืงืก ืจื™ื“ืขืจืขืงืฅ ืฆื• ื“ื™ GitHub ืœืึธื’ื™ืŸ ื‘ืœืึทื˜
  4. GitHub ื“ื–ืฉืขื ืขืจื™ื™ืฅ ื“ื™ ื ื™ื™ื˜ื™ืง ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ืงืขืจื˜ ืขืก ืฆื• Dex
  5. Dex ืคึผืึทืกื™ื– ื“ื™ ื‘ืืงื•ืžืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืฆื• dex-k8s-authenticator
  6. ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื‘ืืงื•ืžื˜ ืึทืŸ OIDC ื˜ืึธืงืขืŸ ืคึฟื•ืŸ GitHub
  7. dex-k8s-authenticator ืžื•ืกื™ืฃ ืกื™ืžืขืŸ ืฆื• kubeconfig
  8. kubectl ืคึผืึทืกื™ื– ื“ื™ ืกื™ืžืขืŸ ืฆื• KubeAPIServer
  9. KubeAPIServer ืงืขืจื˜ ืึทืงืกืขืก ืฆื• kubectl ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืกื™ืžืขืŸ
  10. ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื‘ืึทืงื•ืžืขืŸ ืึทืงืกืขืก ืคึฟื•ืŸ kubectl

ืคึผืจืขืคึผืึทืจืึทื˜ืึธืจื™ ืึทืงื˜ื™ื•ื•ื™ื˜ืขื˜ืŸ

ื“ืึธืš, ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืึท ืงื•ื‘ืขืจื ืขื˜ืขืก ืงื ื•ื™ืœ (k8s.example.com), ืื•ืŸ ืื•ื™ืš ืงื•ืžื˜ ืžื™ื˜ HELM ืคืึทืจ-ืื™ื ืกื˜ืึทืœื™ืจืŸ. ืžื™ืจ ืื•ื™ืš ื”ืึธื‘ืŸ ืึทืŸ ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืข ืื•ื™ืฃ GitHub (ืกื•ืคึผืขืจ-ืึธืจื’).
ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ HELM, ื™ื ืกื˜ืึทืœื™ืจืŸ ืขืก ื–ื™ื™ืขืจ ืคึผืฉื•ื˜.

ืขืจืฉื˜ืขืจ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ GitHub.

ื’ื™ื™ืŸ ืฆื• ื“ื™ ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืข ืกืขื˜ื˜ื™ื ื’ืก ื‘ืœืึทื˜, (https://github.com/organizations/super-org/settings/applications) ืื•ืŸ ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ (ืึทื•ื˜ื”ืึธืจื™ื–ืขื“ OAuth ืึทืคึผ):
ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ื™ืฃ GitHub

ืคึผืœืึธืžื‘ื™ืจืŸ ื“ื™ ืคืขืœื“ืขืจ ืžื™ื˜ ื“ื™ ื ื™ื™ื˜ื™ืง URL ืก, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ:

  • ื”ืึธืžืขืคึผืึทื’ืข URL: https://dex.k8s.example.com
  • ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืงืึทืœืœback URL: https://dex.k8s.example.com/callback

ื–ื™ื™ืŸ ืึธืคึผื’ืขื”ื™ื˜ ืžื™ื˜ ืœื™ื ืงืก, ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ื ื™ืฉื˜ ืฆื• ืคืึทืจืœื™ืจืŸ ืกืœืึทืฉื™ื–.

ืื™ืŸ ืขื ื˜ืคืขืจ ืฆื• ืึท ื’ืขืขื ื“ื™ืงื˜ ืคืึธืจืขื, GitHub ื•ื•ืขื˜ ื“ื–ืฉืขื ืขืจื™ื™ื˜ Client ID ะธ Client secret, ื”ืึทืœื˜ืŸ ื–ื™ื™ ืื™ืŸ ืึท ื–ื™ื›ืขืจ ืคึผืœืึทืฅ, ื–ื™ื™ ื•ื•ืขืœืŸ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืื•ื ื“ื– (ืœืžืฉืœ, ืžื™ืจ ื ื•ืฆืŸ Vault ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ืกื™ืงืจื™ืฅ):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

ืฆื•ื’ืจื™ื™ื˜ืŸ ื“ื ืก ืจืขืงืึธืจื“ืก ืคึฟืึทืจ ืกื•ื‘ื“ืึธืžืึทื™ื ืก login.k8s.example.com ะธ dex.k8s.example.com, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืกืกืœ ืกืขืจื˜ื™ืคื™ืงืึทืฅ ืคึฟืึทืจ ื™ื ื’ืจืขืกืก.

ืœืึธืžื™ืจ ืžืึทื›ืŸ SSL ืกืขืจื˜ื™ืคื™ืงืึทืฅ:

cat <<EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-dex
  namespace: kube-system
spec:
  secretName: cert-auth-dex
  dnsNames:
    - dex.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - dex.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
---
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-login
  namespace: kube-system
spec:
  secretName: cert-auth-login
  dnsNames:
    - login.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - login.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
EOF
kubectl describe certificates cert-auth-dex -n kube-system
kubectl describe certificates cert-auth-login -n kube-system

ClusterIssuer ืžื™ื˜ ื˜ื™ื˜ืœ le-clusterissuer ื–ืึธืœ ืฉื•ื™ืŸ ืขืงืกื™ืกื˜ื™ืจืŸ, ืึธื‘ืขืจ ืื•ื™ื‘ ื ื™ืฉื˜, ืฉืึทืคึฟืŸ ืขืก ืžื™ื˜ HELM:

helm install --namespace kube-system -n cert-manager stable/cert-manager
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: le-clusterissuer
  namespace: kube-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: le-clusterissuer
    http01: {}
EOF

ืงื•ื‘ืขืึทืคึผื™ืกืขืจื•ื•ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

ืคึฟืึทืจ kubeAPIServer ืฆื• ืึทืจื‘ืขื˜ืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ OIDC ืื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ืขื ืงื ื•ื™ืœ:

kops edit cluster
...
  kubeAPIServer:
    anonymousAuth: false
    authorizationMode: RBAC
    oidcClientID: dex-k8s-authenticator
    oidcGroupsClaim: groups
    oidcIssuerURL: https://dex.k8s.example.com/
    oidcUsernameClaim: email
kops update cluster --yes
kops rolling-update cluster --yes

ืžื™ืจ ื ื•ืฆืŸ kops ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ื™ื ื’ ืงืœืึทืกื˜ืขืจื–, ืึธื‘ืขืจ ื“ืึธืก ืึทืจื‘ืขื˜ ืกื™ืžื™ืœืึทืจืœื™ ืคึฟืึทืจ ืื ื“ืขืจืข ืงื ื•ื™ืœ ืžืึทื ืึทื“ื–ืฉืขืจื–.

ื“ืขืงืก ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ dex-k8s-authenticator

ืคึฟืึทืจ Dex ืฆื• ืึทืจื‘ืขื˜ืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื”ืึธื‘ืŸ ืึท ื‘ืึทื•ื•ื™ื™ึทื–ืŸ ืื•ืŸ ืึท ืฉืœื™ืกืœ ืคื•ืŸ ื“ื™ Kubernetes ื‘ืขืœ, ืœืึธื–ืŸ ืื•ื ื“ื– ื‘ืึทืงื•ืžืขืŸ ืขืก ืคึฟื•ืŸ ื“ืึธืจื˜:

sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----

ืœืึธืžื™ืจ ืงืœืึธื•ืŸ ื“ื™ dex-k8s-authenticator ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™:

git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/

ื ื™ืฆืŸ ื•ื•ืึทืœื•ืขืก ื˜ืขืงืขืก, ืžื™ืจ ืงืขื ืขืŸ ืคืœืขืงืกืึทื‘ืึทืœ ืงืึทื ืคื™ื’ื™ืขืจ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืคึฟืึทืจ ืื•ื ื“ื–ืขืจ ื”ืขืœื ื˜ืฉืึทืจืฅ.

ืœืึธืžื™ืจ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึฟืึทืจ Dex:

cat << EOF > values-dex.yml
global:
  deployEnv: prod
tls:
  certificate: |-
    -----BEGIN CERTIFICATE-----
    AAAAAAAAAAABBBBBBBBBBCCCCCC
    -----END CERTIFICATE-----
  key: |-
    -----BEGIN RSA PRIVATE KEY-----
    DDDDDDDDDDDEEEEEEEEEEFFFFFF
    -----END RSA PRIVATE KEY-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - dex.k8s.example.com
  tls:
    - secretName: cert-auth-dex
      hosts:
        - dex.k8s.example.com
serviceAccount:
  create: true
  name: dex-auth-sa
config: |
  issuer: https://dex.k8s.example.com/
  storage: # https://github.com/dexidp/dex/issues/798
    type: sqlite3
    config:
      file: /var/dex.db
  web:
    http: 0.0.0.0:5556
  frontend:
    theme: "coreos"
    issuer: "Example Co"
    issuerUrl: "https://example.com"
    logoUrl: https://example.com/images/logo-250x25.png
  expiry:
    signingKeys: "6h"
    idTokens: "24h"
  logger:
    level: debug
    format: json
  oauth2:
    responseTypes: ["code", "token", "id_token"]
    skipApprovalScreen: true
  connectors:
  - type: github
    id: github
    name: GitHub
    config:
      clientID: $GITHUB_CLIENT_ID
      clientSecret: $GITHUB_CLIENT_SECRET
      redirectURI: https://dex.k8s.example.com/callback
      orgs:
      - name: super-org
        teams:
        - team-red
  staticClients:
  - id: dex-k8s-authenticator
    name: dex-k8s-authenticator
    secret: generatedLongRandomPhrase
    redirectURIs:
      - https://login.k8s.example.com/callback/
envSecrets:
  GITHUB_CLIENT_ID: "1ab2c3d4e5f6g7h8"
  GITHUB_CLIENT_SECRET: "98z76y54x32w1"
EOF

ืื•ืŸ ืคึฟืึทืจ dex-k8s-authenticator:

cat << EOF > values-auth.yml
global:
  deployEnv: prod
dexK8sAuthenticator:
  clusters:
  - name: k8s.example.com
    short_description: "k8s cluster"
    description: "Kubernetes cluster"
    issuer: https://dex.k8s.example.com/
    k8s_master_uri: https://api.k8s.example.com
    client_id: dex-k8s-authenticator
    client_secret: generatedLongRandomPhrase
    redirect_uri: https://login.k8s.example.com/callback/
    k8s_ca_pem: |
      -----BEGIN CERTIFICATE-----
      AAAAAAAAAAABBBBBBBBBBCCCCCC
      -----END CERTIFICATE-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - login.k8s.example.com
  tls:
    - secretName: cert-auth-login
      hosts:
        - login.k8s.example.com
EOF

ื™ื ืกื˜ืึทืœื™ืจืŸ Dex ืื•ืŸ dex-k8s-authenticator:

helm install -n dex --namespace kube-system --values values-dex.yml charts/dex
helm install -n dex-auth --namespace kube-system --values values-auth.yml charts/dex-k8s-authenticator

ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก (ื“ืขืงืก ื–ืึธืœ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืงืึธื“ 400, ืื•ืŸ dex-k8s-authenticator ื–ืึธืœ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืงืึธื“ 200):

curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200

RBAC ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ

ืžื™ืจ ืฉืึทืคึฟืŸ ืึท ืงืœืึทืกื˜ืขืจืจืึธืœืข ืคึฟืึทืจ ื“ื™ ื’ืจื•ืคึผืข, ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคืึทืœ ืžื™ื˜ ื‘ืœื•ื™ื– ืœื™ื™ืขื ืขืŸ ืึทืงืกืขืก:

cat << EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-read-all
rules:
  -
    apiGroups:
      - ""
      - apps
      - autoscaling
      - batch
      - extensions
      - policy
      - rbac.authorization.k8s.io
      - storage.k8s.io
    resources:
      - componentstatuses
      - configmaps
      - cronjobs
      - daemonsets
      - deployments
      - events
      - endpoints
      - horizontalpodautoscalers
      - ingress
      - ingresses
      - jobs
      - limitranges
      - namespaces
      - nodes
      - pods
      - pods/log
      - pods/exec
      - persistentvolumes
      - persistentvolumeclaims
      - resourcequotas
      - replicasets
      - replicationcontrollers
      - serviceaccounts
      - services
      - statefulsets
      - storageclasses
      - clusterroles
      - roles
    verbs:
      - get
      - watch
      - list
  - nonResourceURLs: ["*"]
    verbs:
      - get
      - watch
      - list
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create"]
EOF

ืœืึธืžื™ืจ ืžืึทื›ืŸ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึฟืึทืจ ClusterRoleBinding:

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dex-cluster-auth
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-read-all
subjects:
  kind: Group
  name: "super-org:team-red"
EOF

ืื™ืฆื˜ ืžื™ืจ ื–ืขื ืขืŸ ื’ืจื™ื™ื˜ ืคึฟืึทืจ ื˜ืขืกื˜ื™ื ื’.

ื˜ืขืกืฅ

ื’ื™ื™ืŸ ืฆื• ื“ื™ ืœืึธื’ื™ืŸ ื‘ืœืึทื˜ (https://login.k8s.example.com) ืื•ืŸ ืงืœืึธืฅ ืื™ืŸ ืžื™ื˜ ื“ื™ื™ืŸ GitHub ื—ืฉื‘ื•ืŸ:

ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
ืœืึธื’ื™ืŸ ื‘ืœืึทื˜

ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
ืœืึธื’ื™ืŸ ื‘ืœืึทื˜ ืจื™ื“ืขืจืขืงื˜ื™ื“ ืฆื• GitHub

ืึธื˜ืขื ื˜ืึทืงื™ืจืŸ ืื™ืŸ Kubernetes ื ื™ืฆืŸ GitHub OAuth ืื•ืŸ Dex
 ื’ื™ื™ ื“ื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืฆื• ื‘ืึทืงื•ืžืขืŸ ืึทืงืกืขืก

ื ืึธืš ืงืึธืคึผื™ืข-ืคึผืึทืกื˜ื™ื ื’ ืคื•ืŸ ื“ื™ ื•ื•ืขื‘ ื‘ืœืึทื˜, ืžื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ kubectl ืฆื• ืคื™ืจืŸ ืื•ื ื“ื–ืขืจ ืงื ื•ื™ืœ ืจืขืกื•ืจืกืŸ:

kubectl get po
NAME                READY   STATUS    RESTARTS   AGE
mypod               1/1     Running   0          3d

kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"

ืื•ืŸ ืขืก ืึทืจื‘ืขื˜, ืึทืœืข GitHub ื™ื•ื–ืขืจื– ืื™ืŸ ืื•ื ื“ื–ืขืจ ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืข ืงืขื ืขืŸ ื–ืขืŸ ืจืขืกื•ืจืกืŸ ืื•ืŸ ืึทืจื™ื™ึทื ืœืึธื’ื™ืจืŸ ืื™ืŸ ืคึผืึธื“ืก, ืึธื‘ืขืจ ื–ื™ื™ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืจืขื›ื˜ ืฆื• ื˜ื•ื™ืฉืŸ ื–ื™ื™.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’