介绍:

不管是亚马逊还是阿里云集群创建完以后是没有计算节点的,这和使用kubeadm命令安装的不同。这时用kubectl get nodes命令看不到内容,如果要在k8s上部署服务必须要添加计算节点。计算节点的收费请参考aws的ec2计费标准。添加计算节点我们会遇到一个问题,到底添加什么配置的主机更好呢?要解决这个问题,我们需要先整理一下目前的系统模块数量,以一个常规的微服务举例:
1、基础组件:etcd(三节点)、kafka(三节点)、zookeeper(三节点)、eureka(两节点)、mongodb(三节点)。mysql可以直接购买rds服务,因为pod部署也省不下多少钱直接买服务可能更好一些。
2、java模块:20个程序。spring boot框架开发,使用java -jar启动。
3、前端页面:3个程序。nodejs开发,使用nginx运行前端页面。
请根据自己业务情况计算,如果有一个已经存在的环境可以用这个环境作为参考。假如根据实际情况etcd预算1G/节点,kafka预算2G/节点,zk预算1G/节点,eureka预算1G/节点,mongodb预算4G/节点。基础组件内存27G、java模块2G/节点,整个环境启动时可以1节点。前端页面1G/节点,启动时1节点运行。整个环境运行内存预算43G+27G=70G,为保证足够冗余需要三节点,因为zk、kafka是三个节点,如果三节点以下虚拟机故障后可能会直接导致zk、kafka、etcd这些组件直接不可用。部署时需要用podAntiAffinity让相同pod只在相同虚拟机上运行一个pod实例,后面具体会讲到。按照这个规则这里最小节点运行内存是23g,这时创建节点组时选虚拟机的类型就找24g左右的,看那个更接近就用那个。

配置条件:

添加身份供应商:

第 3 步:创建 IAM OpenID Connect (IAM OIDC) 提供商
为集群创建 IAM OpenID Connect (OIDC) 提供商,以便工作负载使用的 Kubernetes 服务账户可以访问AWS资源的费用。对于集群,您只需要完成一次该步骤。
1、选择配置选项卡。
2、在详细信息部分中,复制OpenID Connect 提供程序 URL。
3、通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/。
4、在导航面板中,选择身份提供商。
5、选择添加提供程序。
6、适用于Provider type (提中,选择OpenID Connect。
7、适用于提供商 URL,从步骤 2 中粘贴集群的 OIDC 提供商 URL,然后选择获取指纹。
8、适用于受众,输入sts.amazonaws.com,然后选择添加提供程序。

这个url链接可以在集群里面查看,需要登录到eks平台选择集群->配置
亚马逊k8s开局系列-添加计算节点_k8s
添加vpc-cni授权:
将以下内容复制到名为的文件中cni-role-trust-policy.json。Replace<111122223333>(包括<>),并将其替换为您的账户 ID<XXXXXXXXXX45D83924220DC4815XXXXX>替换为最后一个/的OpenID Connect 提供程序 URL。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<111122223333>:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.us-west-2.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:aws-node"
        }
      }
    }
  ]
}

需要替换的地方:<111122223333>(包括<>) 这个在上面截图页面旁边集群 IAM 角色 ARN中能得到,这个就是亚马逊的账号id。us-west-2这个区域需要替换成eks所在区域,<XXXXXXXXXX45D83924220DC4815XXXXX> 这是前面url中/id/后面的内容。上面内容有两个地方需要替换,不要漏了。这里是否正确决定了计算节点是否能正常加入集群。
为 Amazon VPC CNI 插件创建 IAM 角色:

aws iam create-role \
  --role-name myAmazonEKSCNIRole \
  --assume-role-policy-document file://"cni-role-trust-policy.json"

将所需的 Amazon EKS 托管的 IAM 策略附加到角色:

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
  --role-name myAmazonEKSCNIRole

将 VPC CNI 插件使用的 Kubernetes 服务账户与 IAM 角色相关联:

aws eks update-addon \
  --cluster-name my-cluster \
  --addon-name vpc-cni \
  --service-account-role-arn arn:aws:iam::<111122223333>:role/myAmazonEKSCNIRole 

<111122223333>这个内容替换成自己的id内容。

创建节点 IAM 角色并向其附加所需的 Amazon EKS IAM 托管策略:

将以下内容复制到名为的文件中node-role-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
创建节点 IAM 角色。
aws iam create-role \
  --role-name myAmazonEKSNodeRole \
  --assume-role-policy-document file://"node-role-trust-policy.json"
将所需的 Amazon EKS 托管 IAM 策略附加到角色。

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
  --role-name myAmazonEKSNodeRole
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
  --role-name myAmazonEKSNodeRole

添加节点组:

这里会进行截图,照着操作应该就能创建成功。
亚马逊k8s开局系列-添加计算节点_eks_02
亚马逊k8s开局系列-添加计算节点_k8s_03
亚马逊k8s开局系列-添加计算节点_kubernetes_04
亚马逊k8s开局系列-添加计算节点_docker_05
推荐使用private子网,也就是不会自动分配公网地址的子网来创建node。如果之前是手动创建修改子网数量,其实public的子网可以分小一些。不过一般情况下是够用了,如果是大公司任务和pod特别多,还是要对每个子网进行适当的调整。因为aws的eks集群为pod分配的ip地址也是从这个子网里面获取的地址,所以你会发现pod的ip地址和node节点的地址在一个网段中。子网选择好以后,还需要选择用于访问node节点的密钥,点击下一个,再点击创建等待10多分钟就正常了。可以使用kubectl get nodes命令进行查看。

下一节部署aws-ingress