1. 概述

Amazon Elastic Kubernetes Service (Amazon EKS) 是一项托管服务,可让您在 AWS 上轻松运行 Kubernetes,而无需支持或维护您自己的 Kubernetes 控制层面。

Amazon EKS 跨多个可用区运行 Kubernetes 控制层面实例以确保高可用性。Amazon EKS 可以自动检测和替换运行状况不佳的控制层面实例,并为它们提供自动版本升级和修补。

Amazon EKS 还与许多 AWS 服务集成以便为您的应用程序提供可扩展性和安全性,包括:

  • 用于容器镜像的 Amazon ECR
  • 用于负载分配的 Elastic Load Balancing
  • 用于身份验证的 IAM
  • 用于隔离的 Amazon VPC

2. 版本

K8S 版本 K8S 发布时间 EKS 平台版本 EKS 发布日志
1.13.7 2019.6.7 eks.1 Initial release of Kubernetes 1.13 for Amazon EKS. For more information, see Kubernetes 1.13.
1.12.6 2019.2.27 eks.2 New platform version to support custom DNS names in the Kubelet certificate and improve etcd performance. This fixes a bug that caused worker node Kubelet daemons to request a new certificate every few seconds.
1.12.6 2019.2.27 eks.1 Initial release of Kubernetes 1.12 for Amazon EKS.
1.11.8 2019.3.1 eks.3 New platform version to support custom DNS names in the Kubelet certificate and improve etcd performance.
1.11.8 2019.3.1 eks.2 New platform version updating Amazon EKS Kubernetes 1.11 clusters to patch level 1.11.8 to address CVE-2019-1002100.

3. 预备

3.1. 操作环境

3.1.1 Python

  • 版本要求:>= 2.7.9
  • 用途:安装 aws cli

3.1.2 aws cli

  • 版本要求:>= 1.16.156
  • 用途:操作 aws 资源
  • 安装过程:
  1. pip install awscli --upgrade --user

3.1.3 eksctl

  • 版本要求:>= 0.1.37
  • 用途:操作 aws eks 资源
  • 安装过程:
  1. curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
  2. sudo mv /tmp/eksctl /usr/local/bin
  3. eksctl version

3.1.4 kubectl

  • 版本要求:最新版本或不低于 Kubernetes 版本 1 个小版本号。
  • 用途:操作 Kubernetes 集群
  • 安装过程:
  1. curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
  2. chmod +x ./kubectl
  3. sudo mv ./kubectl /usr/local/bin/kubectl
  4. kubectl version

3.2. 角色权限

参考:

  1. Amazon EKS 基于身份的策略示例
  2. https://github.com/weaveworks/eksctl/issues/204#issuecomment-450280786(这位小哥说他亲自试了 30 多次才补全的,而我试了将近 40 次)
  3. https://docs.aws.amazon.com/autoscaling/ec2/userguide/control-access-using-iam.html

注意:要有适量网关、VPC 和 IP 数量空余,否则会报达到最大限制错误。

3.2.1. CloudFormation 完全权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "cloudformation:*"
  8. ],
  9. "Resource": "*"
  10. }
  11. ]
  12. }

3.2.2. EKS 读写权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "VisualEditor0",
  6. "Effect": "Allow",
  7. "Action": [
  8. "eks:ListClusters",
  9. "eks:CreateCluster"
  10. ],
  11. "Resource": "*"
  12. },
  13. {
  14. "Sid": "VisualEditor1",
  15. "Effect": "Allow",
  16. "Action": [
  17. "eks:UpdateClusterVersion",
  18. "eks:ListUpdates",
  19. "eks:DescribeUpdate",
  20. "eks:DescribeCluster",
  21. "eks:ListClusters",
  22. "eks:CreateCluster"
  23. ],
  24. "Resource": "arn:aws:eks:*:*:cluster/*"
  25. }
  26. ]
  27. }

3.2.3. EC2 相关权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "VisualEditor0",
  6. "Effect": "Allow",
  7. "Action": [
  8. "ec2:CreateInternetGateway",
  9. "ec2:CreateVpc",
  10. "ec2:Describe*",
  11. "ec2:createTags",
  12. "ec2:ModifyVpcAttribute",
  13. "ec2:CreateSubnet",
  14. "ec2:CreateSubnet",
  15. "ec2:CreateRouteTable",
  16. "ec2:CreateSecurityGroup",
  17. "ec2:DeleteSecurityGroup",
  18. "ec2:AttachInternetGateway",
  19. "ec2:CreateRoute",
  20. "ec2:AuthorizeSecurityGroupIngress",
  21. "ec2:AuthorizeSecurityGroupEgress",
  22. "ec2:RevokeSecurityGroupEgress",
  23. "ec2:RevokeSecurityGroupIngress",
  24. "ec2:AssociateRouteTable",
  25. "ec2:CreateNatGateway",
  26. "ec2:AllocateAddress",
  27. "ec2:DeleteInternetGateway",
  28. "ec2:DeleteNatGateway",
  29. "ec2:DeleteRoute",
  30. "ec2:DeleteRouteTable",
  31. "ec2:DeleteSubnet",
  32. "ec2:DeleteTags",
  33. "ec2:DeleteVpc",
  34. "ec2:DescribeInternetGateways",
  35. "ec2:DescribeNatGateways",
  36. "ec2:DescribeRouteTables",
  37. "ec2:DescribeSecurityGroups",
  38. "ec2:DescribeSubnets",
  39. "ec2:DescribeTags",
  40. "ec2:DescribeVpcAttribute",
  41. "ec2:DetachInternetGateway",
  42. "ec2:DisassociateRouteTable",
  43. "ec2:RunInstances",
  44. "ec2:ReleaseAddress"
  45. ],
  46. "Resource": "*"
  47. }
  48. ]
  49. }

3.2.4. CloudWatch 相关权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "cloudwatch:ListMetrics",
  8. "cloudwatch:GetMetricStatistics",
  9. "cloudwatch:Describe*"
  10. ],
  11. "Resource": "*"
  12. },
  13. ]
  14. }

3.2.5. autoscaling 相关权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "autoscaling:CreateAutoScalingGroup",
  8. "autoscaling:DeleteAutoScalingGroup",
  9. "autoscaling:DeleteLaunchConfiguration",
  10. "autoscaling:DescribeAutoScalingGroups",
  11. "autoscaling:DescribeLaunchConfigurations",
  12. "autoscaling:DescribeScalingActivities",
  13. "autoscaling:UpdateAutoScalingGroup"
  14. ],
  15. "Resource": "*"
  16. }
  17. ]
  18. }

3.2.6. elasticloadbalancing 相关权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "elasticloadbalancing:Describe*",
  7. "Resource": "*"
  8. }
  9. ]
  10. }

3.2.7. iam 相关权限

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "VisualEditor0",
  6. "Effect": "Allow",
  7. "Action": [
  8. "iam:CreateRole",
  9. "iam:AttachRolePolicy",
  10. "iam:DetachRolePolicy",
  11. "iam:GetRole",
  12. "iam:PassRole",
  13. "iam:CreateInstanceProfile",
  14. "iam:AddRoleToInstanceProfile",
  15. "iam:RemoveRoleFromInstanceProfile",
  16. "iam:GetInstanceProfile",
  17. "iam:PutRolePolicy",
  18. "iam:DeleteRolePolicy",
  19. "iam:GetRolePolicy",
  20. "iam:ListInstanceProfiles",
  21. "iam:CreateServiceLinkedRole",
  22. "iam:ListInstanceProfilesForRole"
  23. ],
  24. "Resource": "*"
  25. }
  26. ]
  27. }

3.2.8. LaunchTemplate 相关权限

  1. {
  2. "Sid": "VisualEditor2",
  3. "Effect": "Allow",
  4. "Action": [
  5. "autoscaling:CreateLaunchConfiguration",
  6. "ec2:DeleteLaunchTemplate",
  7. "ec2:ModifyLaunchTemplate",
  8. "ec2:DeleteLaunchTemplateVersions",
  9. "ec2:CreateLaunchTemplateVersion"
  10. ],
  11. "Resource": [
  12. "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/*",
  13. "arn:aws:ec2:*:*:launch-template/*"
  14. ]
  15. }

3.3. 安装 aws-iam-authenticator

参见:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/install-aws-iam-authenticator.html

  1. curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/aws-iam-authenticator
  2. chmod +x ./aws-iam-authenticator
  3. mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
  4. echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
  5. // 获取 token?
  6. aws-iam-authenticator token -i <cluster name>
  7. // 查看调用者?
  8. aws sts get-caller-identity

3.4. 创建 kubeconfig

参见:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-kubeconfig.html

使用以下命令自动生成 kubeconfig

  1. // 生成 kubeconfig
  2. aws eks --region <your region> update-kubeconfig --name <cluster name>
  3. // 查看 kubeconfig
  4. cat ~/.kube/config

4. 开始使用

4.1. 创建集群

使用以下命令开始创建集群,其原理是:通过 aws cli 调用 CloudFormation 的相关 API,启动一个创建 EKS Cluster 的 Stack 和一个创建 EKS nodes 的 Stack 去创建集群所需的各种资源(包括网关、IP、VPC、EC2 等等)。

  1. eksctl create cluster \
  2. --name prod \
  3. --version 1.13 \
  4. --nodegroup-name standard-workers \
  5. --node-type t3.medium \
  6. --nodes 3 \
  7. --nodes-min 1 \
  8. --nodes-max 4 \
  9. --node-ami auto

注意:如果选择 P2 或 P3 实例类型和 Amazon EKS 优化的 AMI(具有 GPU 支持),则必须使用以下命令在集群上将适用于 Kubernetes 的 NVIDIA 设备插件用作守护程序集。

  1. kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml

4.2. 查看集群状态

  1. // 查看节点状态
  2. kubectl get nodes
  3. // 查看服务状态
  4. kubectl get svc
  5. // 查看事件
  6. kubectl get events --all-namespaces

4.3. 部署 Dashboard

参见:

  1. https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-cluster-kubernetes-dashboard/
  2. https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/dashboard-tutorial.html
  3. https://www.youtube.com/watch?v=JcZJqSa65Yc
  1. // 将 Kubernetes 控制面板部署到集群
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
  3. // 部署 heapster 以在集群上启用容器集群监控和性能分析
  4. kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml
  5. // 将 heapster 的 influxdb 后端部署到集群
  6. kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml
  7. // 为控制面板创建 heapster 集群角色绑定
  8. kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml
  9. // 创建一个具有新集群管理权限的新服务账户
  10. cat > eks-admin-service-account.yaml << EOF
  11. apiVersion: v1
  12. kind: ServiceAccount
  13. metadata:
  14. name: eks-admin
  15. namespace: kube-system
  16. ---
  17. apiVersion: rbac.authorization.k8s.io/v1beta1
  18. kind: ClusterRoleBinding
  19. metadata:
  20. name: eks-admin
  21. roleRef:
  22. apiGroup: rbac.authorization.k8s.io
  23. kind: ClusterRole
  24. name: cluster-admin
  25. subjects:
  26. - kind: ServiceAccount
  27. name: eks-admin
  28. namespace: kube-system
  29. EOF
  30. // 将此服务账户和集群角色绑定应用到您的集群
  31. kubectl apply -f eks-admin-service-account.yaml
  32. // 检索 eks-admin 服务账户的身份验证令牌。从输出中复制 <authentication_token> 值。您可以使用此令牌连接到控制面板
  33. kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
  34. // 将所有请求从您的 Amazon EC2 实例本地主机端口转发到 Kubernetes 控制面板端口
  35. kubectl port-forward svc/kubernetes-dashboard -n kube-system 6443:443
  36. // 从带 SSH 隧道的本地计算机访问端口
  37. ssh -i EC2KeyPair.pem ec2-user@IP -L 6443:127.0.0.1:6443

访问 https://127.0.0.1:6443 输入 Token 即可访问 Dashboard。

4.4. 删除集群

  1. eksctl delete cluster --region=<your region> --name=<cluster name>

4.5. 更多操作

参见:

【Kubernetes 系列五】在 AWS 中使用 Kubernetes:EKS的更多相关文章

  1. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

  2. kubernetes系列:(二)、kubernetes部署mysql(单节点)

    使用kubeadm搭建好kubernetes集群后就可以动手部署自己的应用了. 本文用例来自官网,如有需要请参看 kubernetes官网 一.环境说明 kubernetes 1.13.1 docke ...

  3. mysql系列五、mysql中having的用法

    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似.WHERE 搜索条件在进行分组操作之前应用:而HAVING 搜索条件在进行分组操作之后应用. ...

  4. kubernetes系列

    目录: 介绍的全部可以在github上找到,链接  haoprogrammer kubernetes学习:(一).kubeadm搭建kubernetes(v1.13.1)单节点集群 kubernete ...

  5. Kubernetes 系列(五):Prometheus监控框架简介

    由于容器化和微服务的大力发展,Kubernetes基本已经统一了容器管理方案,当我们使用Kubernetes来进行容器化管理的时候,全面监控Kubernetes也就成了我们第一个需要探索的问题.我们需 ...

  6. Kubernetes系列02—Kubernetes设计架构和设计理念

    本文收录在容器技术学习系列文章总目录 1.Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分 ...

  7. kubernetes系列(十四) - 存储之PersistentVolume

    1. PersistentVolume(PV)简介 1.1 为什么需要Persistent Volume(PV) 1.2 PersistentVolume(PV)和Volume的区别 1.3 PV和P ...

  8. 从0到1使用Kubernetes系列(六):数据持久化实战

    本文是从 0 到 1 使用 Kubernetes 系列第六篇,上一篇<从 0 到 1 使用 Kubernetes 系列(五):Kubernetes Scheduling>介绍了 Kuber ...

  9. 从0到1使用Kubernetes系列(八):Kubernetes安全

    本文是从 0 到 1 使用 Kubernetes 系列第八篇,上一篇从0到1使用Kubernetes系列(七):网络介绍了 K8S 网络相关的内容,本文将带你了解 K8S 的安全问题. Kuberne ...

随机推荐

  1. 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计

    使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...

  2. ajax请求中 两种csrftoken的发送方法

    通过ajax的方式发送两个数据进行加法运算 html页面 <body> <h3>index页面 </h3> <input type="text&qu ...

  3. scrapy基础知识之 Logging:

    修改配置文件settings.py,任意位置添加 LOG_FILE = "XxSpider.log" LOG_LEVEL = "INFO" Log levels ...

  4. JS格式化JSON后的日期

    序列化后日期变成了 /Date(1494524134000+0800)\ 这种格式 不能正常显示了 但也不能为了这个吧所有服务的DateTime字段都改成String类型 于是找了一个JS的扩展方法来 ...

  5. Abnormal build process termination IDEA启动报错

    报错如下: Error:Abnormal build process termination: "C:Program FilesJavajdk1.11.0_1injava" -Xm ...

  6. css单位中px和em,rem的区别

    css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...

  7. JAVA十大经典排序算法最强总结(含JAVA代码实现)

    十大经典排序算法最强总结(含JAVA代码实现)   最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在“桶排序”算法中对每 ...

  8. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念

    目录 1. 使用Anypoint Studio开发 2. Mule ESB Application Structure - Mule ESB应用程序结构 3. Mule ESB Application ...

  9. 微信小程序开发--页面结构

    一.微信小程序开发--页面文件组成 [page.name].js 页面逻辑文件,用于创建页面对象,以及处理页面生命周期控制和数据处理 [page.name].wxml wxml指的是Wei Xin M ...

  10. 【Netty】使用解码器Decoder解决TCP粘包和拆包问题

    解码器Decoder和ChannelHandler的关系 netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter ...