Kubernetes Kuryr 是 OpenStack Neutron 的子项目,其主要目标是通过该项目来整合 OpenStack 与 Kubernetes 的网络。该项目在 Kubernetes 中实作了原生 Neutron-based 的网络,因此使用 Kuryr-Kubernetes 可以让你的 OpenStack VM 与 Kubernetes Pods 能够选择在同一个子网上运作,并且能够使用 Neutron 的 L3 与 Security Group 来对网络进行路由,以及阻挡特定来源 Port。
Kuryr-Kubernetes 整合有两个主要组成部分:
- Kuryr Controller:
Controller 主要目的是监控 Kubernetes API 的来获取 Kubernetes 资源的变化,然后依据 Kubernetes 资源的需求来执行子资源的分配和资源管理。 - Kuryr CNI:主要是依据 Kuryr Controller 分配的资源来绑定网络至 Pods 上。
本篇我们将说明如何利用DevStack与Kubespray建立一个简单的测试环境。
环境资源与事前准备
准备两台实体机器,这边测试的操作系统为CentOS 7.x,该环境将在扁平的网络下进行。
IP Address 1 | Role |
172.24.0.34 | controller, k8s-master |
172.24.0.80 | compute, k8s-node1 |
更新每台节点的 CentOS 7.x packages:
$ sudo yum --enablerepo=cr update -y
然后关闭 firewalld 以及 SELinux 来避免实现发生问题:
$ sudo setenforce 0 $ sudo systemctl disable firewalld && sudo systemctl stop firewalld
OpenStack Controller 安装
首先进入172.24.0.34(controller),并且执行以下指令。
然后执行以下指令来建立 DevStack 专用使用者:
$ sudo useradd -s /bin/bash -d /opt/stack -m stack $ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
选用 DevStack 是因为现在都是用 Systemd 来管理服务,不用再用 screen 了,虽然都很方便。
接着切换至该使用者环境来建立 OpenStack:
$ sudo su - stack
下载 DevStack 安装套件:
$ git clone https://git.openstack.org/openstack-dev/devstack $ cd devstack
新增local.conf文件,来描述部署信息:
[[local|localrc]] HOST_IP=172.24.0.34 GIT_BASE=https://github.com ADMIN_PASSWORD=passwd DATABASE_PASSWORD=passwd RABBIT_PASSWORD=passwd SERVICE_PASSWORD=passwd SERVICE_TOKEN=passwd MULTI_HOST=1
修改 HOST_IP 为自己的 IP 位置。
完成后,执行以下指令开始部署:
$ ./stack.sh
Openstack Compute 安装
进入到172.24.0.80(compute),并且执行以下指令。
然后执行以下指令来建立 DevStack 专用使用者:
$ sudo useradd -s /bin/bash -d /opt/stack -m stack $ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
选用 DevStack 是因为现在都是用 Systemd 来管理服务,不用再用 screen 了,虽然都很方便。
接着切换至该使用者环境来建立 OpenStack:
$ sudo su - stack
下载 DevStack 安装套件:
$ git clone https://git.openstack.org/openstack-dev/devstack $ cd devstack
新增local.conf文件,来描述部署信息:
[[local|localrc]] HOST_IP=172.24.0.80 GIT_BASE=https://github.com MULTI_HOST=1 LOGFILE=/opt/stack/logs/stack.sh.log ADMIN_PASSWORD=passwd DATABASE_PASSWORD=passwd RABBIT_PASSWORD=passwd SERVICE_PASSWORD=passwd DATABASE_TYPE=mysql SERVICE_HOST=172.24.0.34 MYSQL_HOST=$SERVICE_HOST RABBIT_HOST=$SERVICE_HOST GLANCE_HOSTPORT=$SERVICE_HOST:9292 ENABLED_SERVICES=n-cpu,q-agt,n-api-meta,c-vol,placement-client NOVA_VNC_ENABLED=True NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html" VNCSERVER_LISTEN=$HOST_IP VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
Tips:
修改 HOST_IP 为自己的主机位置。
修改 SERVICE_HOST 为 Master 的IP位置。
完成后,执行以下指令开始部署:
$ ./stack.sh
建立 Kubernetes 集群环境
首先确认所有节点之间不需要 SSH 密码即可登入,接着进入到172.24.0.34(k8s-master)并且执行以下指令。
接着安装所需要的套件:
$ sudo yum -y install software-properties-common ansible git gcc python-pip python-devel libffi-devel openssl-devel $ sudo pip install -U kubespray
完成后,新增 kubespray 配置文件:
$ cat <<EOF > ~/.kubespray.yml kubespray_git_repo: "https://github.com/kubernetes-incubator/kubespray.git" # Logging options loglevel: "info" EOF
然后利用 kubespray-cli 快速生成环境的inventory文件,并修改部分内容:
$ sudo -i $ kubespray prepare --masters master --etcds master --nodes node1
编辑/root/.kubespray/inventory/inventory.cfg,修改以下内容:
[all] master ansible_host=172.24.0.34 ansible_user=root ip=172.24.0.34 node1 ansible_host=172.24.0.80 ansible_user=root ip=172.24.0.80 [kube-master] master [kube-node] master node1 [etcd] master [k8s-cluster:children] kube-node1 kube-master
完成后,即可利用 kubespray-cli 指令来进行部署:
$ kubespray deploy --verbose -u root -k .ssh/id_rsa -n calico
经过一段时间后就会部署完成,这时候检查节点是否正常:
$ kubectl get no NAME STATUS AGE VERSION master Ready,master 2m v1.7.4 node1 Ready 2m v1.7.4
接着为了方便让 Kuryr Controller 简单取得 K8s API Server,这边修改/etc/kubernetes/manifests/kube-apiserver.yml档案,加入以下内容:
- "--insecure-bind-address=0.0.0.0" - "--insecure-port=8080"
Tips:
将 insecure 绑定到 0.0.0.0 之上,以及开启 8080 Port。
安装 Openstack Kuryr
进入到172.24.0.34(controller),并且执行以下指令。
首先在节点安装所需要的套件:
$ sudo yum -y install gcc libffi-devel python-devel openssl-devel install python-pip
然后下载 kuryr-kubernetes 并进行安装:
$ git clone http://git.openstack.org/openstack/kuryr-kubernetes $ pip install -e kuryr-kubernetes
新增kuryr.conf至/etc/kuryr目录:
$ cd kuryr-kubernetes $ ./tools/generate_config_file_samples.sh $ sudo mkdir -p /etc/kuryr/ $ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf
接着使用 OpenStack Dashboard 建立相关项目,在浏览器输入Dashboard,并执行以下步骤。
- 新增 K8s project。
- 修改 K8s project member 加入到 service project。
- 在该 Project 中新增 Security Groups,参考kuryr-kubernetes manually。
- 在该 Project 中新增 pod_subnet 子网。
- 在该 Project 中新增 service_subnet 子网。
完成后,修改/etc/kuryr/kuryr.conf文件,加入以下内容:
[DEFAULT] use_stderr = true bindir = /usr/local/libexec/kuryr [kubernetes] api_root = http://172.24.0.34:8080 [neutron] auth_url = http://172.24.0.34/identity username = admin user_domain_name = Default password = admin project_name = service project_domain_name = Default auth_type = password [neutron_defaults] ovs_bridge = br-int pod_security_groups = {id_of_secuirity_group_for_pods} pod_subnet = {id_of_subnet_for_pods} project = {id_of_project} service_subnet = {id_of_subnet_for_k8s_services}
完成后执行 kuryr-k8s-controller:
$ kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf
安装 Kuryr-CNI
进入到172.24.0.80(node1)并且执行以下指令。
首先在节点安装所需要的套件:
$ sudo yum -y install gcc libffi-devel python-devel openssl-devel python-pip
然后安装 Kuryr-CNI 来提供给 kubelet 使用:
$ git clone http://git.openstack.org/openstack/kuryr-kubernetes $ sudo pip install -e kuryr-kubernetes
新增kuryr.conf至/etc/kuryr目录:
$ cd kuryr-kubernetes $ ./tools/generate_config_file_samples.sh $ sudo mkdir -p /etc/kuryr/ $ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf
修改/etc/kuryr/kuryr.conf档案,加入以下内容:
[DEFAULT] use_stderr = true bindir = /usr/local/libexec/kuryr [kubernetes] api_root = http://172.24.0.34:8080
建立 CNI bin 与 Conf 目录:
$ sudo mkdir -p /opt/cni/bin $ sudo ln -s $(which kuryr-cni) /opt/cni/bin/ $ sudo mkdir -p /etc/cni/net.d/
新增/etc/cni/net.d/10-kuryr.conf CNI 配置文件:
{ "cniVersion": "0.3.0", "name": "kuryr", "type": "kuryr-cni", "kuryr_conf": "/etc/kuryr/kuryr.conf", "debug": true }
完成后,更新 oslo 与 vif python 库:
$ sudo pip install 'oslo.privsep>=1.20.0' 'os-vif>=1.5.0'
最后重新启动相关服务:
sudo systemctl daemon-reload && systemctl restart kubelet.service
测试结果
我们这边开一个 Pod 与 OpenStack VM 来进行沟通: