AWS上创建EKS(K8S)集群

 

1.注意事项及准备工作

  • EKS分为EKS Master和EKS Node两种角色;EKS Master为全托管,EKS Node为CloudFormation创建
  • EKS Node若在NAT网络里,一定要注意,NAT网络一定要与外网联通,因为EKS Node连接EKS Master使用外网去连接.(在小章节里会配置详细配置图片)
  • EKS的VPC的DNS hostnames Enabled设置一定要打开,否则无法解析EKS的域名,导致EKS Node无法连接EKS Master.
  • 需要准备的资源。

    VPC,igw网络和nat网络都需要,dns设置打开.

    安全组,创建EKS Master需要指定一个安全组

    密钥:创建EKS Master和Node时需要.

 

2.创建VPC以及子网

  1.这里为手动创建vpc,所以和CloudFormation创建的vpc会少很多标签,结果就是k8s的service模式无法使用 Local模式去访问。

  2.NAT网关,出网映射的子网一定要是在pub网络里面,也就是说,这个子网必须可以使用igw连接互联网。

 

  子网规划,三个可用区三个子网组成一个服务类型子网,比如igw是public网络,那么由三个可用区的三个子网组成.

子网网段/24 可用区 网络类型
10.1.50.0 ap-northeast-1a igw
10.1.51.0 ap-northeast-1b igw
10.1.52.0 ap-northeast-1c igw
10.1.53.0 ap-northeast-1a nat
10.1.54.0 ap-northeast-1b nat
10.1.55.0 ap-northeast-1c nat

  创建vpc等一些工作手动创建,这里不做讲解.这里只讲解创建igw和nat的网络类型。

 

2.1 创建internet网关

  1.打开aws vpc,点击internet网关,并创建。

  2.输入名称创建igw网关,这里只有创建

  3.创建路由表关联igw

  4.路由表关联子网

  找到做好分类的子网,然后关联

 

2.2 创建nat网关

  1.创建NAT网关.

  这里选择的子网一定要在igw里面,否则还是无法出网。

  2.创建路由表

  3.关联子网

 

3.创建EKS Master

  创建EKS Master有图形化方式和aws cli方式,截止2019年8月14日,图形化创建会存在bug,bug为当前vpc下的所有子网,不管是否选择都会全部提交,所以可能存在某些可用区无法创建EKS Master的问题.

 

3.1 图形化创建

  存在bug。

  1.打开EKS创建按钮,开始配置集群信息

  输入集群名称,选择版本,并且创建一个可以管理EKS的Role name。

  2.选择子网以及安全组以及是否对公网访问

  就是这里存在bug,不管选择与否,都会提交所有子网。

  这里的private access的意思就是必须vpc到aws内网才可以使用。

 

3.2 aws cli

  以下只有命令,标红的地方根据实际调整

aws eks --region ap-northeast-1 create-cluster --name ap-lcm-prod-k8sMaster \
--role-arn arn:aws:iam::858659433780:role/eks \
--resources-vpc-config subnetIds=subnet-07d73b9f0a2899ebb,subnet-0da4b758a0bb5709e,subnet-08114567a3be57a9c,subnet-0d3bb405d6755b74c,subnet-097f1b494870d1da2,subnet-0d38ee1c1f5cc7922,securityGroupIds=sg-0bd1f1fd24d388f89

  创建完成会有成功提示

 

4.创建EKS Node

  aws创建EKS Node只有CloudFormation

  1.创建堆栈,选择安全组

  2.选择Node的名称以及imageid

  3.选择磁盘大小以及子网

  4.下面一页直接下一步,到第三页勾选确认.

  这一步EKS Node创建完成了,EKS的Node安全组会自动创建,指定了master的安全组,它会自动创建一些规则在master的安全组里面并自动创建Node的安全组。

  5.配置EKS Node连接 EKS Master

  下载、编辑和应用AWS身份验证器配置映射

curl -o aws-auth-cm.yaml https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/aws-auth-cm.yaml
文件内容如下
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ARN of instance role (not instance profile)>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

  在cloudformation获取ARN

 

5.EKS Node自动缩扩容

  在EKS Node使用CloudFormation时会自动创建一个auto scaling组,但是该组里面没有任何策略,并且如果设置也仅仅只能依据cpu的使用率来设置,因此,aws有一个专门针对cluster来设置的服务。

  官方链接:https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-cluster-autoscaler-setup/

 

5.1 简短描述

  Cluster Autoscaler是一个工具,可在满足下列任意一项条件时自动调整 Kubernetes 集群的大小:

    • 有Pod因为资源不足而无法在集群中运行。
    • 集群中有节点长时间利用率不足,并且其 Pod 可以放置到其他现有的节点。

  AWS上的Cluster Autoscaler会扩展任何指定 Auto Scaling 组内的工作线程节点,并在您的集群中作为部署运行。

  注意:以下解决方案假定您拥有一个活动的 Amazon EKS 集群,并且该集群与使用 AWS CloudFormation 模板创建的工作线程节点关联。以下示例使用了自动发现设置。您还可以通过指定一个或多个 Auto Scaling 组来配置 Cluster Autoscaler。

 

5.2 部署

5.2.1 创建标签

  1.打开AWS CloudFormation 控制台,选择您的堆栈,然后选择资源选项卡

  要查找您的堆栈创建的 Auto Scaling 组资源,请在逻辑 ID列查找 NodeGroup

  这个组可以在EC2的Auto Scaling组里面找到对应的。

  2.打开Amazon EC2 控制台,然后从导航窗格中选择Auto Scaling 组。选择标签选项卡,然后选择添加/编辑标签。

Key: k8s.io/cluster-autoscaler/enabled  
Key: k8s.io/cluster-autoscaler/awsExampleClusterName  

  将awsExampleClusterName替换为您的 EKS 集群的名称

 

5.2.2 创建策略并关联

  1.创建IAM策略

  根据如下示例创建IAM 策略并将该策略命名为ClusterAutoScaler,从而为运行 Cluster Autoscaler 的工作线程节点授予访问所需资源和执行所需操作的权限

{  
    "Version": "2012-10-17",  
    "Statement": [  
        {  
            "Effect": "Allow",  
            "Action": [  
                "autoscaling:DescribeAutoScalingGroups",  
                "autoscaling:DescribeAutoScalingInstances",  
                "autoscaling:DescribeLaunchConfigurations",  
"autoscaling:DescribeTags", "autoscaling:SetDesiredCapacity", "autoscaling:TerminateInstanceInAutoScalingGroup" ], "Resource": "*" } ] }

  2.向Amazon EKS 工作节点的实例角色附加此新策略

  可以从CloudFormation 来查看node的策略。

  将刚才创建ClusterAutoScaler附加到这个策略上面来。

 

5.2.3 部署 Cluster Autoscaler

  1.部署 Cluster Autoscaler

  要在 GitHub 上下载 Cluster Autoscaler 项目提供的示例部署文件,请运行以下命令

wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml  

  2.打开下载的 YAML 文件并根据下例设置 EKS 集群名称 (awsExampleClusterName) 和环境变量 (us-east-1)。然后保存更改

  然后执行命令

kubectl apply -f /k8s/cluster-autoscaler-autodiscover.yaml  
kubectl logs -f deployment/cluster-autoscaler -n kube-system  

 

5.3 测试

  1.要查看当前的工作线程节点数量,请运行以下命令:

kubectl get nodes  

  2.要增加工作线程节点的数量,请运行以下命令:

kubectl create deployment autoscaler-demo --image=nginx  
kubectl set resources deployment.v1.apps/autoscaler-demo -c=nginx --limits=cpu=1000m  
kubectl scale deployment autoscaler-demo --replicas=20  

  注意:此命令会使用 NGINX 映像直接在 Kubernetes 集群上创建一个名为 autoscaler-demo 的部署,然后启动 20 个 Pod。

  3.要检查部署的状态并看到 Pod 的数量在增加,请运行以下命令:

kubectl get deployment autoscaler-demo --watch  

  4.当可用 Pod 的数量达到 50 时,请运行以下命令检查工作线程的数量:

kubectl get nodes  

 

  清理测试部署

  1.要通过删除之前创建的部署 autoscaler-demo来收缩工作线程节点,请运行以下命令:

kubectl delete deployment autoscaler-demo  

  2.要查看工作线程节点的数量,请等待大约 30 分钟,然后运行以下命令:

kubectl get nodes 

 

6.连接EKS

6.1 更新kubeconfig

  这样会自动创建连接EKS的信息

aws eks --region region update-kubeconfig --name cluster_name

 

6.2 新增用户及权限

  如果新增用户,依然可以使用6.1的方式去更新kubeconfig.

  但是如果想动态添加用户以及权限那么就要使用以下方式了(这个步骤是热增加,其实在更新kubeconfig之前就应该做了)

[root@ip-10-5-2-39 tools]# cat /tools/aws-auth-cm.yaml  
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: aws-auth  
  namespace: kube-system  
data:  
  mapRoles: |  
    - rolearn: arn:aws:iam::858659433780:role/ap-lcm-test-k8sNode-NodeInstanceRole-TAZECTU1GNIJ   
      username: system:node:{{EC2PrivateDNSName}}  
      groups:  
        - system:bootstrappers  
        - system:nodes  
  #这里开始全部为新增,userarn和username不做讲解,主要是新增groups,这个是k8s默认的system:masters集群绑定了cluster-admin的权限,把用户加入这个组,就会有集群管理员权限.system:masters是一个集群绑定,在集群里面不可见,但是可以翻阅官方文档,看到它绑定了cluster-admin这个角色.如果需要把用户赋予其它权限,可以深入去了解RBAC,这里不做讲解  
  mapUsers: |  
    - userarn: arn:aws:iam::858659433780:user/zexiong.li  
      username: zexiong.li  
      groups:  
        - system:masters  

  默认用户其实就是aws的登录用户,以下就是aws 官方文档给出的答案,这里和上面的可以辅助观看,这里的文档和上面不是承上启下关联的

  当您创建一个 Amazon EKS 集群时,将在集群的 RBAC 配置中自动为创建集群的 IAM 实体用户或角色(例如,联合身份用户)授予 system:masters 权限。要授予其他 AWS 用户或角色与您的集群进行交互的能力,您必须编辑 Kubernetes 内的 aws-auth ConfigMap [1]. 例如我们添加了 IAM 用户 arn:aws:iam::858659433780:user/zexiong.li 在 mapUsers 部分

 

7.故障处理

7.1 dns hostname

  VPC的dns hostname没有打开就会有以下报错

posted @ 2021-06-07 19:14  小家电维修  阅读(2407)  评论(0编辑  收藏  举报