مان توهان جي توجه لاءِ پيش ڪريان ٿو هڪ سبق پيدا ڪرڻ لاءِ ڪبرنيٽس ڪلستر تائين رسائي Dex، dex-k8s-authenticator ۽ GitHub استعمال ڪندي.
روسي-ٻولي ڪبرنيٽس کان مقامي ميمي چيٽ ۾
تعارف
اسان ترقي ۽ QA ٽيم لاءِ متحرڪ ماحول پيدا ڪرڻ لاءِ ڪبرنيٽس استعمال ڪندا آهيون. تنهن ڪري اسان انهن کي ڊيش بورڊ ۽ ڪبيڪٽل ٻنهي لاءِ ڪلستر تائين رسائي ڏيڻ چاهيون ٿا. OpenShift جي برعڪس، vanilla Kubernetes وٽ اصلي تصديق نه آهي، تنهنڪري اسان ان لاءِ ٽئين پارٽي جا اوزار استعمال ڪريون ٿا.
هن ترتيب ۾ اسان استعمال ڪريون ٿا:
dex-k8s-Authenticator kubectl config پيدا ڪرڻ لاءِ ويب ايپليڪيشنڊي - OpenID Connect فراهم ڪندڙ- GitHub - صرف ان ڪري جو اسان استعمال ڪندا آهيون GitHub اسان جي ڪمپني ۾
اسان گوگل OIDC استعمال ڪرڻ جي ڪوشش ڪئي، پر بدقسمتي سان اسان
تنهن ڪري، اسان جو ڪبرنيٽس اختيار ڪرڻ وارو عمل بصري نمائندگي ۾ ڪيئن ڪم ڪندو آهي:
اختيار ڏيڻ وارو عمل
ٿورڙو وڌيڪ تفصيل ۽ نقطي ذريعي:
- استعمال ڪندڙ dex-k8s-authenticator ۾ لاگ ان ٿئي ٿو (
login.k8s.example.com
) - dex-k8s-authenticator درخواست کي ڊيڪس ڏانهن موڪلي ٿو (
dex.k8s.example.com
) - ڊيڪس GitHub لاگ ان صفحي ڏانهن منتقل ڪري ٿو
- GitHub ضروري اختيار جي معلومات پيدا ڪري ٿو ۽ ان کي ڊيڪس ڏانهن موٽائي ٿو
- ڊيڪس وصول ڪيل معلومات کي dex-k8s-authenticator ڏانهن منتقل ڪري ٿو
- صارف GitHub کان هڪ OIDC ٽوڪن وصول ڪري ٿو
- dex-k8s-authenticator kubeconfig ۾ ٽوڪن شامل ڪري ٿو
- kubectl ٽوڪن کي KubeAPIServer ڏانهن منتقل ڪري ٿو
- KubeAPIServer پاس ڪيل ٽوڪن جي بنياد تي kubectl تائين رسائي واپس ڪري ٿو
- استعمال ڪندڙ کي رسائي حاصل ڪري ٿي kubectl کان
تياري واري عمل
يقينا، اسان وٽ اڳ ۾ ئي ڪوبرنيٽس ڪلستر نصب ٿيل آهي (k8s.example.com
)، ۽ پڻ اڳ ۾ نصب ٿيل HELM سان گڏ اچي ٿو. اسان وٽ پڻ هڪ تنظيم آهي GitHub (super-org).
جيڪڏهن توهان وٽ HELM نه آهي، ان کي انسٽال ڪريو
پهرين اسان کي سيٽ ڪرڻ جي ضرورت آهي GitHub.
وڃو تنظيمي سيٽنگون صفحي، (https://github.com/organizations/super-org/settings/applications
) ۽ هڪ نئين ايپليڪيشن ٺاهيو (مجاز OAuth ايپ):
GitHub تي نئين ايپليڪيشن ٺاهيندي
ضروري URLs سان فيلڊ ۾ ڀريو، مثال طور:
- هوم صفحي جو URL:
https://dex.k8s.example.com
- اجازت ڏيڻ واري ڪالبڪ URL:
https://dex.k8s.example.com/callback
لنڪن سان محتاط رھو، اھو ضروري آھي ته سليش نه وڃايو.
مڪمل فارم جي جواب ۾، GitHub پيدا ڪندو Client ID
и Client secret
انهن کي محفوظ جاءِ تي رکو، اهي اسان لاءِ ڪارآمد هوندا (مثال طور، اسان استعمال ڪندا آهيون
Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1
ذيلي ڊومينز لاءِ DNS رڪارڊ تيار ڪريو login.k8s.example.com
и dex.k8s.example.com
, گڏوگڏ داخل ٿيڻ لاء 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
عنوان سان گڏ ڪلستر جاري ڪندڙ le-clusterissuer
اڳ ۾ ئي موجود هجڻ گهرجي، پر جيڪڏهن نه، هيلم استعمال ڪندي ٺاهيو:
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 ترتيب
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-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 repository:
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 ترتيب
اسان گروپ لاءِ هڪ 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 استعمال ڪندڙ وسيلن کي ڏسي سگهن ٿا ۽ پوڊ ۾ لاگ ان ڪري سگهن ٿا، پر انهن کي انهن کي تبديل ڪرڻ جو حق نه آهي.
جو ذريعو: www.habr.com