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

我们在与客户沟通过程中了解到,一些从基于 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: ClusterIssuer
 3apiVersion: cert-manager.io/v1
 4metadata:
 5  name: acme
 6spec:
 7  acme:
 8    email: alias@yourdomain.com
 9    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.yaml
 2ingress:
 3  enabled: true
 4  className: nginx
 5  annotations:
 6    kubernetes.io/tls-acme: "true"
 7    cert-manager.io/cluster-issuer: acme
 8  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-cluster
 5      short_description: "Your cluster"
 6      description: "Your EKS cluster"
 7      issuer: https://dex.yourdomain.com
 8      client_id: your-cluster-client-id
 9      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/v1
 3kind: ClusterRole
 4metadata:
 5  name: cluster-read-all
 6rules:
 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/v1
 3kind: ClusterRoleBinding
 4metadata:
 5  name: dex-cluster-auth
 6roleRef:
 7  apiGroup: rbac.authorization.k8s.io
 8  kind: ClusterRole
 9  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/v1beta1
 2kind: Ingress
 3metadata:
 4  annotations:
 5    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
 6    kubernetes.io/tls-acme: "true"
 7    cert-manager.io/cluster-issuer: acme
 8    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了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值