Kuryr

Kuryr 是 OpenStack Neutron 的子项目,其主要目标是透过该项目来集成 OpenStack 与 Kubernetes 的网络。该项目在 Kubernetes 中实作了原生 Neutron-based 的网络,因此使用 Kuryr-Kubernetes 可以让 OpenStack VM 与 Kubernetes Pods 能够选择在同一个子网络上运作,并且能够使用 Neutron L3 与 Security Group 来对网络进行路由,以及阻挡特定来源 Port,并且也提供基于 Neutron LBaaS 的 Service 集成。

Kuryr - 图1

Kuryr-Kubernetes 有以两个主要部分组成:

  1. Kuryr Controller: Controller 主要目的是监控 Kubernetes API 的来获取 Kubernetes 资源的变化,然后依据 Kubernetes 资源的需求来运行子资源的分配和资源管理。
  2. Kuryr CNI:主要是依据 Kuryr Controller 分配的资源来绑定网络至 Pods 上。

devstack 部署

最简单的方式是使用 devstack 部署一个单机环境:

  1. $ git clone https://git.openstack.org/openstack-dev/devstack
  2. $ ./devstack/tools/create-stack-user.sh
  3. $ sudo su stack
  4. $ git clone https://git.openstack.org/openstack-dev/devstack
  5. $ git clone https://git.openstack.org/openstack/kuryr-kubernetes
  6. $ cp kuryr-kubernetes/devstack/local.conf.sample devstack/local.conf
  7. # start install
  8. $ ./devstack/stack.sh

部署完成后,验证安装成功

  1. $ source /devstack/openrc admin admin
  2. $ openstack service list
  3. +----------------------------------+------------------+------------------+
  4. | ID | Name | Type |
  5. +----------------------------------+------------------+------------------+
  6. | 091e3e2813cc4904b74b60c41e8a98b3 | kuryr-kubernetes | kuryr-kubernetes |
  7. | 2b6076dd5fc04bf180e935f78c12d431 | neutron | network |
  8. | b598216086944714aed2c233123fc22d | keystone | identity |
  9. +----------------------------------+------------------+------------------+
  10. $ kubectl get nodes
  11. NAME STATUS AGE VERSION
  12. localhost Ready 2m v1.6.2

多机部署

本篇我們將說明如何利用 DevStackKubespray 建立一個簡單的測試環境。

环境资源与事前准备

准备两台实体机器,这边测试的作业系统为 CentOS 7.x,该环境将在平面的网络下进行。

IP Address 1 Role
172.24.0.34 controller, k8s-master
172.24.0.80 compute1, k8s-node1
172.24.0.81 compute2, k8s-node2

更新每台节点的 CentOS 7.x 包:

  1. $ sudo yum --enablerepo=cr update -y

然后关闭 firewalld 以及 SELinux 来避免实现发生问题:

  1. $ sudo setenforce 0
  2. $ sudo systemctl disable firewalld && sudo systemctl stop firewalld

OpenStack Controller 安裝

首先进入 172.24.0.34(controller),并且运行以下命令。

然后运行以下命令来建立 DevStack 专用用户:

  1. $ sudo useradd -s /bin/bash -d /opt/stack -m stack
  2. $ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

接着切换至该用户环境来创建 OpenStack:

  1. $ sudo su - stack

下载 DevStack:

  1. $ git clone https://git.openstack.org/openstack-dev/devstack
  2. $ cd devstack

新增 local.conf 文档,来描述部署资讯:

  1. [[local|localrc]]
  2. HOST_IP=172.24.0.34
  3. GIT_BASE=https://github.com
  4. ADMIN_PASSWORD=passwd
  5. DATABASE_PASSWORD=passwd
  6. RABBIT_PASSWORD=passwd
  7. SERVICE_PASSWORD=passwd
  8. SERVICE_TOKEN=passwd
  9. MULTI_HOST=1

修改 HOST_IP 为自己的 IP 。

完成后,运行以下命令开始部署:

  1. $ ./stack.sh

Openstack Compute 安装

进入到 172.24.0.80(compute)172.24.0.81(node2),并且运行以下命令。

然后运行以下命令来建立 DevStack 专用用户:

  1. $ sudo useradd -s /bin/bash -d /opt/stack -m stack
  2. $ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

接着切换至该用户环境来创建 OpenStack:

  1. $ sudo su - stack

下载 DevStack:

  1. $ git clone https://git.openstack.org/openstack-dev/devstack
  2. $ cd devstack

新增 local.conf 文档,来描述部署资讯:

  1. [[local|localrc]]
  2. HOST_IP=172.24.0.80
  3. GIT_BASE=https://github.com
  4. MULTI_HOST=1
  5. LOGFILE=/opt/stack/logs/stack.sh.log
  6. ADMIN_PASSWORD=passwd
  7. DATABASE_PASSWORD=passwd
  8. RABBIT_PASSWORD=passwd
  9. SERVICE_PASSWORD=passwd
  10. DATABASE_TYPE=mysql
  11. SERVICE_HOST=172.24.0.34
  12. MYSQL_HOST=$SERVICE_HOST
  13. RABBIT_HOST=$SERVICE_HOST
  14. GLANCE_HOSTPORT=$SERVICE_HOST:9292
  15. ENABLED_SERVICES=n-cpu,q-agt,n-api-meta,c-vol,placement-client
  16. NOVA_VNC_ENABLED=True
  17. NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
  18. VNCSERVER_LISTEN=$HOST_IP
  19. VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

修改 HOST_IP 为自己的主机位置。 修改 SERVICE_HOST 为 Master 的 IP。

完成后,运行以下命令开始部署:

  1. $ ./stack.sh

创建 Kubernetes 集群环境

首先确认所有节点之间不需要 SSH 密码即可登入,接着进入到 172.24.0.34(k8s-master) 并且运行以下命令。

接着安装所需要的软件包:

  1. $ sudo yum -y install software-properties-common ansible git gcc python-pip python-devel libffi-devel openssl-devel
  2. $ sudo pip install -U kubespray

完成后,创建 kubespray 配置档:

  1. $ cat <<EOF> ~/.kubespray.yml
  2. kubespray_git_repo: "https://github.com/kubernetes-incubator/kubespray.git"
  3. # Logging options
  4. loglevel: "info"
  5. EOF

利用 kubespray-cli 快速产生环境的 inventory 文档,并修改部分内容:

  1. $ sudo -i
  2. $ kubespray prepare --masters master --etcds master --nodes node1

编辑 /root/.kubespray/inventory/inventory.cfg 文档,修改以下内容:

  1. [all]
  2. master ansible_host=172.24.0.34 ansible_user=root ip=172.24.0.34
  3. node1 ansible_host=172.24.0.80 ansible_user=root ip=172.24.0.80
  4. node2 ansible_host=172.24.0.81 ansible_user=root ip=172.24.0.81
  5. [kube-master]
  6. master
  7. [kube-node]
  8. master
  9. node1
  10. node2
  11. [etcd]
  12. master
  13. [k8s-cluster:children]
  14. kube-node
  15. kube-master

完成后,即可利用 kubespray-cli 来进行部署:

  1. $ kubespray deploy --verbose -u root -k .ssh/id_rsa -n calico

经过一段时间后就会部署完成,这时候检查节点是否正常:

  1. $ kubectl get no
  2. NAME STATUS AGE VERSION
  3. master Ready,master 2m v1.7.4
  4. node1 Ready 2m v1.7.4
  5. node2 Ready 2m v1.7.4

接着为了方便让 Kuryr Controller 简单取得 K8s API Server,这边修改 /etc/kubernetes/manifests/kube-apiserver.yml 文档,加入以下内容:

  1. - "--insecure-bind-address=0.0.0.0"
  2. - "--insecure-port=8080"

将 insecure 绑定到 0.0.0.0 之上,以及开启 8080 Port。

安装 Openstack Kuryr Controller

进入到 172.24.0.34(controller),并且运行以下命令。

首先在节点安装所需要的软件包:

  1. $ sudo yum -y install gcc libffi-devel python-devel openssl-devel install python-pip

下载 kuryr-kubernetes 并进行安装:

  1. $ git clone http://git.openstack.org/openstack/kuryr-kubernetes
  2. $ pip install -e kuryr-kubernetes

创建 kuryr.conf/etc/kuryr 目录

  1. $ cd kuryr-kubernetes
  2. $ ./tools/generate_config_file_samples.sh
  3. $ sudo mkdir -p /etc/kuryr/
  4. $ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

使用 OpenStack Dashboard 建立项目,在浏览器输入 http://172.24.0.34,并运行以下步骤。

  1. 创建 k8s project。
  2. 创建 kuryr-kubernetes service,并修改 k8s project member 加入到 service project。
  3. 在该 Project 中新增 Security Groups,参考 kuryr-kubernetes manually
  4. 在该 Project 中新增 pod_subnet 子网络。
  5. 在该 Project 中新增 service_subnet 子网络。

完成后,修改 /etc/kuryr/kuryr.conf 文档,加入以下内容:

  1. [DEFAULT]
  2. use_stderr = true
  3. bindir = /usr/local/libexec/kuryr
  4. [kubernetes]
  5. api_root = http://172.24.0.34:8080
  6. [neutron]
  7. auth_url = http://172.24.0.34/identity
  8. username = admin
  9. user_domain_name = Default
  10. password = admin
  11. project_name = service
  12. project_domain_name = Default
  13. auth_type = password
  14. [neutron_defaults]
  15. ovs_bridge = br-int
  16. pod_security_groups = {id_of_secuirity_group_for_pods}
  17. pod_subnet = {id_of_subnet_for_pods}
  18. project = {id_of_project}
  19. service_subnet = {id_of_subnet_for_k8s_services}

完成后运行 kuryr-k8s-controller:

  1. $ kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf&

安装 Kuryr-CNI

进入到 172.24.0.80(node1)172.24.0.81(node2) 并运行以下命令。

首先在节点安装所需要的软件包

  1. $ sudo yum -y install gcc libffi-devel python-devel openssl-devel python-pip

安装 Kuryr-CNI 来提供给 kubelet 使用:

  1. $ git clone http://git.openstack.org/openstack/kuryr-kubernetes
  2. $ sudo pip install -e kuryr-kubernetes

创建 kuryr.conf/etc/kuryr 目录:

  1. $ cd kuryr-kubernetes
  2. $ ./tools/generate_config_file_samples.sh
  3. $ sudo mkdir -p /etc/kuryr/
  4. $ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

修改 /etc/kuryr/kuryr.conf 文档,加入以下内容:

  1. [DEFAULT]
  2. use_stderr = true
  3. bindir = /usr/local/libexec/kuryr
  4. [kubernetes]
  5. api_root = http://172.24.0.34:8080

创建 CNI bin 与 Conf 目录:

  1. $ sudo mkdir -p /opt/cni/bin
  2. $ sudo ln -s $(which kuryr-cni) /opt/cni/bin/
  3. $ sudo mkdir -p /etc/cni/net.d/

新增 /etc/cni/net.d/10-kuryr.conf CNI 配置档:

  1. {
  2. "cniVersion": "0.3.0",
  3. "name": "kuryr",
  4. "type": "kuryr-cni",
  5. "kuryr_conf": "/etc/kuryr/kuryr.conf",
  6. "debug": true
  7. }

完成后,更新 oslo 与 vif python 库:

  1. $ sudo pip install 'oslo.privsep>=1.20.0' 'os-vif>=1.5.0'

最后重新启动服务:

  1. $ sudo systemctl daemon-reload && systemctl restart kubelet.service

测试结果

创建一个 Pod 与 OpenStack VM 来进行通信: Kuryr - 图2

Kuryr - 图3

参考文档