Dex፣ dex-k8s-authenticator እና GitHubን በመጠቀም የኩበርኔትስ ክላስተር መዳረሻን ለማመንጨት አጋዥ ስልጠና ለእርስዎ ትኩረት አቀርባለሁ።
ከሩሲያኛ ቋንቋ Kubernetes የመጣው የአካባቢ ሜም ወደ ውስጥ ገባ
መግቢያ
ለልማት ቡድን እና QA ተለዋዋጭ አካባቢዎችን ለመፍጠር Kubernetes እንጠቀማለን። ስለዚህ ለሁለቱም ዳሽቦርድ እና kubectl የክላስተር መዳረሻ ልንሰጣቸው እንፈልጋለን። ከተመሳሳዩ OpenShift በተቃራኒ ቫኒላ ኩበርኔትስ ቤተኛ ማረጋገጫ ስለሌለው ለዚህ የሶስተኛ ወገን መሳሪያዎችን እንጠቀማለን።
በዚህ ውቅር ውስጥ የሚከተሉትን እንጠቀማለን-
dex-k8s-አረጋጋጭ - kubectl config ለማመንጨት የድር መተግበሪያDex - ክፍት መታወቂያ አገናኝ አቅራቢ- GitHub - በቀላሉ GitHub በእኛ ኩባንያ ውስጥ ስለምንጠቀም ነው።
ጎግል ኦአይዲሲን ለመጠቀም ሞክረናል፣ ግን በሚያሳዝን ሁኔታ እኛ
ስለዚህ የእኛ የኩበርኔትስ ፍቃድ ሂደታችን በምስል ውክልና እንዴት እንደሚሰራ፡-
የፈቃድ ሂደት
ትንሽ ተጨማሪ ዝርዝር እና ነጥብ በነጥብ፡-
- ተጠቃሚ ወደ dex-k8s-authenticator ገብቷል (
login.k8s.example.com
) - dex-k8s-አረጋጋጭ ጥያቄውን ወደ Dex ያዞራል (
dex.k8s.example.com
) - Dex ወደ GitHub መግቢያ ገፅ ያዞራል።
- GitHub አስፈላጊውን የፍቃድ መረጃ ያመነጫል እና ወደ Dex ይመልሳል
- ዴክስ የተቀበለውን መረጃ ወደ dex-k8s-አረጋጋጭ ያስተላልፋል
- ተጠቃሚ የOIDC ማስመሰያ ከ GitHub ያገኛል
- dex-k8s-authenticator ወደ kubeconfig ማስመሰያ ያክላል
- kubectl ማስመሰያ ወደ KubeAPIServer ያስተላልፋል
- በተላለፈው ማስመሰያ ላይ የተመሰረተ KubeAPISserver የ kubectl መዳረሻን ይመልሳል
- ተጠቃሚ ከ kubectl ይደርሳል
የዝግጅት ተግባራት
በእርግጥ የኩበርኔትስ ክላስተር ተጭኖልናል (k8s.example.com
), እንዲሁም HELM አስቀድሞ ተጭኗል። በ GitHub (ሱፐር-org) ላይ ድርጅት አለን።
HELM ከሌለዎት ይጫኑት።
በመጀመሪያ GitHub ን ማዘጋጀት አለብን.
ወደ የድርጅት ቅንብሮች ገጽ ይሂዱ ፣https://github.com/organizations/super-org/settings/applications
) እና አዲስ መተግበሪያ ይፍጠሩ (የተፈቀደለት OAuth መተግበሪያ)፡-
በ GitHub ላይ አዲስ መተግበሪያ ይፍጠሩ
መስኮቹን በሚፈለጉት ዩአርኤሎች ይሙሉ፣ ለምሳሌ፡-
- መነሻ ገጽ URL፡
https://dex.k8s.example.com
- የመልሶ ጥሪ ዩአርኤል ፍቃድ
https://dex.k8s.example.com/callback
በአገናኞች ይጠንቀቁ, ስኬቶችን ላለማጣት አስፈላጊ ነው.
ለተጠናቀቀው ቅጽ ምላሽ GitHub ያመነጫል። Client ID
и Client secret
, በአስተማማኝ ቦታ ያስቀምጣቸዋል, ለእኛ ጠቃሚ ይሆናሉ (ለምሳሌ, እንጠቀማለን
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
ክላስተር አውጪ ከርዕስ ጋር 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
KubeAPISየአገልጋይ ውቅር
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-አረጋጋጭ
Dex እንዲሰራ፣ ከኩበርኔትስ ማስተር ሰርተፍኬት እና ቁልፍ ሊኖርህ ይገባል፣ ከዚያ እናወጣዋለን፡
sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----
የdex-k8s-አረጋጋጭ ማከማቻን ዝጋ፡
git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/
በእሴቶች-ፋይሎች እገዛ፣ለእኛ ተለዋዋጮችን በተለዋዋጭነት ማዘጋጀት እንችላለን
የዴክስን ውቅር እንግለጽ፡-
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-አረጋጋጭ፡-
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-አረጋጋጭን ጫን፡-
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 200
RBAC ውቅር
በእኛ ሁኔታ ተነባቢ-ብቻ መዳረሻ ለቡድኑ ClusterRole ይፍጠሩ፡
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 "[email protected]" cannot delete pods in the namespace "default"
እና ይሰራል፣ በድርጅታችን ውስጥ ያሉ ሁሉም የ GitHub ተጠቃሚዎች ሃብቶችን አይተው ወደ ፖድ ውስጥ መግባት ይችላሉ፣ ነገር ግን የመቀየር ፍቃድ የላቸውም።
ምንጭ: hab.com