如何在 AWS 中国区域使用 kOps ¶
入门 ¶
kOps 过去只支持 Google Cloud DNS 和 Amazon Route53 来配置 Kubernetes 集群。但从 1.6.2 开始添加了 gossip
,这使得无需这些 DNS 提供商之一就能配置集群。由于 gossip
,它在 AWS 中国区域正式支持配置一个功能齐全的 Kubernetes 集群 目前还没有 Route53,从 1.7 开始。应该支持 cn-north-1
和 cn-northwest-1
,但只测试了 cn-north-1
。
以下配置集群的大多数流程都与 在 AWS 中使用 kOps 的指南 相同。将突出显示不同之处,并省略类似部分。
注意:以下流程仅在 KOPS 1.10.0、1.10.1 和 KUBERNETES 1.9.11、1.10.12 中测试。
安装 kOps ¶
安装 kubectl ¶
设置您的环境 ¶
AWS ¶
在使用 aws configure
时,请记住将 default region name
设置为正确的区域,例如 cn-north-1
。
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:
并正确导出。
export AWS_REGION=$(aws configure get region)
配置 DNS ¶
如注释中所指出的,可以通过使集群名称以 .k8s.local
结尾来轻松创建基于八卦的集群。我们将在下面采用此技巧。可以安全地跳过本节的其余部分。
测试您的 DNS 设置 ¶
由于 gossip
,也可以安全地跳过本节。
集群状态存储 ¶
由于我们正在 AWS 中国区域中配置集群,因此需要在 AWS 中国区域中创建一个专用的 S3 存储桶。
aws s3api create-bucket --bucket prefix-example-com-state-store --create-bucket-configuration LocationConstraint=$AWS_REGION
创建您的第一个集群 ¶
确保您拥有可以正常访问互联网的 VPC ¶
首先,我们必须解决连接到中国以外互联网的缓慢和不稳定问题,否则以下流程将无法正常工作。一种方法是构建一个 NAT 实例,该实例可以通过一些可靠的连接路由流量。此处不会详细讨论。
准备 kOps AMI ¶
我们必须构建自己的 AMI,因为 AWS 中国区域没有官方的 kOps AMI。有两种方法可以做到这一点。
ImageBuilder **推荐** ¶
首先,在可以快速稳定地访问互联网的私有子网中启动一个实例。
因为在私有子网中启动了实例,所以我们需要确保可以通过 VPN 或堡垒机通过私有 IP 连接到它。
SUBNET_ID=<subnet id> # a private subnet
SECURITY_GROUP_ID=<security group id>
KEY_NAME=<key pair name on aws>
AMI_ID=$(aws ec2 describe-images --filters Name=name,Values=debian-jessie-amd64-hvm-2016-02-20-ebs --query 'Images[*].ImageId' --output text)
INSTANCE_ID=$(aws ec2 run-instances --image-id $AMI_ID --instance-type m3.medium --key-name $KEY_NAME --security-group-ids $SECURITY_GROUP_ID --subnet-id $SUBNET_ID --no-associate-public-ip-address --query 'Instances[*].InstanceId' --output text)
aws ec2 create-tags --resources ${INSTANCE_ID} --tags Key=k8s.io/role/imagebuilder,Value=1
现在,按照 ImageBuilder 的文档,在 kube-deploy
中构建镜像。
go get k8s.io/kube-deploy/imagebuilder
cd ${GOPATH}/src/k8s.io/kube-deploy/imagebuilder
sed -i '' "s|publicIP := aws.StringValue(instance.PublicIpAddress)|publicIP := aws.StringValue(instance.PrivateIpAddress)|" pkg/imagebuilder/aws.go
make
# cloud-init is failing due to urllib3 dependency. https://github.com/aws/aws-cli/issues/3678
sed -i '' "s/'awscli'/'awscli==1.16.38'/g" templates/1.9-jessie.yml
# If the keypair specified is not `$HOME/.ssh/id_rsa`, the config yaml file need to be modified to add the full path to the private key.
echo 'SSHPrivateKey: "/absolute/path/to/the/private/key"' >> aws-1.9-jessie.yaml
${GOPATH}/bin/imagebuilder --config aws-1.9-jessie.yaml --v=8 --publish=false --replicate=false --up=false --down=false
从其他区域复制 AMI ¶
按照 评论 从其他区域复制 kOps 镜像,例如 ap-southeast-1
。
获取 AMI ID ¶
无论如何构建 AMI,最终都会得到一个 AMI,例如 k8s-1.9-debian-jessie-amd64-hvm-ebs-2018-07-18
。
准备本地环境 ¶
设置一些环境变量。
export NAME=example.k8s.local
export KOPS_STATE_STORE=s3://prefix-example-com-state-store
创建集群配置 ¶
我们需要记下哪些可用区对我们可用。AWS 中国(北京)区域只有两个可用区。它将 遇到与其他区域(少于三个 AZ)相同的问题,即在两个 AZ 中没有真正的 HA 支持。您可以 添加更多主节点 来提高一个 AZ 中的可靠性。
aws ec2 describe-availability-zones
下面是一个 create cluster
命令,该命令将在现有 VPC 中创建一个完整的内部集群。以下命令将生成集群配置,但不会开始构建。确保在创建集群之前生成了 SSH 密钥对。
VPC_ID=<vpc id>
VPC_NETWORK_CIDR=<vpc network cidr> # e.g. 172.30.0.0/16
AMI=<owner id/ami name> # e.g. 123456890/k8s-1.9-debian-jessie-amd64-hvm-ebs-2018-07-18
kops create cluster \
--zones ${AWS_REGION}a \
--vpc ${VPC_ID} \
--network-cidr ${VPC_NETWORK_CIDR} \
--image ${AMI} \
--associate-public-ip=false \
--api-loadbalancer-type internal \
--topology private \
--networking calico \
${NAME}
自定义集群配置 ¶
现在我们有了集群配置,我们可以通过编辑描述来调整子网配置,以重用 共享子网。
kops edit cluster $NAME
然后更改相应的子网以指定 id
并删除 cidr
,例如
spec:
subnets:
- id: subnet-12345678
name: cn-north-1a
type: Private
zone: cn-north-1a
- id: subnet-87654321
name: utility-cn-north-1a
type: Utility
zone: cn-north-1a
我们可以在这里采用的另一个调整是添加一个 docker
部分,以将镜像更改为 中国官方注册表镜像。这将提高从 Docker Hub 拉取镜像的稳定性和下载速度。
spec:
docker:
registryMirrors:
- https://registry.docker-cn.com
请注意,此镜像可能不适合某些情况。只要它与 Docker API 兼容,它就可以被任何其他注册表镜像替换。
构建集群 ¶
使用集群 ¶
删除集群 ¶
下一步是什么? ¶
添加更多主节点 ¶
在一个 AZ 中 ¶
为此,我们可以向 kops create cluster
添加更多参数。
--master-zones ${AWS_REGION}a --master-count 3 \
--zones ${AWS_REGION}a --node-count 2 \
在两个 AZ 中 ¶
--master-zones ${AWS_REGION}a,${AWS_REGION}b --master-count 3 \
--zones ${AWS_REGION}a,${AWS_REGION}b --node-count 2 \
请注意,当其中一个 AZ 出现故障时,这仍然有 50% 的机会导致集群崩溃。
离线模式 ¶
有关将图像和文件资产复制到本地存储库的信息,请参阅 使用本地资产存储库。