ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ Π½Π° Π²Π°ΡΠ΅ΡΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΡΠΊ ΡΡΡΠΎΡΠΈΠ°Π» Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏΠΈ Π΄ΠΎ Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Dex, dex-k8s-authenticator ΠΈ GitHub.

ΠΠΎΠΊΠ°Π»Π΅Π½ ΠΌΠ΅ΠΌ ΠΎΡ ΡΡΡΠΊΠΎΡΠ·ΡΡΠ΅Π½ ΡΠ°Ρ Kubernetes Π²
ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Kubernetes Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ Π·Π° Π΅ΠΊΠΈΠΏΠ° ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΈ QA. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΊΠ°ΠΊΡΠΎ Π·Π° ΡΠ°Π±Π»ΠΎΡΠΎ, ΡΠ°ΠΊΠ° ΠΈ Π·Π° kubectl. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ OpenShift, Π²Π°Π½ΠΈΠ»ΠΎΠ²ΠΈΡΡ Kubernetes Π½ΡΠΌΠ° Π½Π°ΡΠΈΠ²Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡ, Π·Π°ΡΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²ΡΠ½ΡΠ½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΡΠΎΠ²Π°.
Π ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅:
- β ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° kubectl
- β Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ Π½Π° OpenID Connect
- GitHub β ΠΏΡΠΎΡΡΠΎ Π·Π°ΡΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ GitHub Π² Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ
ΠΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Google OIDC, Π½ΠΎ Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ ΡΡΠΏΡΡ ΠΌΠ΅ Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ°Π±ΠΎΡΠΈ Π½Π°ΡΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² Kubernetes Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ:
ΠΡΠΎΡΠ΅Ρ Π½Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ

ΠΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎ ΡΠΎΡΠΊΠΈ:
ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π²Π»ΠΈΠ·Π° Π² dex-k8s-authenticator (
- login.k8s.example.com
dex-k8s-authenticator ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ Dex () - dex.k8s.example.com
Dex ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° ΠΊΡΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² GitHub) - GitHub Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΈ Ρ Π²ΡΡΡΠ° Π½Π° Dex
- Dex ΠΏΡΠ΅Π΄Π°Π²Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° dex-k8s-authenticator
- ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° OIDC ΡΠΎΠΊΠ΅Π½ ΠΎΡ GitHub
- dex-k8s-authenticator Π΄ΠΎΠ±Π°Π²Ρ ΡΠΎΠΊΠ΅Π½Π° Π² kubeconfig
- kubectl ΠΏΡΠ΅Π΄Π°Π²Π° ΡΠΎΠΊΠ΅Π½Π° Π½Π° KubeAPIServer
- KubeAPIServer Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½ Π²ΡΡΡΠ° Π΄ΠΎΡΡΡΠΏΠΈ Π² kubectl
- ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠΈ ΠΎΡ kubectl
- ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅Π»Π½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ (
k8s.example.com), ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ HELM. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π² GitHub (super-org).ΠΠΊΠΎ Π½ΡΠΌΠ°ΡΠ΅ HELM, ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π΅
ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½Π° .
ΠΡΠΈΠ²Π°ΠΌΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡΠ°, (
) ΠΈ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Authorized OAuth App):https://github.com/organizations/super-org/settings/applicationsΠ‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² GitHub

ΠΠΎΠΏΡΠ»Π²Π°ΠΌΠ΅ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ URL, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
Homepage URL:
- Authorization callback URL:
https://dex.k8s.example.com - ΠΠ½ΠΈΠΌΠ°Π²Π°ΠΉΡΠ΅ ΡΡΡ ΡΡΡΠ»ΠΊΠΈΡΠ΅, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° Π½Π΅ Π·Π°Π³ΡΠ±ΠΈΡΠ΅ ΡΠ»Π΅ΡΠΎΠ²Π΅ΡΠ΅.
https://dex.k8s.example.com/callback
Π ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° ΠΏΠΎΠΏΡΠ»Π½Π΅Π½Π°ΡΠ° ΡΠΎΡΠΌΠ°, GitHub ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°
Client ID Client secret ΠΈ , Π·Π°ΠΏΠ°Π·Π΅ΡΠ΅ Π³ΠΈ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΌΡΡΡΠΎ, ΡΠ΅ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅Vault Client ID: 1ab2c3d4e5f6g7h8 Client secret: 98z76y54x32w1
ΠΠΎΠ΄Π³ΠΎΡΠ²Π΅ΡΠ΅ DNS-Π·Π°ΠΏΠΈΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈΡΠ΅ ΠΠΎΠ΄Π³ΠΎΡΠ²Π΅ΡΠ΅ DNS Π·Π°ΠΏΠΈΡΠΈ Π·Π° ΠΏΠΎΠ΄ΡΠ°ΠΉΡΠΎΠ²Π΅ dex-k8s-authenticator ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ Dex ( ΠΈ Dex ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° ΠΊΡΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² GitHub, ΠΊΠ°ΠΊΡΠΎ ΠΈ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ Π·Π° ΠΈΠ½Π³ΡΠ΅ΡΠΈΠΈΡΠ΅.
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ 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: k8s-admin@example.com
privateKeySecretRef:
name: le-clusterissuer
http01: {}
EOFΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° KubeAPIServer
ΠΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° 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ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠΈ, Π½ΠΎ ΡΠΎΠ²Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Π·Π° .
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° Dex ΠΈ 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 git@github.com:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° values ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π³ΡΠ²ΠΊΠ°Π²ΠΎ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΈΡΠ΅ .
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π·Π° Dex:
cat < 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 < 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Π©Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅ (Dex ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΡΠ½Π΅ ΠΊΠΎΠ΄ 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 200RBAC ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ClusterRole Π·Π° Π³ΡΡΠΏΠ°, Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Ρ read-only Π΄ΠΎΡΡΡΠΏ:
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 Π°ΠΊΠ°ΡΠ½ΡΠ° ΡΠΈ:

Π‘ΡΡΠ°Π½ΠΈΡΠ° Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ

Π‘ΡΡΠ°Π½ΠΈΡΠ° Π·Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½Π° ΠΊΡΠΌ GitHub

Β Π‘Π»Π΅Π΄Π²Π°ΠΌΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΎΡ ΡΠ΅Π± ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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 "amet@example.com" cannot delete pods in the namespace "default" Π ΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈ, Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π½Π° GitHub Π² Π½Π°ΡΠ°ΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π²ΠΈΠΆΠ΄Π°Ρ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΠΈ Π΄Π° Π²Π»ΠΈΠ·Π°Ρ Π² ΠΏΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅, Π½ΠΎ Π½ΡΠΌΠ°Ρ ΠΏΡΠ°Π²Π° Π·Π° ΡΡΡ
Π½Π°ΡΠ° ΠΏΡΠΎΠΌΡΠ½Π°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
