Dex, dex-k8s-authenticator සහ GitHub භාවිතයෙන් Kubernetes පොකුරකට ප්රවේශය උත්පාදනය කිරීම සඳහා වන නිබන්ධනයක් මම ඔබේ අවධානයට ඉදිරිපත් කරමි.
රුසියානු භාෂා Kubernetes කතාබස් සිට දේශීය meme
හැඳින්වීම
සංවර්ධනය සහ QA කණ්ඩායම සඳහා ගතික පරිසරයන් නිර්මාණය කිරීමට අපි Kubernetes භාවිතා කරමු. ඒ නිසා අපි ඔවුන්ට උපකරණ පුවරුව සහ kubectl යන දෙකටම පොකුරු වෙත ප්රවේශය ලබා දීමට අවශ්යයි. OpenShift මෙන් නොව, vanilla Kubernetes හට ස්වදේශීය සත්යාපනයක් නොමැත, එබැවින් අපි මේ සඳහා තෙවන පාර්ශවීය මෙවලම් භාවිතා කරමු.
මෙම වින්යාසය තුළ අපි භාවිතා කරන්නේ:
dex-k8s-authenticator - kubectl config ජනනය කිරීම සඳහා වෙබ් යෙදුමඩෙක්ස් - OpenID Connect සපයන්නා- GitHub - අපි අපේ සමාගම තුළ GitHub භාවිතා කරන නිසා
අපි Google OIDC භාවිත කිරීමට උත්සාහ කළ නමුත්, අවාසනාවන්ත ලෙස අපි
ඉතින්, අපගේ Kubernetes අවසර ක්රියාවලිය දෘශ්ය නිරූපණයක ක්රියා කරන්නේ කෙසේද:
අවසර ක්රියාවලිය
තව ටිකක් විස්තර සහ ලක්ෂ්යයෙන්:
- පරිශීලකයා dex-k8s-authenticator වෙත ලොග් වේ (
login.k8s.example.com
) - dex-k8s-authicator ඉල්ලීම Dex වෙත යොමු කරයි (
dex.k8s.example.com
) - Dex GitHub පිවිසුම් පිටුවට යළි-යොමු කරයි
- GitHub අවශ්ය අවසර තොරතුරු ජනනය කර එය Dex වෙත ආපසු ලබා දෙයි
- Dex විසින් ලැබුණු තොරතුරු dex-k8s-authicator වෙත ලබා දෙයි
- පරිශීලකයාට GitHub වෙතින් OIDC ටෝකනයක් ලැබේ
- dex-k8s-authenticator kubeconfig වෙත ටෝකනය එක් කරයි
- kubectl ටෝකනය KubeAPIServer වෙත ලබා දෙයි
- සම්මත කරන ලද ටෝකනය මත පදනම්ව KubeAPIServer kubectl වෙත ප්රවේශයන් ලබා දෙයි
- පරිශීලකයාට kubectl වෙතින් ප්රවේශය ලැබේ
සූදානම් කිරීමේ කටයුතු
ඇත්ත වශයෙන්ම, අපි දැනටමත් Kubernetes පොකුරක් ස්ථාපනය කර ඇත (k8s.example.com
), සහ පෙර ස්ථාපනය කර ඇති HELM සමඟද පැමිණේ. අපට GitHub (super-org) හි සංවිධානයක් ද ඇත.
ඔබට HELM නොමැති නම්, එය ස්ථාපනය කරන්න
මුලින්ම අපි GitHub සැකසිය යුතුයි.
ආයතන සැකසීම් පිටුවට යන්න, (https://github.com/organizations/super-org/settings/applications
) සහ නව යෙදුමක් සාදන්න (බලයලත් OAuth යෙදුම):
GitHub හි නව යෙදුමක් නිර්මාණය කිරීම
අවශ්ය URL සමඟ ක්ෂේත්ර පුරවන්න, උදාහරණයක් ලෙස:
- මුල්පිටු 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 භාවිතයෙන් එය සාදන්න:
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
KubeAPISserver වින්යාසය
kubeAPISserver වැඩ කිරීමට, ඔබ 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
ඩෙක්ස් වැඩ කිරීමට නම්, ඔබට කුබර්නෙට්ස් මාස්ටර්ගෙන් සහතිකයක් සහ යතුරක් තිබිය යුතුය, අපි එය එතැනින් ලබා ගනිමු:
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
අපි සේවාවන්හි ක්රියාකාරීත්වය පරීක්ෂා කරමු (Dex විසින් කේතය 400 ආපසු ලබා දිය යුතු අතර dex-k8s-authicator කේතය 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