在现有 VPC 中运行 kOps
在共享 VPC 中运行 ¶
在启动到共享 VPC 时,kOps 将重用 VPC 和 Internet Gateway。如果您没有使用 Internet Gateway 或 NAT Gateway,您可以告诉 kOps 忽略出站。默认情况下,kOps 会为每个区域创建一个新的子网和一个新的路由表,但您可以使用共享子网(参见下面)。
- 使用
kops create cluster
以及--vpc
参数来指定您的现有 VPC。
export KOPS_STATE_STORE=s3://<somes3bucket>
export CLUSTER_NAME=<sharedvpc.mydomain.com>
export VPC_ID=vpc-12345678 # replace with your VPC id
export NETWORK_CIDR=10.100.0.0/16 # replace with the cidr for the VPC ${VPC_ID}
kops create cluster --zones=us-east-1b --name=${CLUSTER_NAME} --vpc=${VPC_ID}
- 然后,
kops edit cluster ${CLUSTER_NAME}
将显示类似于以下内容的内容
metadata:
name: ${CLUSTER_NAME}
spec:
cloudProvider: aws
networkCIDR: ${NETWORK_CIDR}
networkID: ${VPC_ID}
nonMasqueradeCIDR: 100.64.0.0/10
subnets:
- cidr: 172.20.32.0/19
name: us-east-1b
type: Public
zone: us-east-1b
验证networkCIDR
和networkID
是否与您的 VPC CIDR 和 ID 相匹配。您可能需要在每个区域上设置 CIDR,因为 VPC 中的子网不能重叠。
- 然后,您可以在预览模式(不使用
--yes
)下运行kops update cluster
。您不需要任何参数,因为它们都在集群规范中。
kops update cluster ${CLUSTER_NAME}
查看这些更改,以确保它们是正确的——Kubernetes 设置可能不是您在共享 VPC 上想要的(在这种情况下,请打开一个问题!)。
还要注意,Kubernetes VPC(目前)要求EnableDNSHostnames=true
。kOps 将检测到所需的更改,但会拒绝自动进行更改,因为它是一个共享 VPC。请查看影响并手动更改 VPC。
- 一旦您满意,就可以使用以下命令创建集群
kops update cluster ${CLUSTER_NAME} --yes
这将在您的 AWS VPC 资源中添加一个额外的标签。如果您删除了 kOps 集群,这个标签将被自动删除。
"kubernetes.io/cluster/<cluster-name>" = "shared"
具有多个 CIDR 的 VPC ¶
AWS 允许您向 VPC 添加更多 CIDR。参数additionalNetworkCIDRs
允许您指定添加到 VPC 的任何其他 CIDR。
metadata:
name: ${CLUSTER_NAME}
spec:
cloudProvider: aws
networkCIDR: 10.1.0.0/16
additionalNetworkCIDRs:
- 10.2.0.0/16
networkID: vpc-00aa5577
subnets:
- cidr: 10.1.0.0/19
name: us-east-1b
type: Public
zone: us-east-1b
id: subnet-1234567
- cidr: 10.2.0.0/19
name: us-east-1b
type: Public
zone: us-east-1b
id: subnet-1234568
在现有 VPC 中创建集群的高级选项 ¶
共享子网 ¶
kops
可以在公共和私有网络拓扑结构中共享子网创建集群。
- 使用
kops create cluster
以及--subnets
参数来指定您的现有子网
export KOPS_STATE_STORE=s3://<somes3bucket>
export CLUSTER_NAME=<sharedvpc.mydomain.com>
export VPC_ID=vpc-12345678 # replace with your VPC id
export NETWORK_CIDR=10.100.0.0/16 # replace with the cidr for the VPC ${VPC_ID}
export SUBNET_ID=subnet-12345678 # replace with your subnet id
export SUBNET_CIDR=10.100.0.0/24 # replace with your subnet CIDR
export SUBNET_IDS=$SUBNET_IDS # replace with your comma separated subnet ids
kops create cluster --zones=us-east-1b --name=${CLUSTER_NAME} --subnets=${SUBNET_IDS}
指定--subnets
时,--vpc
是可选的。当使用私有拓扑和共享子网创建集群时,实用子网应使用--utility-subnets
以类似的方式指定。
- 然后,
kops edit cluster ${CLUSTER_NAME}
将显示类似于以下内容的内容
metadata:
name: ${CLUSTER_NAME}
spec:
cloudProvider: aws
networkCIDR: ${NETWORK_CIDR}
networkID: ${VPC_ID}
nonMasqueradeCIDR: 100.64.0.0/10
subnets:
- cidr: ${SUBNET_CIDR}
id: ${SUBNET_ID}
name: us-east-1b
type: Public
zone: us-east-1b
- 一旦您满意,就可以使用以下命令创建集群
kops update cluster ${CLUSTER_NAME} --yes
子网标签 ¶
默认情况下,kOps 将使用标准标签标记您现有的子网
公共/实用子网
"kubernetes.io/cluster/<cluster-name>" = "shared"
"kubernetes.io/role/elb" = "1"
"SubnetType" = "Utility"
私有子网
"kubernetes.io/cluster/<cluster-name>" = "shared"
"kubernetes.io/role/internal-elb" = "1"
"SubnetType" = "Private"
这些标签很重要,例如,如果缺少相应的elb
或internal-elb
标签,您的服务将无法创建公共或私有 Elastic Load Balancers (ELB)。
如果您希望在外部管理这些标签,则在创建集群时指定--disable-subnet-tags
。这将阻止 kOps 标记现有子网,并允许一些自定义控制,例如,为内部 ELB 分配独立的子网。
共享 NAT 出站 ¶
在 AWS 私有拓扑结构中,kOps 会为每个可用区创建一个 NAT Gateway (NGW)。如果您的共享 VPC 已经在kops
部署私有资源的子网中设置了 NGW,您可以指定其 ID,并让kops
/kubernetes
使用它。
如果您不想使用 NAT Gateway,但已经在 VPC 中设置了EC2 NAT 实例,您可以共享这些实例,您可以指定这些实例的 ID,并让kops
/kubernetes
使用它们。
创建基本集群规范后,编辑您的集群以指定 NGW
kops edit cluster ${CLUSTER_NAME}
spec:
subnets:
- cidr: 10.20.64.0/21
name: us-east-1a
egress: nat-987654321
type: Private
zone: us-east-1a
- cidr: 10.20.96.0/21
name: us-east-1b
egress: i-987654321
type: Private
zone: us-east-1a
- cidr: 10.20.32.0/21
name: utility-us-east-1a
type: Utility
zone: us-east-1a
请注意
- 您必须为所有子网或没有子网指定预先创建的子网。
- kOps 不会更改您现有的子网。它们必须正确设置,包括路由表等。公共或实用子网应具有公共 IP,并在其路由表中配置 Internet Gateway 作为其默认路由。私有子网不应具有公共 IP,并且通常会配置 NAT Gateway 作为其默认路由。
- 如果 kOps 没有创建子网,它根本不会创建路由表。
- 在上面的示例中,第一个子网使用的是共享 NAT Gateway,而第二个子网使用的是共享 NAT 实例。
外部管理的出站 ¶
如果您在 VPC 中使用的是不支持的出站配置,可以通过使用以下配置来告诉 kOps 忽略出站
spec:
subnets:
- cidr: 10.20.64.0/21
name: us-east-1a
egress: External
type: Private
zone: us-east-1a
- cidr: 10.20.96.0/21
name: us-east-1b
egress: External
type: Private
zone: us-east-1a
- cidr: 10.20.32.0/21
name: utility-us-east-1a
type: Utility
zone: us-east-1a
egress: External
这告诉 kOps 出站是由外部管理的。当使用虚拟私有网关(目前不支持)或使用其他配置处理出站路由时,这是首选方式。