跳至内容

如何在 AWS 中国区域使用 kOps

入门

kOps 过去只支持 Google Cloud DNS 和 Amazon Route53 来配置 Kubernetes 集群。但从 1.6.2 开始添加了 gossip,这使得无需这些 DNS 提供商之一就能配置集群。由于 gossip,它在 AWS 中国区域正式支持配置一个功能齐全的 Kubernetes 集群 目前还没有 Route53,从 1.7 开始。应该支持 cn-north-1cn-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。有两种方法可以做到这一点。

首先,在可以快速稳定地访问互联网的私有子网中启动一个实例。

因为在私有子网中启动了实例,所以我们需要确保可以通过 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% 的机会导致集群崩溃。

离线模式

有关将图像和文件资产复制到本地存储库的信息,请参阅 使用本地资产存储库