用KOps在AWS上部署和管理Kubernetes

原创
2018/06/02 03:36
阅读数 5.7K

Kubernetes作为容器编排的领导者地位已经不容置疑,可是Kubernetes还是面临这一些问题,一个是学习曲线非常陡峭,从容器到K8s你仍然要学习很多东西,另一个是部署,要在部署一套K8s并不容易,你有一些选择:

  • minikube minikube在你的本机的VM中安装一个单节点的K8s集群,但是这个只能用于本地测试和学习,不能用于真正的生产和大规模使用。
  • 裸机 bare metal 可以自己在裸机(或者虚机)上安装,但是要自己管理物理资源,配置网络和驱动,很麻烦。如果想挑战自己的话可以去参考官方文档 
  • 云服务 (cloud hosted solution),各大云厂商都推出了自己的K8s的云方案。云服务优势明显,但通常云服务的master是由云厂商控制,用户自己对集群的控制比较少,而且,云服务使得用户把自己的业务绑定在某个云厂商。例如:
  • 最后,我们希望使用云,但是又不想受到云厂商的限制,这个时候我们可以使用例如以下个工具在云上部署自己的K8s。例如:

我们今天就看看如何使用kops在AWS上部署一个K8s的cluster。

  • 假定所有操作在Linux客户端中完成,Mac或者其它客户端自行搜索。
  • 假定你有一个拥有对应权限的AWS account。

安装客户端

安装kubectl,kubectl是K8s的命令行客户端,Kops会使用该客户端进行k8s的配置。

curl -LO 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/kubectl

安装kops

curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops

 

配置AWS资源

首先要安装AWS cli

实现我们需要一个AWS用户用于运行Kops,该用户需要具有以下的权限:

AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess

用CLI创建对应的用户组,用户和access key:

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
aws iam create-access-key --user-name kops

记录下最后一步创建的用户SecretAccessKey 和 AccessKeyID,并在客户端中配置,导出到环境变量

# configure the aws client to use your new IAM user
aws configure           # Use your new access and secret key here
aws iam list-users      # you should see a list of all your IAM users here

# Because "aws configure" doesn't export these vars for kops to use, we export them now
export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

用户配置好了可以配置DNS,这个是可选项,我们先略过。

Kops把K8s集群的配置存储在AWS的S3中,每一个集群的配置对应于一个S3文件,所有我们创建一个S3的bucket用于存储集群的配置。

export BUCKET=<bucket-name>
aws s3api create-bucket \
    --bucket $BUCKET \
    --region us-west-2 \
    --create-bucket-configuration  LocationConstraint=us-west-2
aws s3api put-bucket-versioning --bucket $BUCKET  --versioning-configuration Status=Enabled

好了,准备完毕,我们可以开始创建K8s集群了。

创建集群

首先, 如果你的客户端没有ssh key,创建一个

ssh-keygen -t rsa -C "your_email@example.com"

配置环境变量,定义集群的名字和配置的url

export NAME= <cluster-name>.k8s.local
export KOPS_STATE_STORE=s3://$BUCKET

创建集群之前,查看一下有哪些可用的AZ

aws ec2 describe-availability-zones --region us-west-2

我当前在使用 us-west-2的region可用的az是这三个

{
    "AvailabilityZones": [
        {
            "State": "available",
            "Messages": [],
            "RegionName": "us-west-2",
            "ZoneName": "us-west-2a"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "us-west-2",
            "ZoneName": "us-west-2b"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "us-west-2",
            "ZoneName": "us-west-2c"
        }
    ]
}

那么我们就选则在us-west-2a中创建

kops create cluster \
    --zones us-west-2a \
    ${NAME}

注意这一步只是生成了集群的配置文件,并存储在S3中。

可以使用kops命令,修改配置:

kops edit cluster ${NAME}

如果配置没有问题,就可以部署了:

kops update cluster ${NAME} --yes

缺省的情况下,kops会创建所有对应的AWS资源,包含VPC,子网,EC2,Auto Scaling Group,ELB,安全组等等。

如果需要安装在特定的子网,在创建集群时可以指定子网的id。另外,也支持跨AZ的HA配置。

集群安装好之后,需要几分钟时间启动,我们可以用kubectl来查看一下状态(Kops会自动把cluster的配置写到~/.kube/config 文件中作为缺省配置):

kubectl cluster-info

建议安装kube-dashboard,可以用UI来管理集群,Linux终端狂人自行略过。

在集群不需要的时候,可以用kops删除集群:

kops delete cluster --name ${NAME}

 

扩展和暂停集群

在云上的K8s集群可以很方便的扩展,如果你的集群的计算资源都用的差不多了,你希望扩展你的集群的时候,有两种办法。

一是直接修改AWS的auto scaling group。KOps会在AWS上创建两个auto scaling group,一个用于Node,另一用于Master,通常我们只要修改Node所在的Auto Scaling Group的number就好了。

Kops的缺省设置是2,你可以把对应的数值设置成自己需要的数字。

另一个就是通过Kops来修改

kops edit ig nodes

把maxSize和minSize都设置成需要的值,然后更新

kops update cluster --yes
kops rolling-update cluster

使用rolling-update可以保证在更新的时候业务不会中断。

另外,有人可能会问,我希望不用的时候能把集群暂停,这样就不会使用很多的AWS系统资源了,这要怎么办。因为Auto Scaling Group的存在,如果直接stop对应的EC2实例,Auto Scaling Group会创建新的实例的取代,所以这个方法是不管用的。其实办法很简单,只要把对应的Auto Scaling Group的数值设置为0就好了。

同样可以在AWS中直接修改Master和Node所在的Auto Scaling Group,或者在Kops中修改。

注意在Kops中修改,需要调用如下的命令来获得Master所在group的名字。

$ kops get ig
Using cluster from kubectl context: staging.cluster-name.com

NAME			ROLE	MACHINETYPE	MIN	MAX	SUBNETS
master-us-west-2a	Master	m3.medium	0	0	us-west-2a
nodes			Node	t2.medium	0	0	us-west-2a

 

Kubernetes还在不断的发展中,我相信会有越来越多的好的工具来让K8s的安装变得更简单。在github的这个项目里列出了更多的选择供大家参考。

 

参考

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部