共计 6729 个字符,预计需要花费 17 分钟才能阅读完成。
作者:李帅
介绍
KubeSphere 多租户是理论生产应用中十分须要的一个性能,该性能满足不同用户登陆 KubeSphere 平台的需要。比方开发,运维,测试都须要登陆 KubeSphere 平台,并且须要为不同身份的用户配置不同的权限。当公司内须要拜访 KubeSphere 的用户比拟多时,管理员再去手动为用户创立账号就不太灵便了。KubeSphere 蕴含一个内置的 OAuth 服务和帐户零碎,用户通过获取 OAuth 拜访令牌以对 API 进行身份验证,咱们能够通过接入 LDAP 或者 OIDC 来提供身份认证信息。
多租户计划
认证鉴权链路
应用
假如集群内曾经最小化装置 KubeSphere。咱们这里应用 OIDC 身份提供者进行认证,通过 Dex 接入到 GitLab 中,应用 GitLab 中的用户实现认证。
装置 Dex
Dex 是一种身份认证服务,它应用 OpenID Connect 来驱动其余应用程序的身份验证。Dex 通过“connectors”充当其余身份提供商的门户。Dex 能够将身份验证推到 LDAP 服务器、SAML 提供商或已建设的身份提供商(如 GitHub、Gitlab、Google 和 Active Directory 等)。客户端编写身份验证逻辑以与 Dex 交互认证,而后 Dex 通过 connector 转发到后端用户认证方进行认证,并返回给客户端 Oauth2 Token。与其类似的身份认证服务还有 Keycloak,auth0 等。
首先须要在 gitlab 上创立利用,在范畴里勾选这几个 read_user
profile
email
openid
,创立后须要记住页面上的应用程序 id 和明码,前面会用失去。
# 增加 dex 的 helm 仓库
root@i-tsfhx8p6:~/qke-k8s/dex# helm repo add dex https://charts.dexidp.io
"dex" has been added to your repositories
#下载 dex 的 chart 文件到本地
root@i-tsfhx8p6:~/qke-k8s/dex# helm pull dex/dex
root@i-tsfhx8p6:~/qke-k8s/dex# ls
dex-0.5.0.tgz
root@i-tsfhx8p6:~/qke-k8s/dex# tar xf dex-0.5.0.tgz
root@i-tsfhx8p6:~/qke-k8s/dex# ls
dex dex-0.5.0.tgz
root@i-tsfhx8p6:~/qke-k8s/dex# ls dex
Chart.yaml LICENSE README.md ci templates values.yaml
批改 values.yaml
文件
replicaCount: 1
image:
repository: dexidp/dex
pullPolicy: IfNotPresent
tag: "v2.29.0"
imagePullSecrets: []
nameOverride: ""fullnameOverride:""
hostAliases: []
https:
# -- Enable the HTTPS endpoint.
enabled: false
grpc:
# -- Enable the gRPC endpoint.
# Read more in the [documentation](https://dexidp.io/docs/api/).
enabled: false
configSecret:
# -- Enable creating a secret from the values passed to `config`.
# If set to false, name must point to an existing secret.
create: true
# -- The name of the secret to mount as configuration in the pod.
# If not set and create is true, a name is generated using the fullname template.
# Must point to secret that contains at least a `config.yaml` key.
name: ""
config:
issuer: https://dex-qke.lishuai.fun #批改为你理论的地址
storage:
type: kubernetes
config:
inCluster: true
web:
http: 0.0.0.0:5556
telemetry:
http: 0.0.0.0:5558
expiry:
signingKeys: "6h"
idTokens: "24h"
logger:
level: debug
format: json
oauth2:
responseTypes: ["code", "token", "id_token"]
skipApprovalScreen: true
connectors:
- type: gitlab
id: gitlab
name: GitLab
config:
baseURL: https://gitlab.lishuai.fun #批改为你理论的 gitlab 地址
clientID: ca14d16e376b6f6634*********57378d1267e946e9d3e758e2f0 #批改为你 gitlab 利用的 clientid
clientSecret: 15dcb3501becd17******1b82b05874e2ef893b7a0888fdaaa37885fd9387 #批改为你 gitlab 利用的 clientsecert
redirectURI: https://dex-qke.lishuai.fun/callback #批改为你理论的地址,格局为(dex issuer)/callback
groups:
- k8s-auth
- k8s-auth/dashboard
- k8s-auth/dashboard/show ##gitlab 项目组,只容许 dashboard 我的项目组成员拜访
staticClients:
- id: dex-k8s-authenticator
name: dex-k8s-authenticator
secret: generatedLongRandomPhrase
redirectURIs:
- 'http://kubesphere.lishuai.fun/oauth/redirect/dex' #这个是 kubesphere 的回调地址,对于 dex 认证,格局为 kubesphere_url/oauth/redirect/dex
volumes: []
volumeMounts: []
envFrom: []
env: {}
serviceAccount:
# -- Enable service account creation.
create: true
# -- Annotations to be added to the service account.
annotations: {}
# -- The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template.
name: "dex-sa"
rbac:
create: true
podAnnotations: {}
podDisruptionBudget:
enabled: false
minAvailable:
maxUnavailable:
priorityClassName: ""
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
annotations: {}
type: ClusterIP
ports:
http:
port: 5556
nodePort:
https:
port: 5554
nodePort:
grpc:
port: 5557
nodePort:
ingress:
enabled: true
className: ""
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
cert-manager.io/cluster-issuer: tls #集群内曾经装置了 cert-manager,通过 cert-manager 来进行证书签发
hosts:
- host: dex-qke.lishuai.fun
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: dex-tls
hosts:
- dex-qke.lishuai.fun
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
这里有几点须要留神:
- Gitlab 配置下的 groups 为项目组,须要依据理论状况填写,此处填写项目组的成员才会容许通过 Dex 进行身份认证
- 如果集群内没有装置 cert-manager,须要手动创立证书的 secert
执行如下命令进行装置。
root@i-tsfhx8p6:~/qke-k8s/dex# ls
dex dex-0.5.0.tgz
#在当前目录执行
kubectl create ns dex
kubectl -n dex install dex dex
root@i-tsfhx8p6:~/qke-k8s/dex# kubectl -n dex get pod
NAME READY STATUS RESTARTS AGE
dex-d8c5cdfc-577gf 1/1 Running 0 21h
配置 KubeSphere
装置好 Dex 后须要批改 cluster-configuration.yaml
。
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
metadata:
name: ks-installer
namespace: kubesphere-system
labels:
version: v3.1.1
spec:
persistence:
storageClass: "longhorn" # If there is no default StorageClass in your cluster, you need to specify an existing StorageClass here.
authentication:
jwtSecret: ""
authenticateRateLimiterMaxTries: 10
authenticateRateLimiterDuration: 10m0s
oauthOptions:
accessTokenMaxAge: 1h
accessTokenInactivityTimeout: 30m
identityProviders:
- name: dex
type: OIDCIdentityProvider
mappingMethod: auto
provider:
clientID: 'dex-k8s-authenticator'
clientSecret: 'gener*******ongRandomPhrase'
issuer: https://dex-qke.lishuai.fun
redirectURL: http://kubesphere.lishuai.fun/oauth/redirect/dex
scopes:
- openid
- email
......
参数释意:
authenticateRateLimiterMaxTries
:authenticateLimiterDuration
指定的期间内容许的最大间断登录失败次数。如果用户间断登录失败次数达到限度,则该用户将被封禁。authenticateRateLimiterDuration
: 作用于authenticateRateLimiterMaxTries
。loginHistoryRetentionPeriod
: 用户登录记录保留期限,过期条目将被主动删除。maximumClockSkew
: 管制执行对工夫敏感的操作(例如验证用户令牌的过期工夫)时容许的最大时钟偏移,默认值为 10 秒。multipleLogin
: 容许多个用户同时从不同地位登录,默认值为true
。jwtSecret
: 签发用户令牌的密钥,最小长度为 32 个字符。多集群环境须要留神的事项。
oauthOptions
: OAuth 设置
accessTokenMaxAge
: 拜访令牌有效期。对于多集群环境中的成员集群,默认值为0h
,这意味着拜访令牌永不过期。对于其余集群,默认值为2h
。accessTokenInactivityTimeout
: 令牌闲暇超时工夫。该值示意令牌过期后,刷新用户令牌最大的间隔时间,如果不在此工夫窗口内刷新用户身份令牌,用户将须要从新登录以取得拜访权。-
identityProviders:身份提供者设置
name
: 身份提供者的名称。type
: 身份提供者的类型。mappingMethod
: 帐户映射形式. 值能够是auto
或者lookup
。- 默认值为
auto
, 通过第三方帐户登录时会主动创立关联帐户。 - 如果值为
lookup
, 你须要手动关联第三方帐户与 KubeSphere 帐户。 provider
: Identity provider 配置,此局部中的字段依据身份提供的类型而异
provider:
- clientID: OAuth2 客户端 ID
- clientSecret: OAuth2 客户端 secert
- issuer:dex 的地址
- redirectURL:重定向到 ks-console 的 URL,留神这个地址要在 dex 里也配置
批改完后执行 kubectl apply -f cluster-configuration.yaml
。
也能够通过以下命令批改认证配置:
kubectl -n kubesphere-system edit cc ks-installer
配置示例:
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
metadata:
name: ks-installer
spec:
authentication:
jwtSecret: ********************************
authenticateRateLimiterMaxTries: 10
authenticateRateLimiterDuration: 10m
oauthOptions:
accessTokenInactivityTimeout: 30m
accessTokenMaxAge: 1h
identityProviders:
- mappingMethod: auto
name: github
type: GitHubIdentityProvider
provider:
...
当批改上述配置后,须要期待配置失效,能够通过以下命令查看相干进度及日志:
kubectl -n kubesphere-system logs -l app=ks-installer -f
从新利用后关上登录页面会发现登录页面多了 通过 dex 登陆
的按钮。
点击后会主动跳转到 Gitlab 进行认证,第一次登陆须要受权利用能够拜访,这里要留神容许拜访的 KubeSphere 的 Gitlab 用户为 Dex 服务中定义的 Gitlab 项目组中的用户,理论中咱们能够设置特定特定的项目组,将用户增加到项目组中来实现用户登陆的限度。
点击 authorize
容许后,KubeSphere 会让咱们确认账户信息, 此时须要正当批改用户名。
设定实现后,就能够进入 KubeSphere 了,此时该用户是没有任何拜访权限的,还须要管理员对该用户进行受权能力失常进行应用,心愿前期 KubeSphere 能够反对在用户登陆前能够对用户组进行受权,或者事后通过邮箱对用户进行收钱,防止用户登陆后,管理员还须要手动去创立权限。
本文由博客一文多发平台 OpenWrite 公布!