跳至内容

在现有 VPC 中运行 kOps

在共享 VPC 中运行

在启动到共享 VPC 时,kOps 将重用 VPC 和 Internet Gateway。如果您没有使用 Internet Gateway 或 NAT Gateway,您可以告诉 kOps 忽略出站。默认情况下,kOps 会为每个区域创建一个新的子网和一个新的路由表,但您可以使用共享子网(参见下面)。

  1. 使用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}
  1. 然后,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

验证networkCIDRnetworkID 是否与您的 VPC CIDR 和 ID 相匹配。您可能需要在每个区域上设置 CIDR,因为 VPC 中的子网不能重叠。

  1. 然后,您可以在预览模式(不使用--yes)下运行kops update cluster。您不需要任何参数,因为它们都在集群规范中。
kops update cluster ${CLUSTER_NAME}

查看这些更改,以确保它们是正确的——Kubernetes 设置可能不是您在共享 VPC 上想要的(在这种情况下,请打开一个问题!)。

还要注意,Kubernetes VPC(目前)要求EnableDNSHostnames=true。kOps 将检测到所需的更改,但会拒绝自动进行更改,因为它是一个共享 VPC。请查看影响并手动更改 VPC。

  1. 一旦您满意,就可以使用以下命令创建集群
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 可以在公共和私有网络拓扑结构中共享子网创建集群。

  1. 使用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 以类似的方式指定。

  1. 然后,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
  1. 一旦您满意,就可以使用以下命令创建集群
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"

这些标签很重要,例如,如果缺少相应的elbinternal-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 出站是由外部管理的。当使用虚拟私有网关(目前不支持)或使用其他配置处理出站路由时,这是首选方式。

代理 VPC 出站

参见HTTP 正向代理支持