Kubernetes VIM 安装

Tacker 使用 devstack-plugin-container 来部署 Kubernetes 集群。

  1. 编辑 local.conf 以配置 Kubernetes

    为 devstack-plugin-container 添加以下插件配置。

    # Enable devstack-plugin-container, crio
    KUBERNETES_VIM=True
    
    # It is necessary to specify the patch version
    # because it is the version used when executing "apt-get install" command.
    K8S_VERSION="1.30.5"
    K8S_TOKEN="9agf12.zsu5uh2m4pzt3qba"
    CONTAINER_ENGINE="crio"
    CRIO_VERSION="1.30.5"
    
    enable_plugin devstack-plugin-container https://opendev.org/openstack/devstack-plugin-container master
    

    公共网络用于在 Kubernetes 中为 Service 启动 LoadBalancer。设置公共子网的描述见 [1]

    您可以在 [2][3] 中找到 local.conf 的完整示例。

  2. 在 CentOS 环境中,在执行 stack.sh 之前安装 Kubernetes 包并启动 ovn 服务。

    命令

    $ sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=1
      repo_gpgcheck=1
      gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      EOF
    $ sudo chmod 755 /etc/yum.repos.d/kubernetes.repo
    $ sudo dnf install kubeadm -y
    $ sudo yum install -y centos-release-openstack-victoria
    $ sudo yum install -y openvswitch
    $ sudo yum install -y openvswitch-ovn-common
    $ sudo yum install -y openvswitch-ovn-central
    $ sudo yum install -y openvswitch-ovn-host
    $ sudo systemctl start ovn-northd.service
    $ sudo systemctl start ovn-controller.service
    $ sudo systemctl start ovs-vswitchd.service
    $ sudo systemctl start ovsdb-server.service
    
  3. 运行 devstack 安装

    命令

    $ ./stack.sh
    
  4. 设置 Kubernetes VIM 配置

    如果您完成了 devstack 安装,现在就可以注册 Kubernetes VIM 了。您可以使用专用的脚本来完成这项工作,也可以从头开始编辑配置文件来设置 Kubernetes VIM 的配置。

    第一种方法是运行 gen_vim_config.sh,并使用选项生成配置文件,如 此处 所述。转到 TACKER_ROOT 目录,该目录是 tacker 仓库的根目录。您至少需要添加 -t k8s 以指定 Kubernetes,否则它将生成 OpenStack 的配置。您可以跳过 Register Kubernetes VIM 部分之前的步骤。

    $ cd TACKER_ROOT
    $ bash tools/gen_vim_config.sh -t k8s
    

    该脚本尝试从您的环境中获取所有必需的参数,尽管您可以使用特定选项提供任何参数。有关详细信息,请参阅帮助消息中的用法,-h 选项。

    另一方面,如果您从头开始编辑配置文件,则需要使用 kubectl 命令获取所需的参数。

    • 创建 Secret

      首先,您可以检查是否已经存在包含 bearer token 的 Secret。如果不存在,您可以根据以下文件创建 Secret。如果已经存在,请跳过此步骤,并从 获取“Bearer Token” 开始。

      $ cat default-token.yaml
      apiVersion: v1
      kind: Secret
      metadata:
        name: default-token-cfx5m
        namespace: default
        annotations:
          kubernetes.io/service-account.name: "default"
      type: kubernetes.io/service-account-token
      

      使用 default-token.yaml 创建 Secret。

      命令

      $ kubectl apply -f default-token.yaml
      

      结果

      secret/default-token-cfx5m created
      
    • 获取“Bearer Token”

      您需要确认包含 bearer token 的 Kubernetes Secret 名称。

      命令

      $ kubectl get secret
      

      结果

      NAME                  TYPE                                  DATA   AGE
      default-token-cfx5m   kubernetes.io/service-account-token   3      94m
      

      然后,您可以获取 bearer token。

      命令

      $ TOKEN=$(kubectl get secret default-token-cfx5m -o jsonpath="{.data.token}" | base64 --decode) && echo $TOKEN
      

      结果

      eyJhbGciOiJSUzI1NiIsImtpZCI6ImdTeGhkUlBNRkJwemo0eXdpMmxxT2Y1aWkzYUhwRERCTWlxMzZFemFKSkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tY2Z4NW0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNhOTNiNjA0LTJjY2EtNDllZi05ODMwLWI5NDZhZjI2OTAyNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.yWmZMKuCRn_9Hw07wzee2Gr072NcexuKkaG2HaBamd3BOOAaypb7a12UiKcjqQYsDq32jVGMswSroTJOJtm7xccVbU2lz6CMhTRtDbPKOQm7DLyYdpBoRAoqE8fpy4aF5agqpFYmhYHBoz2VC-sgTwWjuY5XkJ81X9rZWlTCj9p3QkanH2z77lLXo-muthDOOuNm_J05FyR_J1epYXm8JbEpTrj1upaQoKZ9hoKKQrd1crW0stqymcyiLxfPGtSW8dO6GZS4v1vTiIhAEBg3kyQsOPz_nEmDxuYXrcMJxQV8MxWvm3uLOu7wN6-MPsSdw1CQdOfjycTh0D9rG4pxUw
      

      注意

      在 Kubernetes 数据模型中,.data 下包含的值使用 Base64 格式编码,因此您必须使用 base64 --decodebase64 -d 命令对其进行解码,才能将其用作 bearer token。

      在使用此 token 之前,用户必须将管理员角色应用于此 token。

      命令

      $ kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole cluster-admin --serviceaccount=default:default
      

      结果

      clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-binding created
      
    • 获取 ssl_ca_cert

      用户可以获取有关验证 Kubernetes 集群的更多信息。

      命令

      $ kubectl get secrets default-token-cfx5m -o jsonpath="{.data.ca\.crt}" | base64 --decode
      

      结果

      -----BEGIN CERTIFICATE-----
      MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
      cm5ldGVzMB4XDTIxMDkwOTA0MDc0NFoXDTMxMDkwNzA0MDc0NFowFTETMBEGA1UE
      AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN7H
      /ttxemXTrCDCvN59+g22wwWr5GWUEBxQQz04OPXz1GxBY0H2h3fToRdSs3+snD2h
      6bZ8uryxvXTAlml0IBue/nBxKVRMCRTfqEHEPeNo1yHL2thWGYDfKwEZr9Eg72F5
      mxu9wYdfQS61wg9b4kLmHCIjA58wBDv8Osccs+28BpxJaBd1oG25JWZhcCFRTQur
      URy6d1885ahvaqP9L9mhR8zVzVkAr2noNrCo4/bVMIea8n3yQPBKe3ND1UcxpoCk
      UrfWCrrFsG93RtiivLFJjG8UgUkUhzRfTFoMnTX51Qm2/q/5GZqXSd6z+nU7Bp47
      DHa0hNSPpKnRnP2WwdECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
      /wQFMAMBAf8wHQYDVR0OBBYEFICl4EHfUar/PBfVTfgymIYXe/z5MA0GCSqGSIb3
      DQEBCwUAA4IBAQA8i+HhuNIJZheNfLgZ+svxmpa1AtdPv8QTrkXTn5OvBJ6l2A2e
      23fVG+8Eolmd0pwuWCMGv4UKAQ45hCMFKMkuKNs2akYueujTxTLwsIu+1EAVnzWp
      E5n+RAhgkAZ18VAGW0otrP/T2zFvci9o3pnEYnQ9Es1mFX7GkBbiI/4qYqx5ysZr
      i5We9jMO//ouJxliJAemRCHMjdqrooMb3k0QyT2lN/1O0TXj0a96pTxoAyivllwk
      LYnc2CoRegU81LeUPSNJRe5+A6kdXixL12F1182/LQgXWkdRnYwoMypyEUDEr9kf
      eGr2fBQ+2ywKH7Ho/HVRW+WcJbXt5nfMX5NK
      -----END CERTIFICATE-----
      
    • 获取 Kubernetes 服务器 URL

      默认情况下,Kubernetes API 服务器监听 https://127.0.0.1:6443https://{HOST_IP}:6443。用户可以通过 kubectl cluster-info 命令获取此信息,并尝试使用上一步描述的 bearer token 访问 API 服务器。

      首先,您需要确认 Kubernetes 集群暴露的 API 端点。

      命令

      $ kubectl cluster-info
      

      结果

      Kubernetes control plane is running at https://172.30.202.39:6443
      
      To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
      

      然后,您可以确认 API 端点和您的 bearer token 可用。

      命令

      $ curl -k https://172.30.202.39:6443/api/ -H "Authorization: Bearer $TOKEN"
      

      结果

      {
         "kind": "APIVersions",
         "versions": [
         "v1"
         ],
         "serverAddressByClientCIDRs": [
            {
               "clientCIDR": "0.0.0.0/0",
               "serverAddress": "172.30.202.39:6443"
            }
         ]
      }
      

      注意

      由于 Kubernetes API 服务器使用的 SSL 证书是自签名的,curl 在响应中返回 SSL 证书问题。用户可以使用 -k--insecure 选项忽略 SSL 证书警告,或者使用 --cacert <path/to/ssl_ca_cert_file> 选项使用 ssl_ca_cert 来验证 API 服务器的 SSL 证书。

  5. 注册 Kubernetes VIM

    vim_config.yaml 中,project_name 固定为“default”,这将用于将来在 Kubernetes 上支持多租户。

    创建 Kubernetes VIM 的 vim_config.yaml 文件,如下例所示

    auth_url: "https://172.30.202.39:6443"
    bearer_token: "eyJhbGciOiJSUzI1NiIsImtpZCI6ImdTeGhkUlBNRkJwemo0eXdpMmxxT2Y1aWkzYUhwRERCTWlxMzZFemFKSkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tY2Z4NW0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNhOTNiNjA0LTJjY2EtNDllZi05ODMwLWI5NDZhZjI2OTAyNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.yWmZMKuCRn_9Hw07wzee2Gr072NcexuKkaG2HaBamd3BOOAaypb7a12UiKcjqQYsDq32jVGMswSroTJOJtm7xccVbU2lz6CMhTRtDbPKOQm7DLyYdpBoRAoqE8fpy4aF5agqpFYmhYHBoz2VC-sgTwWjuY5XkJ81X9rZWlTCj9p3QkanH2z77lLXo-muthDOOuNm_J05FyR_J1epYXm8JbEpTrj1upaQoKZ9hoKKQrd1crW0stqymcyiLxfPGtSW8dO6GZS4v1vTiIhAEBg3kyQsOPz_nEmDxuYXrcMJxQV8MxWvm3uLOu7wN6-MPsSdw1CQdOfjycTh0D9rG4pxUw"
    ssl_ca_cert: "None"
    project_name: "default"
    type: "kubernetes"
    

    或者启用 ssl_ca_certvim_config.yaml

    auth_url: "https://172.30.202.39:6443"
    bearer_token: "eyJhbGciOiJSUzI1NiIsImtpZCI6ImdTeGhkUlBNRkJwemo0eXdpMmxxT2Y1aWkzYUhwRERCTWlxMzZFemFKSkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tY2Z4NW0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNhOTNiNjA0LTJjY2EtNDllZi05ODMwLWI5NDZhZjI2OTAyNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.yWmZMKuCRn_9Hw07wzee2Gr072NcexuKkaG2HaBamd3BOOAaypb7a12UiKcjqQYsDq32jVGMswSroTJOJtm7xccVbU2lz6CMhTRtDbPKOQm7DLyYdpBoRAoqE8fpy4aF5agqpFYmhYHBoz2VC-sgTwWjuY5XkJ81X9rZWlTCj9p3QkanH2z77lLXo-muthDOOuNm_J05FyR_J1epYXm8JbEpTrj1upaQoKZ9hoKKQrd1crW0stqymcyiLxfPGtSW8dO6GZS4v1vTiIhAEBg3kyQsOPz_nEmDxuYXrcMJxQV8MxWvm3uLOu7wN6-MPsSdw1CQdOfjycTh0D9rG4pxUw"
    ssl_ca_cert: "-----BEGIN CERTIFICATE-----
    MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
    cm5ldGVzMB4XDTIxMDkwOTA0MDc0NFoXDTMxMDkwNzA0MDc0NFowFTETMBEGA1UE
    AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN7H
    /ttxemXTrCDCvN59+g22wwWr5GWUEBxQQz04OPXz1GxBY0H2h3fToRdSs3+snD2h
    6bZ8uryxvXTAlml0IBue/nBxKVRMCRTfqEHEPeNo1yHL2thWGYDfKwEZr9Eg72F5
    mxu9wYdfQS61wg9b4kLmHCIjA58wBDv8Osccs+28BpxJaBd1oG25JWZhcCFRTQur
    URy6d1885ahvaqP9L9mhR8zVzVkAr2noNrCo4/bVMIea8n3yQPBKe3ND1UcxpoCk
    UrfWCrrFsG93RtiivLFJjG8UgUkUhzRfTFoMnTX51Qm2/q/5GZqXSd6z+nU7Bp47
    DHa0hNSPpKnRnP2WwdECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
    /wQFMAMBAf8wHQYDVR0OBBYEFICl4EHfUar/PBfVTfgymIYXe/z5MA0GCSqGSIb3
    DQEBCwUAA4IBAQA8i+HhuNIJZheNfLgZ+svxmpa1AtdPv8QTrkXTn5OvBJ6l2A2e
    23fVG+8Eolmd0pwuWCMGv4UKAQ45hCMFKMkuKNs2akYueujTxTLwsIu+1EAVnzWp
    E5n+RAhgkAZ18VAGW0otrP/T2zFvci9o3pnEYnQ9Es1mFX7GkBbiI/4qYqx5ysZr
    i5We9jMO//ouJxliJAemRCHMjdqrooMb3k0QyT2lN/1O0TXj0a96pTxoAyivllwk
    LYnc2CoRegU81LeUPSNJRe5+A6kdXixL12F1182/LQgXWkdRnYwoMypyEUDEr9kf
    eGr2fBQ+2ywKH7Ho/HVRW+WcJbXt5nfMX5NK
    -----END CERTIFICATE-----"
    project_name: "default"
    type: "kubernetes"
    

    运行 Tacker 命令注册 VIM

    命令

    $ openstack vim register --config-file vim_config.yaml vim-kubernetes
    

    结果

    +----------------+-----------------------------------------------+
    | Field          | Value                                         |
    +----------------+-----------------------------------------------+
    | auth_cred      | {                                             |
    |                |     "bearer_token": "***",                    |
    |                |     "ssl_ca_cert": "None",                    |
    |                |     "auth_url": "https://172.30.202.39:6443", |
    |                |     "username": "None",                       |
    |                |     "key_type": "barbican_key",               |
    |                |     "secret_uuid": "***",                     |
    |                |     "password": "***"                         |
    |                | }                                             |
    | auth_url       | https://172.30.202.39:6443                    |
    | created_at     | 2021-09-17 01:26:28.372552                    |
    | description    |                                               |
    | id             | 884ec305-c8ca-47ef-8cba-fafceabeda30          |
    | is_default     | False                                         |
    | name           | vim-kubernetes                                |
    | placement_attr | {                                             |
    |                |     "regions": [                              |
    |                |         "default",                            |
    |                |         "kube-node-lease",                    |
    |                |         "kube-public",                        |
    |                |         "kube-system"                         |
    |                |     ]                                         |
    |                | }                                             |
    | project_id     | 8cd3cc798ae14227a84f7b50c5ef984a              |
    | status         | ACTIVE                                        |
    | type           | kubernetes                                    |
    | updated_at     | None                                          |
    | vim_project    | {                                             |
    |                |     "name": "default"                         |
    |                | }                                             |
    +----------------+-----------------------------------------------+
    

    placement_attr 中,有四个区域:‘default’、‘kube-node-lease’、‘kube-public’ 和 ‘kube-system’,它们映射到 Kubernetes 环境中的 namespace

    成功安装 VIM 后,您可以按如下方式获取 VIM 信息

    命令

    $ openstack vim list
    

    结果

    +--------------------------------------+----------------+----------------------------------+------------+------------+--------+
    | ID                                   | Name           | Tenant_id                        | Type       | Is Default | Status |
    +--------------------------------------+----------------+----------------------------------+------------+------------+--------+
    | 884ec305-c8ca-47ef-8cba-fafceabeda30 | vim-kubernetes | 8cd3cc798ae14227a84f7b50c5ef984a | kubernetes | False      | ACTIVE |
    +--------------------------------------+----------------+----------------------------------+------------+------------+--------+
    

    您可以使用 openstack vim set 更新这些 VIM 信息

    命令

    $ openstack vim set --config-file path/to/updated/config 884ec305-c8ca-47ef-8cba-fafceabeda30
    

    在更新 Kubernetes VIM 时,您可以更新 VIM 信息(例如 bearer_token 和 ssl_ca_cert),但不包括 VIM 的 auth_url 和类型。

    您可以使用 openstack vim show 获取 VIM 信息的详细信息

    命令

    $ openstack vim show 884ec305-c8ca-47ef-8cba-fafceabeda30
    

    如果您不再使用 Kubernetes VIM,可以使用 openstack vim delete 删除它

    命令

    $ openstack vim delete 884ec305-c8ca-47ef-8cba-fafceabeda30
    

参考