使用 kops 在 AWS 部署 Kubernetes 集群

  kops 是官方推荐的工具,用来在 AWS 生产环境中,快速地部署 Kubernetes 集群。

环境准备

  在 1.6.2 版本之前,通过 kops 部署 K8s 集群,需要使用 AWS 的 Route53 来提供 DNS 服务的功能。但从 1.6.2 版本开始,kops 支持部署基于 gossip 的集群,不再依赖 Route53,这让部署操作变得更加简单。
  在部署集群之前,需要安装 kubectl、kops 和 awscli 这些工具,下面是安装步骤:

1
2
3
4
5
6
7
$ curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl
$ sudo mv kubectl /usr/local/bin/
$ wget https://github.com/kubernetes/kops/releases/download/1.8.0/kops-linux-amd64
$ chmod +x kops-linux-amd64
$ sudo mv kops-linux-amd64 /usr/local/bin/kops
$ sudo apt-get install awscli
$ sudo pip install awscli

  配置好 AWS 账号:

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: <your-accesskeyID>
AWS Secret Access Key [None]: <your-secretAccessKey>
Default region name [None]: ap-northeast-1
Default output format [None]: json

  为了使用 kops 部署集群,还需要为 kops 创建一个 IAM 用户kops,并分配相应的权限:

1
2
3
4
5
6
7
8
$ aws iam create-group --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops
$ aws iam attach-group-policy --policy-arn arn:aws: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

  为kops用户创建密钥:

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

  上面的命令会返回kops用户的AccessKeyIDSecretAccessKey。接着我们就可以更新awscli的配置,让它使用新创建的kops用户的密钥:

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: <accesskeyID-of-kops-user>
AWS Secret Access Key [None]: <secretAccessKey-of-kops-user>
Default region name [None]: ap-northeast-1
Default output format [None]: json

  同时还需要将kops用户的密钥导出到命令行的环境变量:

1
2
3
$ export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
$ export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
$ export AWS_REGION=$(aws configure get region)

  最后是生成 SSH 密钥:

1
$ ssh-keygen

配置 S3

  需要注意,为了让 kops 创建基于 gossip 的集群,集群的命名需要使用.k8s.local作为后缀,例如,这里我们将集群命名为cluster.k8s.local

1
$ export NAME=cluster.k8s.local

  接着创建一个 S3 bucket,用户存储集群的数据,例如,这里我们将这个 bucket 命名为cluster.k8s.local-state.ym

1
2
$ aws s3api create-bucket --bucket ${NAME}-state.ym --create-bucket-configuration LocationConstraint=$AWS_REGION
$ export KOPS_STATE_STORE=s3://cluster.k8s.local-state.ym

创建集群

  下面的命令会创建集群的配置文件,并不会真正地创建集群:

1
2
3
4
5
6
$ kops create cluster \
--name=${NAME} \
--zones=ap-northeast-1b \
--master-size="t2.micro" \
--node-size="t2.micro" \
--ssh-public-key="~/.ssh/id_rsa.pub"

  在创建集群之前,可以检查集群的配置文件是否正确:

1
$ kops edit cluster ${NAME}

  如果确认没问题,就可以使用下面的命令创建集群:

1
$ kops update cluster ${NAME} --yes

  创建集群之后,需要一段时间等待集群的初始化,等待集群起来之后,可以验证集群的状况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ kops validate cluster
Using cluster from kubectl context: cluster.k8s.local
Validating cluster cluster.k8s.local
INSTANCE GROUPS
NAME ROLE MACHINETYPE MIN MAX SUBNETS
master-ap-northeast-1b Master t2.micro 1 1 ap-northeast-1b
nodes Node t2.micro 2 2 ap-northeast-1b
NODE STATUS
NAME ROLE READY
ip-172-20-35-54.ap-northeast-1.compute.internal master True
ip-172-20-41-246.ap-northeast-1.compute.internal node True
ip-172-20-58-154.ap-northeast-1.compute.internal node True
Your cluster cluster.k8s.local is ready

  前面已经安装好了kubectl工具,这里也可以使用kubectl检查集群状况:

1
2
3
4
5
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-20-35-54.ap-northeast-1.compute.internal Ready master 1h v1.8.4
ip-172-20-41-246.ap-northeast-1.compute.internal Ready node 1h v1.8.4
ip-172-20-58-154.ap-northeast-1.compute.internal Ready node 1h v1.8.4

销毁集群

  在销毁集群之前,需要先确认一下 kops 会删除哪些资源:

1
$ kops delete cluster --name ${NAME}

  如果确认没问题,就可以真正删除集群:

1
$ kops delete cluster --name ${NAME} --yes

参考资料