我们在与客户沟通过程中了解到,一些从基于 EC2 自建的 Kubernetes 迁移到使用 Amazon Elastic Kubernetes Service (Amazon EKS) 托管服务的客户,在使用过程中体会到了 Amazon EKS 带来的高性能、高可靠、自动扩展等等优势,但也有遇到一些使用不便的情况。这是由于客户在基于 EC2 自建 Kuberntes 的环境中,可以完全掌控包括 API Server 的启动配置在内的所有资源,而托管的Amazon EKS 不支持客户手动管理  API Server。这给客户带了一些困扰,比如之前通过使用 Kubernetes API Server 功能结合外部 OIDC Provider 进行用户统一管理的客户,在 Amazon EKS 上无法像之前那样使用。虽然有一些变通的方法,如:使用 kube-oidc-proxy 实现,但是配置和管理复杂度增加了很多。

  • kube-oidc-proxy:

    https://aws.amazon.com/cn/blogs/opensource/consistent-oidc-authentication-across-multiple-eks-clusters-using-kube-oidc-proxy/

Amazon EKS 近期上线了新功能,在 Amazon EKS 1.16 后的版本支持配置 OIDC Provider,简化了用户管理配置。为了方便大家熟悉和使用该功能,本文将通过一步步的配置,介绍如何使用 Dex 和 dex-k8s-authenticator 结合新功能来实现 Amazon EKS 对外部用户进行身份验证。本方案不仅支持对多个 Amazon EKS 集群进行统一认证管理,同时也可以支持将其他云厂商托管的 Kubernetes 通过 Dex 进行统一身份认证。本文中,我们将展示两部分内容:一、对 Amazon EKS 进行外部身份认证后执行 kubectl 命令。二、对 Amazon EKS 进行外部身份认证后浏览 Kubernetes Dashaborad

???? 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~

第一部分

核心认证流程如下图:

方案中的主要组件说明:

  1. Dex 是一种身份认证服务,它使用 OpenID Connect 来驱动其他应用程序的身份验证。Dex 通过“connectors”充当其他身份提供商的门户。这让 dex 将身份验证推到 LDAP 服务器、SAML 提供商或已建立的身份提供商(如 GitHub、Gitlab、Google 和 Active Directory等)。客户端编写身份验证逻辑以与 dex 交互认证,然后 dex 通过 connector 转发到后端用户认证方认证,并返回给客户端 Oauth2 Token。与其相似的还有 Keycloak,auth0 等。

  2. dex-k8s-authenticator 是一个web-app,它可以与 Dex 进行交互并获取 Dex 生成的 token 创建和修改 kubeconfig 文件的命令。用户执行这些生成的命令后可以完成 kubeconfig 文件配置。

前置条件:

  1. 准备 Amazon EKS 集群,版本大于16。Amazon EKS 1.16 或以上的版本支持 OIDC Provider

  2. 本文中将使用 github 来模拟用户身份提供验证方,需要准备 github 账户并启用 team 功能

  3. 需要有一个公网域名。Amazon EKS 要求OIDC 身份提供商的颁发者 URL 必须可公开访问,以便 Amazon EKS 能够发现签名密钥。Amazon EKS 不支持拥有自签名证书的 OIDC 身份提供商。

  4. (可选)建议打开 Amazon EKS 打开控制平面 CloudWatch 日志,通过查看 CloudWatch log 方便排查配置错误。开启步骤,请参阅启用和禁用控制平面日志设置开启。

  • 启用和禁用控制平面日志:

    https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/control-plane-logs.html#enabling-control-plane-log-export

部署测试

步骤一、安装 Nginx ingress controller

在创建 Nginx ingress controller 前,先检查确认 Amazon EKS 集群公有子网的标签(Tags),确认添加以下标签。

1kubernetes.io/cluster/<EKS_CLUSTER_NAME>=shared

本文中 NGINX ingress controller 用来将流量路由到 Dex 和 dex-k8s-authenticator , 安装命令如下

1kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.45.0/deploy/static/provider/aws/deploy.yaml

安装完成后会自动创建一个 internet-facing 的 NLB。执行以下命令确认安装完成,

1kubectl get svc -n ingress-nginx

步骤二、安装 cert-manager

cert-manager 用于从 Let’s Encrypt 获取 TLS 证书。这些证书将分配给 Dex 和 dex-k8s-authenticator 的 ingress。安装 cert-

manager 命令:

添加 JetStack Helm 仓库:

1helm repo add jetstack https://charts.jetstack.io

更新 Helm cache:

1helm repo update

安装 chart:

1helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.3.1 --set installCRDs=true

在 Amazon EKS 中创建证书签发机构:

 1cat << 'EOF' | kubectl apply -f -2kind: ClusterIssuer3apiVersion: cert-manager.io/v14metadata:5  name: acme6spec:7  acme:8    email: alias@yourdomain.com9    preferredChain: ''
10    privateKeySecretRef:
11      name: acme-account-key
12    server: 'https://acme-v02.api.letsencrypt.org/directory'
13    solvers:
14      - http01:
15          ingress:
16            class: nginx
17EOF

步骤三、配置 github OAuth App

登陆 github 账户,在 “setting” 中选择“Organizations” 选项:

使用免费的账户就可以满足本文需求,创建 Organization 后,在 “Setting” -> “Developer setting” 选项卡中新建一个 OAuth App:

Homepage URL 部分填入准备为 Dex 使用的 URL,

例如:https://dex.yourdomain.com

Authorization callback URL 部分填入 Homepage URL 加 /callback,

例如:https://dex.yourdomain.com/callback

创建完成后记录下 Client ID 和 Client Secret ,后续配置 Dex 使用。

步骤四、安装和配置Dex

添加 Dex Helm 仓库

1helm repo add dex https://charts.dexidp.io

Update Helm cache

1helm repo update

为 Dex Helm 创建 Value File,使用您自己的域名和上述步骤记录的信息替换对应内容

 1cat << 'EOF' > dex.yaml2ingress:3  enabled: true4  className: nginx5  annotations:6    kubernetes.io/tls-acme: "true"7    cert-manager.io/cluster-issuer: acme8  hosts:9    - host: dex.yourdomain.com
10      paths:
11        - path: /
12          pathType: ImplementationSpecific
13  tls:
14    - secretName: dex-tls
15      hosts:
16        - dex.yourdomain.com
17
18config:
19  issuer: https://dex.yourdomain.com
20
21  storage:
22    type: kubernetes
23    config:
24      inCluster: true
25
26  oauth2:
27    responseTypes: ["code", "token", "id_token"]
28    skipApprovalScreen: true
29
30  connectors:
31    - type: github
32      id: github
33      name: GitHub
34      config:
35        clientID: "{{ .Env.GITHUB_CLIENT_ID }}"
36        clientSecret: "{{ .Env.GITHUB_CLIENT_SECRET }}"
37        redirectURI: https://dex.yourdomain.com/callback
38        orgs:
39          - name: your-github-org-name
40            teams:
41              - your-github-team-name
42
43  staticClients:
44    - id: your-cluster-client-id
45      secret: your-cluster-client-secret
46      name: "Your EKS Cluster"
47      redirectURIs:
48        - https://login.yourdomain.com/callback
49# Note: this will inject the environment variables directly to the pods.# In a production environment you should mount these keys from a secret using envFrom.# See https://artifacthub.io/packages/helm/dex/dex#values
50env:
51  GITHUB_CLIENT_ID: "your-github-client-id"
52  GITHUB_CLIENT_SECRET: "your-github-client-secret"
53EOF

安装 Dex chart

1helm install dex dex/dex --namespace dex --create-namespace --version 0.2.0 --values dex.yaml

步骤五、安装和配置 dex-k8s-authenticator

添加 如下 Helm 仓库

1helm repo add skm https://charts.sagikazarmark.dev

Update Helm cache

1helm repo update

获取 Amazon EKS 集群客户端证书:

1aws eks describe-cluster --name <cluster-name> --query 'cluster.certificateAuthority' --region <region> --output text | base64 -d

为 dex-k8s-authenticator 创建 Value 文件:

 1cat << 'EOF' > dex-k8s-authenticator.yaml 2config:3  clusters:4    - name: your-cluster5      short_description: "Your cluster"6      description: "Your EKS cluster"7      issuer: https://dex.yourdomain.com8      client_id: your-cluster-client-id9      client_secret: your-cluster-client-secret
10      redirect_uri: https://login.yourdomain.com/callback
11      k8s_master_uri: https://your-eks-cluster-endpoint-url
12      k8s_ca_pem: |
13        -----BEGIN CERTIFICATE-----
14        YOUR CLIENT CERTIFICATE DATA
15        -----END CERTIFICATE-----
16
17ingress:
18  enabled: true
19  className: nginx
20  annotations:
21    kubernetes.io/tls-acme: "true"
22    cert-manager.io/cluster-issuer: acme
23  hosts:
24    - host: login.yourdomain.com
25      paths:
26        - path: /
27          pathType: ImplementationSpecific
28  tls:
29    - secretName: dex-k8s-authenticator-tls
30      hosts:
31        - login.yourdomain.com
32EOF

安装 dex-k8s-authenticator chart

1helm install dex-k8s-authenticator skm/dex-k8s-authenticator --namespace dex --version 0.0.1 --values dex-k8s-authenticator.yaml

步骤六、配置 Amazon EKS OIDC Provider

参考官方文档步骤为 Amazon EKS 关联 OIDC 提供商,需要注意:

Client ID 输入上文创建 Dex 时设置的 staticClients 对应的 id 字段内容。

  • 官方文档步骤:

    https://docs.amazonaws.cn/eks/latest/userguide/authenticate-oidc-identity-provider.html#associate-oidc-identity-provider

Username  输入 email

Groups 输入 groups

步骤七、在 Amazon EKS 中创建 ClusterRole 和 ClusterRoleBinding

本文测试创建一个只读权限的 cluster role,您可以根据自己的实际需求创建分配对应的权限。

 1cat << 'EOF' | kubectl apply -f - 2apiVersion: rbac.authorization.k8s.io/v13kind: ClusterRole4metadata:5  name: cluster-read-all6rules:7- apiGroups:8    - ""9    - apps
10    - autoscaling
11    - batch
12    - extensions
13    - policy
14    - rbac.authorization.k8s.io
15    - storage.k8s.io
16  resources:
17    - componentstatuses
18    - configmaps
19    - cronjobs
20    - daemonsets
21    - deployments
22    - events
23    - endpoints
24    - horizontalpodautoscalers
25    - ingress
26    - ingresses
27    - jobs
28    - limitranges
29    - namespaces
30    - nodes
31    - pods
32    - pods/log
33    - pods/exec
34    - persistentvolumes
35    - persistentvolumeclaims
36    - resourcequotas
37    - replicasets
38    - replicationcontrollers
39    - serviceaccounts
40    - services
41    - statefulsets
42    - storageclasses
43    - clusterroles
44    - roles
45  verbs:
46    - get
47    - watch
48    - list
49- nonResourceURLs: ["*"]
50  verbs:
51    - get
52    - watch
53    - list
54- apiGroups: [""]
55  resources: ["pods/exec"]
56  verbs: ["create"]
57EOF

创建 ClusterRoleBinding:

 1cat << 'EOF' | kubectl apply -f -2apiVersion: rbac.authorization.k8s.io/v13kind: ClusterRoleBinding4metadata:5  name: dex-cluster-auth6roleRef:7  apiGroup: rbac.authorization.k8s.io8  kind: ClusterRole9  name: cluster-read-all
10subjects:
11  - kind: Group
12    name: "your-github-org:your-github-team"
13    apiGroup: rbac.authorization.k8s.io
14EOF
15Bash

步骤八、配置域名解析

在您的 DNS 服务商(Amazon Route53 或其他域名 DNS 服务商)处配置域名解析。增加以下两个域名解析信息。CNAME 到步骤一中创建的 NLB 地址。

步骤九、登陆测试

输入 https://login.yourdomain.com 登陆 github 账号并给 dex-auth 授权

登陆并授权后自动跳转到 dex-k8s-authenticator 页面,

dex-k8s-authenticator 生成配置 kubeconfig 文件的命令:

执行上述命令完成 kubeconfig 配置后,登陆 Amazon EKS 进行测试:

可以看到通过 OIDC 用户可以登陆 Amazon EKS,并且用户权限符合预期。

第二部分

在这部分中,我们演示如何在 Amazon EKS 中将 Kubernetes Dashboard 设置对外访问并使用上一部分生成的 Token 登陆。

步骤一、安装 Kubernetes Dashboard

参考部署 Kubernetes 控制面板 (Web UI)  ,安装 Dashboard。安装完成后使用 kubectl proxy 模式访问确认安装成功。

  • 部署 Kubernetes 控制面板 (Web UI):

    https://docs.amazonaws.cn/eks/latest/userguide/dashboard-tutorial.html

步骤二、配置 Kubernetes Dashboard Ingress

配置 Ingress 以允许从外部直接访问 Kubernetes Dashboard。将以下内容保存为 dashboard-ingress.yaml 并执行。

 1apiVersion: networking.k8s.io/v1beta12kind: Ingress3metadata:4  annotations:5    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"6    kubernetes.io/tls-acme: "true"7    cert-manager.io/cluster-issuer: acme8    kubernetes.io/ingress.class: "nginx"9    nginx.ingress.kubernetes.io/use-regex: "true"
10  name: external-auth-oauth2
11  namespace: kubernetes-dashboard
12spec:
13  rules:
14  - host: <dashboard.yourdomain.com>
15    http:
16      paths:
17      - backend:
18          serviceName: kubernetes-dashboard
19          servicePort: 443
20        path: /
21  tls:
22  - hosts:
23    - <dashboard.yourdomain.com>
24    secretName: dashboard-secret

这里要注意 Amazon EKS 暴露 443 端口,需通过 https 协议访问,要在 annotations 单独设置。

1kubectl apply -f dashboard-ingress.yaml

步骤三、登陆测试

浏览器访问步骤二中设置的域名

输入第一部分生成的 Token 后完成认证,如下图所示,复制红色线框内的 Token 内容。

登陆到 Kubernetes Dashboard 中的用户也只有第一部分中定义的只读权限。

至此,完成两部分配置内容。

总结

在这篇文章中,我们介绍了如何使用 Amazon EKS 支持与 OIDC Provider 关联的新特性。我们使用开源 OIDC Provider Dex 和 web 应用dex-k8s-authenticator 的集成提供了一个身份验证层,将 GitHub Organizations team 与 GitHub OAuth 应用程序一起用作 IdP,将 OpenID Connect (OIDC) 身份提供商 (IdP) 集成添加到 Amazon EKS。方便 Amazon EKS 用户,统一管理对集群的访问控制。

本篇作者

马卫军

亚马逊云科技中国团队解决方案架构师

负责基于亚马逊云科技的云计算方案架构咨询和设计,同时致力于亚马逊云科技云服务在国内教育行业的应用和推广。有丰富的数据仓库以及大数据开发和架构设计经验。马卫军平时热爱爬山和足球,同时也乐于和他人分享自己的各种经历。

听说,点完下面4个按钮

就不会碰到bug了!

Amazon EKS 新功能上线——助你降低配置和管理复杂度相关推荐

  1. “指标预警”新功能上线,智能实现数据监测

    双十一大促通宵订单数十万,分区服务器宕机大量用户付款失败: 周会 leader 需要数据报表,每周耗费大量时间做图写报告,耗时耗力: 电影看到高潮,calendar 提醒自己到了发日总结的时间,无奈打 ...

  2. 报告!优维科技EasyOps®️全栈运维平台又一大波新功能上线

    报告!优维EasyOps®️全栈运维平台又迎来了一大波新功能上线: 涉及HyperInsight超融合监控.CMDB.ITSM.自动化运维.DevOps · 持续集成.公共服务.UI 8.0 & ...

  3. 盛世昊通董车长APP新功能上线,看视频获收益

    近日,盛世昊通董车长APP新功能上线,新版本中首次加入视频广告"任务中心",看视频广告就能获取收益,通过该功能,用户只要在董车长APP中邀请好友一起看视频做任务即可获取高额视频豆. ...

  4. 滴滴服务分计算机制,滴滴服务分改版!新功能上线!司机:太好了

    原标题:滴滴服务分改版!新功能上线!司机:太好了 日前,滴滴快车服务分全新改版上线 升级后,乘客在完单后三天内(含完单当天) 没有进行投诉或差评的订单 都会按照"默认好评"订单加0 ...

  5. 博客新功能上线,可导出PDF……【2021.12.14】

    hello,大家好,这里是「CSDN产品周报」第21期.本次更新主要涉及首页榜单.博客.问答,具体细节请往下看. 一.CSDN榜单优化 1.排行榜导航栏从右侧移动到左侧 2.新增「原力月榜」,选取全站 ...

  6. 新功能上线:JCJC错别字检测支持自定义词汇啦!

    新功能上线:JCJC错别字检测支持自定义词汇啦! 从2016年10月上线以来,JCJC错别字检测一直努力提高错别字检测的效果和方便更多行业用户使用. 今天,2019年6月15日,我们上线了:自定义词汇 ...

  7. 火车票自动抢票新功能上线了!堪比抢票神器

    端午节假日越来越近了,小编已开始频频收到好友们的助力抢票请求了. 假日出行回家已经迫不及待却抢不到火车票,各种加速软件层出不穷缺又抢不到十分尴尬,甚至还要花费一笔额外的加速费用-- 不过现在不用担心了 ...

  8. “触达率图”新功能上线,量化网页浏览深度

    运营人员和产品人员工作的核心,是将自己的产品/内容有效展示给精准受众,并获得认可. 拥有数据分析的同学一定知道,此处应当通过关注部分数据指标监测效果.如关注 PV.UV 等监测页面流量是否增加,使用网 ...

  9. 小红书3大新功能上线,提升笔记转化率和品牌投放效果

    近来,小红书为进一步提升笔记转化效率和品牌投放效果,新上线3项功能.下面我们来看看相关资讯和功能解读: 聚光平台挂载「笔记营销组件」,实现种草→转化的高效衔接 资讯速览 5月底,小红书聚光平台「笔记营 ...

最新文章

  1. 数据结构与算法:02 C#语言基本语法结构
  2. AI做不了“真”3D图像?试试Google的新生成模型
  3. python遍历文件夹下所有文件大小_python遍历文件夹读取文件大小 | 学步园
  4. 3-自定义BI启动版是否隐藏CMS名称
  5. java 向上抛异常_java throws 向上抛出的概念问题
  6. suse 内核编译安装_升级SUSE Linux内核的完整步骤!
  7. php mysql 正则_MySQL 正则表达式
  8. 《剑指Offer》38:字符串的排列
  9. php数组删除key和值,php删除数组指定key的元素
  10. EventBus的使用
  11. Python源码深度解析—float类型对象
  12. 【matlab深度学习工具箱】classificationLayer参数详解
  13. 30天自己制作操作系统中二进制编辑器BZ-1621
  14. AI创作教程之 Stable Diffusion 为何是人工智能新时代艺术创作的基石
  15. 太阳方位角 太阳天顶角
  16. android隐藏桌面图标
  17. python实现微信付款码支付(刷卡支付)(纯python)
  18. 苹果自带的清理软件_软件| 卸载软件、清理文件,你只需Revo Uninstaller Pro(自带注册程序)...
  19. 计算机管理上移动硬盘显示其他设备,移动硬盘坏了插上之后电脑会显示有新设备接入而且设备运转正常,但我 爱问知识人...
  20. python定积分1002无标题_python 求定积分和不定积分

热门文章

  1. 恶意软件XcodeGhost S:变种带来的又一波影响
  2. Wireshark 的RTMP抓包里面0x0 unknown的问题
  3. Linux的远程终端连不上,Linux系统远程连接终端连接不上怎么办
  4. c语言中fbfd函数,FBFD
  5. 洛谷P1023 税收与补贴
  6. 通过朋友圈网易云链接获取网易云账号及微博的方法
  7. 分布式解决方案-全面解密分布式任务调度平台-XXLJob调度中心集群
  8. 教育界杂志教育界杂志社教育界编辑部2022年第10期目录
  9. 初级会计好考吗?怎么准备考试?
  10. android 自定义apk名,Android Studio 打包自定义apk文件名