亚马逊AWS官方博客

如何在 AWS 中国区上基于 EC2搭建 Kubernetes

一、  AWS基础环境搭建

1.1 为k8s集群创建一个VPC

参考:

https://docs.amazonaws.cn/vpc/latest/userguide/getting-started-ipv4.html

1.1.1 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/
1.1.2 点击Create VPC按钮

 

1.1.3 输入IPv4 CIDR block,再点击Create

1.2 创建一个Internet Gateway,并绑定刚创建的VPC

参考:

https://docs.amazonaws.cn/vpc/latest/userguide/VPC_Internet_Gateway.html

1.2.1 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

1.2.2 在导航窗格中,选择 Internet Gateways (Internet 网关),然后选择 Create internet gateway (创建 Internet 网关)

 

1.2.3 选择刚刚创建的 Internet 网关,然后选择 Actions, Attach to VPC (操作,附加到 VPC)。

1.2.4 从列表中选择 VPC,然后选择 Attach (附加)

1.3 在本机上安装AWS CLI

参考:

https://docs.thinkwithwp.com/zh_cn/cli/latest/userguide/cli-chap-install.html

1.4 通过AWS CLI创建AWS IAM User

在AWS CLI中执行以下命令

aws iam create-group --group-name kops

 

aws iam attach-group-policy --policy-arn arn:aws-cn:iam::aws:policy/AmazonEC2FullAccess --group-name kops

 

aws iam attach-group-policy --policy-arn arn:aws-cn:iam::aws:policy/AmazonRoute53FullAccess --group-name kops

 

aws iam attach-group-policy --policy-arn arn:aws-cn:iam::aws:policy/AmazonS3FullAccess --group-name kops

 

aws iam attach-group-policy --policy-arn arn:aws-cn:iam::aws:policy/IAMFullAccess --group-name kops

 

aws iam attach-group-policy --policy-arn arn:aws-cn:iam::aws:policy/AmazonVPCFullAccess --group-name kops

 

aws iam create-user --user-name kops

 

aws iam add-user-to-group --user-name kops --group-name kops

 

aws iam create-access-key --user-name kops

1.5 创建一个S3 Bucket

参考:

https://docs.thinkwithwp.com/zh_cn/AmazonS3/latest/gsg/CreatingABucket.html

1.5.1 登录 AWS 管理控制台并通过以下网址打开 Amazon S3 控制台:https://console.thinkwithwp.com/s3/

1.5.2 选择 Create bucket (创建存储桶)

 

1.5.3 在 Bucket name 字段中,为新存储桶键入一个符合 DNS 标准的唯一名称,对于 Region,选择作为要将存储桶放置到的区域,选择下一步

 

1.5.4 选择下一步

 

1.5.5 选择下一步

 

1.5.6 选择创建存储桶

1.6 生成一个SSH ID

执行ssh-keygen命令,生成SSH ID,默认为 ~/.ssh/id_rsa.pub

1.7 配置AWS CLI

创建kops用户的aksk,并记录保存,参考:

https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_access-keys.html

aws iam create-access-key –user-name kops

 

配置AWS CLI

aws configure

AWS Access Key ID:

AWS Secret Access Key:

Default region name:

Default output format:

二、下载kops-cn项目及相关工具

2.1 安装kops and kubectl(可以在Mac或EC2上)

2.1.1 安装kops

Linux:

curl -Lo kops curl -Lo kops https://github.com/kubernetes/kops/releases/download/1.14.0/kops-linux-amd64

chmod +x ./kops

sudo mv ./kops /usr/local/bin/

Mac:

curl -Lo kops curl -Lo kops https://github.com/kubernetes/kops/releases/download/1.14.0/kops-linux-amd6chmod +x ./kops

sudo mv ./kops /usr/local/bin/

验证:

kops version

2.1.2 安装kubectl

Linux:

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectl

 

MacOS:

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.17.0chmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectl

验证:

kubectl version

2.2 下载kops-cn项目到本地

curl  https://github.com/nwcdlabs/kops-cn/archive/master.zip -L -o kops-cn.zip

unzip kops-cn

cd kops-cn-master

三、创建k8s集群

3.1 编辑 Makefile文件

vi Makefile

您需要设置如下变量

Name Description values
TARGET_REGION 选择将集群部署在aws北京或宁夏区域 cn-north-1 or cn-northwest-1
AWS_PROFILE 选择制定其他不同的AWS_PROFILE default
KOPS_STATE_STORE 您需要提供一个S3桶给KOPS存放配置信息 s3://YOUR_S3_BUCKET_NANME
VPCID 选择将您的集群部署在哪个VPC中 vpc-xxxxxxxx
MASTER_COUNT master节点的机器数量 3 (建议不要修改)
MASTER_SIZE master节点的机器类型 例如m5.large
NODE_SIZE 工作节点的机器类型 例如c5.large
NODE_COUNT 工作节点的机器数量 例如3
SSH_PUBLIC_KEY 本地ssh公钥的存放路径 ~/.ssh/id_rsa.pub [default]
KUBERNETES_VERSION 指定kubernetes版本 1.14.6
KOPS_VERSION 指定kops版本 1.14.0
AMI 指定Master和Node的AMI AMI ID(注意AMI ID和Region有关)

3.2 创建集群文件

make create-cluster (有可能会因为网络原因而失败,多重试几次)

3.3 编辑集群文件

make edit-cluster

将 以下内容贴到spec 下并保存退出

assets:

containerRegistry: 937788672844.dkr.ecr.cn-north-1.amazonaws.com.cn

fileRepository: https://s3.cn-north-1.amazonaws.com.cn/kops-bjs/fileRepository/

docker:

logDriver: ""

registryMirrors:

- https://registry.docker-cn.com

 

 

如果要修改集群名,请不要修改后缀k8s.local

如果要自定义子网CIDR,可以修改subnets的CIDR,子网名称请不要修改

 

3.4 更新和创建集群

make update-cluster (有可能会因为网络原因而失败,多重试几次)

3.5 验证集群

make validate-cluster

或者

export KOPS_STATE_STORE=s3://YOUR_S3_BUCKET_NANMEexport AWS_REGION=cn-north-1 or cn-northwest-1kops validate cluster

 

四、删除集群

make delete-cluster

五、常见问题

5.1 完成kopscn的步骤后,kops validate cluster不能使用,提示需要KOPS_STATE_STORE参数

这是因为参数缺失,执行以下命令后就可以正常使用:

export KOPS_STATE_STORE=s3://YOUR_S3_BUCKET_NANMEexport AWS_REGION= cn-north-1 or cn-northwest-1

 

5.2 如何在其他的机器上查看和维护环境?

首先,按照上面文档的操作装步骤,在机器上完成配置AK/SK,配置SSH ID,安装awscli、kubectl、kops(不需要下载kops-cn)。首先执行以下命令配置参数:

export KOPS_STATE_STORE=s3://YOUR_S3_BUCKET_NANMEexport AWS_REGION= cn-north-1 or cn-northwest-1kops export kubecfg nlp-test.k8s.local

然后可以正常使用kops管理集群

 

5.3 配置文件如何同步?

集群的配置文件存放在之前指定的S3目录下,可以使用kops相关命令进行修改。

修改cluster信息(k8s.local这个后缀不难修改):

kops edit cluster --name=cluster.zhy.k8s.local

修改master实例组:

kops edit ig --name=cluster.zhy.k8s.local master-cn-northwest-1a

修改node实例组:

kops edit ig --name=cluster.zhy.k8s.local nodes

 

5.4 如何修改AutoScaling参数?

执行以下命令修改实例组信息:

kops edit ig --name=cluster.zhy.k8s.local nodes

修改实例组的实例类型和容量,比如:

machineType: c5.large

maxSize: 5

minSize: 1

保存修改后执行以下命令:

kops update cluster cluster.zhy.k8s.local --yes

 

5.5 如何增加新的AutoScaling组?

可以执行以下命令创建新的实例组(可能会失败,多试几次):

kops create ig --name=cluster.zhy.k8s.local nodes2 --role node

填写实例组配置,比如:

apiVersion: kops/v1alpha2

kind: InstanceGroup

metadata:

creationTimestamp: 2019-12-16T15:01:45Z

generation: 1

labels:

kops.k8s.io/cluster: cluster.k8s.local

name: nodes2

spec:

image: ami-0d8487330873f710c

machineType: m5.large

maxSize: 5

minSize: 1

nodeLabels:

kops.k8s.io/instancegroup: nodes

role: Node

subnets:

- cn-northwest-1a

- cn-northwest-1b

- cn-northwest-1c

保存退出后,执行以下命令更新集群:

kops update cluster --name=cluster.zhy.k8s.local --yes

 

5.6 如何卸载指定的node节点?

首先,可以通过kubectl列出所有节点:

kubectl get nodes

然后,通过drain命令卸载指定的节点:

kubectl drain <node name>

 

5.7 如何在现有的子网中搭建k8s?

首先编辑 Makefile文件

vi Makefile

再在creat-cluster中添加如下信息:

--ssh-public-key=$(SSH_PUBLIC_KEY) \

--zones=zone name, zone name, zone name \

--subnets=子网ID, 子网ID,子网ID

5.8 如何SSH Master节点和Node节点?

默认Debian AMI ssh方式为 ssh -i ~/.ssh/id_rsa admin@IP

六、参考

https://github.com/nwcdlabs/kops-cn/blob/master/README.md

 

本篇作者

胡正光

AWS解决方案架构师,15年IT行业经验,目前负责基于AWS云计算方案架构的咨询和设计