跳至内容

在 OpenStack 上使用 kOps 入门

kOps 上的 OpenStack 支持目前处于 **beta** 阶段,这意味着 OpenStack 支持状况良好,可以用于生产环境。但是,它不像稳定云提供商那样经过严格测试,并且某些功能不受支持。特别是,kOps 试图支持各种 OpenStack 设置,但并非所有设置都经过了同等程度的测试。

OpenStack 要求

为了在 OpenStack 上部署 kops 管理的集群,你需要以下 OpenStack 服务

  • Nova(计算)
  • Neutron(网络)
  • Glance(镜像)
  • Cinder(块存储)

此外,kOps 可以利用以下服务

  • Swift(对象存储)
  • Designate(dns)
  • Octavia(负载均衡器)

OpenStack 版本应为 Ocata 或更高版本。

设置你的 openstack RC

kubernetes API 服务器和 kubelet 使用的云配置将从 openstack RC 文件中的环境变量构建。

source openstack.rc

我们建议在对 OpenStack 进行身份验证时使用 应用程序凭据

**注意** 本地使用的身份验证将导出到你的集群,并由 kubernetes 控制器组件使用。你必须避免使用用于其他系统的个人凭据,

环境变量

kOps 将其配置存储在状态存储中。在创建集群之前,我们需要导出状态存储的路径

export KOPS_STATE_STORE=swift://<bucket-name> # where <bucket-name> is the name of the Swift container to use for kops state

如果你的 OpenStack 没有 Swift,你可以使用任何其他 VFS 存储,例如 S3。有关其他选择,请参阅 状态存储文档

创建集群

# to see your etcd storage type
openstack volume type list

# coreos (the default) + calico overlay cluster in Default
kops create cluster \
  --cloud openstack \
  --name my-cluster.k8s.local \
  --state ${KOPS_STATE_STORE} \
  --zones nova \
  --network-cidr 10.0.0.0/24 \
  --image <imagename> \
  --control-plane-count=3 \
  --node-count=1 \
  --node-size <flavorname> \
  --control-plane-size <flavorname> \
  --etcd-storage-type <volumetype> \
  --api-loadbalancer-type public \
  --topology private \
  --bastion \
  --ssh-public-key ~/.ssh/id_rsa.pub \
  --networking calico \
  --os-ext-net <externalnetworkname>

# to update a cluster
kops update cluster my-cluster.k8s.local --state ${KOPS_STATE_STORE} --yes

# to delete a cluster
kops delete cluster my-cluster.k8s.local --yes

可选标志

  • --os-kubelet-ignore-az=true Nova 和 Cinder 具有不同的可用区,更多信息请参阅 Kubernetes 文档
  • --os-octavia=true 如果应该使用 Octavia 负载均衡器 api 而不是旧的 lbaas v2 api。
  • --os-dns-servers=8.8.8.8,8.8.4.4 如果你的 openstack 设置默认情况下没有可用的 dnssetup,你可以定义要在集群中使用的 dns 服务器
  • --os-octavia-provider 你可以定义要使用的 Octavia 负载均衡器提供商。要获取环境中可用的提供商列表,请运行 openstack loadbalancer provider list。默认值:octavia。

计算和卷区域名称不匹配

某些 openstack 用户的计算区域名称与卷区域名称不完全相同。一个很好的例子是存在多个计算区域,例如 zone-1zone-2zone-3。然后只有一个卷区域,通常称为 nova。默认情况下,这在 kOps 中是个问题,因为 kOps 假设如果你在 zone-1 上部署东西,那么应该有一个名为 zone-1 的计算和卷区域。

但是,你仍然可以通过执行以下操作让 kOps 在你的 openstack 中工作

使用你的计算区域创建集群

kops create cluster \
  --zones zone-1,zone-2,zone-3 \
  ...

初始化配置后,你需要编辑配置

kops edit cluster my-cluster.k8s.local

ignore-volume-az 编辑为 true,并将 override-volume-az 设置为你的 cinder az 名称。

示例(卷区域称为 nova

spec:
  cloudConfig:
    openstack:
      blockStorage:
        ignore-volume-az: true
        override-volume-az: nova

最后执行更新集群

kops update cluster my-cluster.k8s.local --state ${KOPS_STATE_STORE} --yes

kOps 应该在所有三个区域创建实例,但从同一区域配置卷。

使用 CCM 创建的负载均衡器

在默认配置下,使用 cloud-provider-openstack 云控制器提供商创建的负载均衡器无法访问公开的 NodePorts。

解决方法是将集群网络添加到授权的 nodeIds 中。

首先,你必须编辑集群

kops edit cluster <cluster>

将以下内容添加到 clusterspec 中

spec:
  nodePortAccess:
    - <Your network CIDR>

最后,更新集群

kops update cluster --name <cluster> --yes

在没有 lbaas 的情况下使用 OpenStack

某些 OpenStack 安装不包括 lbaas 组件的安装。要启动没有负载均衡器的集群,请运行

kops create cluster \
  --cloud openstack \
  ... (like usually)
  --api-loadbalancer-type=""

在没有负载均衡器的集群中,单个随机主节点的地址将添加到你的 kube config 中。

使用现有的 OpenStack 网络

你可以让 kOps 重用现有网络组件,而不是为每个集群配置一个。由于 OpenStack 支持仍处于 beta 阶段,我们建议你在删除集群时格外小心,并确保 kOps 不会尝试删除任何不属于该集群的资源。

让 kOps 在现有网络中配置新的子网

通过使用 --network <network id> 来使用现有网络。

如果你要从规范文件配置集群,请添加网络 ID,如下所示

spec:
  networkID: <network id>

使用现有子网

你可以重用现有的子网,而不是让 kOps 为集群创建新的子网。

当你创建新集群时,你可以使用 --subnets--utility-subnets 标志指定子网。

示例

kops create cluster \
  --cloud openstack \
  --name sharedsub2.k8s.local \
  --state ${KOPS_STATE_STORE} \
  --zones zone-1 \
  --network-cidr 10.1.0.0/16 \
  --image debian-10-160819-devops \
  --control-plane-count=3 \
  --node-count=2 \
  --node-size m1.small \
  --control-plane-size m1.small \
  --etcd-storage-type default \
  --topology private \
  --bastion \
  --networking calico \
  --api-loadbalancer-type public \
  --os-kubelet-ignore-az=true \
  --os-ext-net ext-net \
  --subnets c7d20c0f-df3a-4e5b-842f-f633c182961f \
  --utility-subnets 90871d21-b546-4c4a-a7c9-2337ddf5375f \
  --os-octavia=true --yes

在 OpenStack 中使用自签名证书

kOps 可以配置为对 OpenStack 使用不安全模式。但是,不建议这样做,因为 kubernetes 中的 OpenStack 云提供商不支持它。如果你在 kOps 中使用不安全标志,集群可能无法正常工作。

spec:
  cloudConfig:
    openstack:
      insecureSkipVerify: true

高级实例组配置

将允许的地址对添加到端口

可以使 kOps 配置和更新服务器的端口,并带有允许的地址对,这在需要使用例如 VRRP 来进行自定义负载均衡解决方案时非常有用。

要使用此功能,请对实例组配置进行如下注释

kind: InstanceGroup
metadata:
  annotations:
    openstack.kops.io/allowedAddressPair/N: <IPAddress>(,<MACAddress>)

其中 N 可以是任意标识符,MACAddress 是可选的,例如

kind: InstanceGroup
metadata:
  annotations:
    openstack.kops.io/allowedAddressPair/0: 192.168.0.0/16
    openstack.kops.io/allowedAddressPair/1: 10.123.0.10,12:34:56:78:90:AB

有关允许的地址对的更多信息,请参阅 OpenStack 网络 API 文档

使用从卷启动

默认情况下,kOps 会配置从“镜像启动”的服务器。

要为服务器使用“从卷启动”,请在相应的实例组清单中指定以下注释

kind: InstanceGroup
metadata:
  annotations:
    openstack.kops.io/osVolumeBoot: true
    openstack.kops.io/osVolumeSize: 10

设置卷的大小(使用 osVolumeSize)是可选的,如果没有指定,kOps 将使用镜像启动所需的最小磁盘空间大小。此值需要是整数,表示根卷将使用的 GB 数。

请注意,启用“从卷启动”后,服务器将使用默认卷类型,并且在服务器终止时卷将被删除。

使用自定义服务器组策略

默认情况下,kOps 在 OpenStack 中使用 anti-affinity 来配置服务器组。

要覆盖此行为,请在 kOps 应该使用其他策略配置服务器组的实例组配置中添加以下注释

kind: InstanceGroup
metadata:
  annotations:
    openstack.kops.io/serverGroupAffinity: soft-anti-affinity

请参考 OpenStack 计算 API 文档 以了解支持的策略。

使用自定义服务器组名称

默认情况下,kOps 在 OpenStack 中使用 anti-affinity 来配置服务器组。但是,如果您只有一个可用区并且想要运行多个控制平面,您可能希望在控制平面之间使用反亲和性。

要覆盖此行为,请在 kOps 应该使用其他策略配置服务器组的所有控制平面实例组配置中添加以下注释

kind: InstanceGroup
metadata:
  annotations:
    openstack.kops.io/serverGroupName: control-plane

下一步

现在您已经拥有了一个可用的 kOps 集群,请阅读 生产环境设置建议指南,了解如何为生产工作负载配置 kOps。