文章目录
基于 kops搭建,搭建前请确定你的I AM账号具有Admin的权限,否则可能在搭建过程中出现权限不足无法创建的问题。
1. 准备
1.1 网络
创建弹性IP用于K8S网络统一的出口
创建VPC
公网用于堡垒机、VPN服务器,私有网络用于部署K8S服务集群
设置一些必要的参数,此处需要注意设置刚才分配得到的NAT IP。
创建完成之后注意要给VPC上打上标签让 Kubernetes能够识别和管理到这些VPC
VPC需要打上的标有
键 | 值 |
---|---|
KubernetesCluster | 值是集群名称(cluster.unisign.k8s.local ) |
kubernetes.io/cluster/your_cluster_name | 注意键中的your_cluster_name 要替换为你定义的集群名称, 值是资源拥有的类型(owner 、shared ),这里设置为共享类型shared |
更多配置请参考 集群 VPC 注意事项
然后记录下该VPC的ID
- vpc-0761a396fcb3a9ddd
接下来到 子网页面,创建子网:vpc选择刚才创建的VPC、选择一个子网地址段,注意选择一个可选区。
用相同的方式创建3个这样的子网,注意:每个子网必须要在不同的可用区中(保持高可用)
子网创建完成之后同样的需要为子网都打上标签这样的才能让Kubernetes识别和管理到。除了上面提及的那两个标签之外还需增加两种类型的标签,这两种类型的标签针对于公有子网和私有子网设置。
键 | 值 |
---|---|
KubernetesCluster | 值是集群名称(cluster.unisign.k8s.local ) |
kubernetes.io/cluster/your_cluster_name | 注意键中的your_cluster_name 要替换为你定义的集群名称, 值是资源拥有的类型(owner 、shared ),这里设置为共享类型shared |
kubernetes.io/role/internal-elb | 值为1 ,表明该子网为私有子网,他将会被专用于私有子网的负载均衡器所注册和使用。 |
kubernetes.io/role/elb | 值为1 ,表明该子网为公有子网,他将会被专用于公有子网的负载均衡器所注册和使用。(列如Ingress网络所需要的负载均衡器) |
更多配置请参考 集群 VPC 注意事项
因此我们为刚才创建的公有子网增加上KubernetesCluster
、kubernetes.io/cluster/cluster.unisign.k8s.local
和kubernetes.io/role/elb
的标签。
为三个私有子网都增加上KubernetesCluster
、kubernetes.io/cluster/cluster.unisign.k8s.local
和kubernetes.io/role/internal-elb
的标签。
创建完成后记录下这三个私有子网的ID,在Kops配置中将使用到
- subnet-0efb59b551dd47dc2
- subnet-0a4fa7de20bf500ef
- subnet-0ba68ae43a6d71da0
1.2 存储桶
创建一个S3,这个存储桶用于放置K8s的配置信息。
保持默认设置直接创建就可以
创建完成后记录下该桶的名称(k8s-storage
)就可以。
1.3 密钥
创建一个用于登录aws cli的AK、SK
我的安全凭证
创建访问密钥
记录下AK和SK在使用KOPS时需要使用到
创建一个K8S集群登录使用的专用密钥对
到EC2页面 的网络与安全 下的 密钥对
输入密钥对名称,创建密钥对
创建完成后会自动下载密钥对,请妥善保管该pem文件,一会将会用到。
1.4 堡垒机
到EC2下创建一个实例 Amazon Linux 2 AMI (HVM), SSD Volume Type
注意配置一下,分配网络为刚才创建的VPC和公有子网,并且分配公有IP
创建完成之后使用登录到这台堡垒机上,接下来需要上传刚才得到的pem
密钥对文件。
将K8sSSH.pem
移动到/home/ec2-user/.ssh
目录下,然后生成公钥
chmod 600 ~/.ssh/K8sSSH.pem
ssh-keygen -f ~/.ssh/K8sSSH.pem -y > ~/.ssh/K8sSSH.pub
chmod 600 ~/.ssh/K8sSSH.pub
chmod 400 ~/.ssh/K8sSSH.pem
注意:在登录K8s集群中的节点时,还需要将
~/.ssh/K8sSSH.pem
权限改为 400,否则会引起权限错误而登录不了的问题。
配置AWS Cli,使用刚才得到的AK和SK,填入集群所在的区域(宁夏就是cn-northwest-1
)
aws configure
Default output format 保持默认,可设置为json或者 table
到这里准备的操作基本完成
2. Kops-cn
按照 Kops-cn README 步骤: 1、2、3 操作
2.1 步骤3 修改Makefile
KOPS_STATE_STORE
此处放置s3://
+存储桶的名称
。例如:s3://k8s-storage
TARGET_REGION
就是部署的区域宁夏就是cn-northwest-1
CUSTOM_CLUSTER_NAME
就是集群的名称,格式为cluster.名字.k8s.local
如果不按照这种格式设置会导致Route53 host not found
的错误哦
为了将K8s部署到刚才创建的私有网络中,需要调整一些配置,重新编辑Makefile
文件。
- 设置
TARGET_REGION
可用区 - 设置
KOPS_STATE_STORE
s3存储 - 设置
VPCID
VPC ID - 设置
SSH_PUBLIC_KEY
密钥,这个就是刚才生成~/.ssh/K8sSSH.pub
- 增加变量
SUBNET_IDS
用于记录私有子网的ID,这个变量就放刚才得到的三个子网的ID,用“,
”隔开。 - 增加变量
CUSTOM_CLUSTER_NAME
用于自定义集群名称。
修改.PHONY: create-cluster
,在指令的最后增加上下面几个参数
--utility-subnets=$(SUBNET_IDS) \
--api-loadbalancer-type=internal \
--subnets=$(SUBNET_IDS) \
--topology=private
最终的配置文件如下:
TARGET_REGION ?= cn-northwest-1
AWS_PROFILE ?= default
KOPS_STATE_STORE ?= s3://k8s-storage
VPCID ?= vpc-0761a396fcb3a9ddd
MASTER_COUNT ?= 3
MASTER_SIZE ?= m4.large
NODE_SIZE ?= c5.large
NODE_COUNT ?= 2
SSH_PUBLIC_KEY ?= ~/.ssh/K8sSSH.pub
KUBERNETES_VERSION ?= v1.13.10
KOPS_VERSION ?= 1.13.0
SUBNET_IDS ?= subnet-0efb59b551dd47dc2,subnet-0a4fa7de20bf500ef,subnet-0ba68ae43a6d71da0
CUSTOM_CLUSTER_NAME ?= cluster.unisign.k8s.local
# 省略...
.PHONY: create-cluster
create-cluster:
@KOPS_STATE_STORE=$(KOPS_STATE_STORE) \
AWS_PROFILE=$(AWS_PROFILE) \
AWS_REGION=$(AWS_REGION) \
AWS_DEFAULT_REGION=$(AWS_DEFAULT_REGION) \
kops create cluster \
--cloud=aws \
--name=$(CLUSTER_NAME) \
--image=$(AMI) \
--zones=$(ZONES) \
--master-count=$(MASTER_COUNT) \
--master-size=$(MASTER_SIZE) \
--node-count=$(NODE_COUNT) \
--node-size=$(NODE_SIZE) \
--vpc=$(VPCID) \
--kubernetes-version=$(KUBERNETES_VERSION_URI) \
--networking=amazon-vpc-routed-eni \
--ssh-public-key=$(SSH_PUBLIC_KEY) \
--utility-subnets=$(SUBNET_IDS) \
--api-loadbalancer-type=internal \
--subnets=$(SUBNET_IDS) \
--topology=private
继续按照Kops-cn README 步骤 4、5、6操作
等待集群配置创建完成
2.2 调整负载均衡器
注意: 使用kops启动的kubernetes的apiserver 是运行在 443端口上,而不是6443
由于中国区 80 和 433 端口的使用是需要备案的,所以此处我们需要调整负载均衡端口到非433,否则验证集群会失败
到EC2页面选择 负载均衡器,找到名字为api-cluster-unisign**
的负载均衡器
编辑负载均衡的端口
将 负载均衡器端口由443
改为8443
在描述中点击安全组的 组名称
选择 api-elb.cluster.**
然后在编辑入站规则
由 HTTPS改为 自定义TCP的8443
端口
接下来回到堡垒机上,编辑kubectl 的配置文件
vi ~/.kube/config
修改啊clusters.cluster.server
,在末尾加上:8443
验证集群有效性
make validate-cluster
可以看到集群已经正常运行。
3. 登录K8s集群中的节点
由于K8s集群部署到VPC中的私有网络,没有公网IP,所以我们只能通过在VPC中的公有子网中的服务器间接的连接到K8s集群服务器。
因此我们继续使用上面创建的堡垒机进行操作
从EC2控制台获取到某个K8s集群节点的实例私有子网IP,推荐选择Master节点
使用公钥SSH登录到节点上
ssh -i ~/.ssh/K8sSSH.pem admin@10.0.201.12
如果提示无权限那么请设置私钥使用权限
chmod 400 ~/.ssh/K8sSSH.pem
可以看到登录已经成功:
Kops-cn 所使用的镜像是基于debian的,登录的用户不是
ec2-user
而是admin
4. 调整集群中的节点数量
make edit-ig-nodes
Kops使用Autoscale组的方式来创建集群,所以说这里编辑的是工作节点的弹性伸缩设置。
如果只是调整基础数量基础节点的数量,那么调整 spec.minSize
就可以
此处我们将2调整为3,maxSize
大于等于minSize
,所以也调整maxSize
为3。
编辑好之后保存,然后更新集群
make update-cluster
从控制台上可以看到已经有一个实例在启动
过一会之后我们验证集群的有效
make validate-cluster
在初始化完成之后集群正常启动
更多的设置调整设置,比如弹性缩减时保留实例之类的请参考 instance_groups.md
n. F&Q
集群没有启动完成就验证
在修改了负载均衡器和安全组之后使用make validate-cluster
出现
unexpected error during validation: error listing nodes: Get https://internal-api-cluster-unisign-k8s-l-1befqc-1231872735.cn-northwest-1.elb.amazonaws.com.cn:8443/api/v1/nodes: dial tcp: lookup internal-api-cluster-unisign-k8s-l-1befqc-1231872735.cn-northwest-1.elb.amazonaws.com.cn on 10.0.0.2:53: no such host
make: *** [validate-cluster] Error 1
或者是
unexpected error during validation: error listing nodes: Get https://internal-api-cluster-unisign-k8s-l-1befqc-1231872735.cn-northwest-1.elb.amazonaws.com.cn:8443/api/v1/nodes: EOF
make: *** [validate-cluster] Error 1
的错误,这是因为控制节点(master)还没有完成启动,所以请耐心等候。
或者是
unexpected error during validation: error listing nodes: Get https://internal-api-cluster-unisign-k8s-l-1befqc-1231872735.cn-northwest-1.elb.amazonaws.com.cn:8443/api/v1/nodes: EOF
make: *** [validate-cluster] Error 1
的错误,这是因为控制节点(master)还没有完成启动,所以请耐心等候。
参考文档
[1]. nwcdlabs . github. https://github.com/nwcdlabs/kops-cn
[2]. kubernetes/kops . github . https://github.com/kubernetes/kops/blob/master/docs/instance_groups.md
[3]. aws . doc . https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/network_reqs.html