整合 OpenStack 与 Kubernetes 网络
整合 OpenStack 与 Kubernetes 网络
1 目标
本文的目标是通过安装配置Kuryr-Kubernetes组件,实现OpenStack的网络和Kubernetes的网络整合,实现统一管理。
部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:
部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:
设备名称 | IP地址 | 备注 |
---|---|---|
K8s-master | 192.168.4.100 | Master节点 |
K8s-node1 | 192.168.4.101 | Node节点 |
K8s-node2 | 192.168.4.103 | Node节点 |
Openstack-controller | 192.168.4.154 | 控制节点、网络节点 |
Openstack-compute1 | 192.168.4.155 | 计算节点 |
Openstack-compute2 | 192.168.4.156 | 计算节点 |
表1:设备管理口IP及组件列表
2 硬件与软件环境
部署环境中涉及到的硬件和软件如表2和表3所示:
名称 | 型号 | 硬件指标 | 数量 | 备注 |
---|---|---|---|---|
服务器 | CPU:至少2核 内存:最低2 磁盘:不少于20G | 6 |
表2:硬件环境
软件 | 版本 | 备注 |
---|---|---|
操作系统 | Centos7.6 | 安装时选择Compute Node 模式 |
OpenStack | stein | |
Kubernetes | 1.18.0 | |
Docker | Docker-ce19.03 | |
Etcd | 3.3.11 |
表3:软件环境
在整合之前,需要提前安装好OpenStack和Kubernetes。
3 Kuryr-Kubernetes简介
Kuryr-Kubernetes是一个用Python编写的OpenStack项目,它作为一个容器网络接口(CNI)插件,通过使用OpenStack Neutron和Octavia为Kubernetes pods提供网络。这个项目经过了实验阶段,成为OpenStack Queens版本(第17版)中完全支持的OpenStack生态系统项目。
Kuryr-Kubernetes的主要优点之一是不需要在OpenStack和Kubernetes中使用多个软件定义网络(SDN)进行网络管理。它还解决了在OpenStack云中运行Kubernetes集群时使用网络数据包双重封装的问题。使用Calico进行Kubernetes网络,使用Neutron进行Kubernetes集群的虚拟机(VM)网络。使用Kuryr-Kubernetes,只需使用一个sdn-Neutron,就可以为运行这些pod和vm提供连接。
还可以在裸机节点上运行Kuryr-Kubernetes作为普通的OpenStack服务。这样,可以在Kubernetes pod和OpenStack VM之间提供互连,即使这些集群是分开的,只需将Neutron-agent和Kuryr-Kubernetes放在Kubernetes节点上即可。
Kuryr-Kubernetes由三部分组成:
- kuryr-controller观察Kubernetes资源,决定如何将它们转换为OpenStack资源,并创建这些资源。有关OpenStack资源的信息将保存到相应Kubernetes资源的注释中。
- kuryr-cni是由CNI运行的可执行文件,它将调用传递给kuryr-daemon。
- kuryr-daemon应该在每个Kubernetes节点上运行。它监视在主机上创建的pod,当CNI请求进入时,根据pod注释中包含的Neutron端口连接pod。
Kuryr-Kubernetes 支持两种典型场景:
- 第一种:单独的 Kubernetes 集群 和 OpenStack环境,Kubernetes node 与 nova compute node 二层互通,在每个 Kubernetes node 上需要安装 neutron agent,实现 pod 与 vm 通信 。
- 第二种:Kubernetes 部署在vm中。即 OpenStack环境中创建 vm,在 vm 中安装 Kubernetes 集群,vm 中的 pod 与其他vm通信。典型的应用就是在 magnum 实现租户的 pod 能够访问自己vm。需要在 Kubernetes vm中安装Kuryr-controller 和Kuryr-cni,利用 neutron 的 trunk port 功能实现 vm中的 pod 跟 OpenStack环境中其他 vm 通信。
本文主要实现第一种集成。
4 安装步骤
4.1 K8s各节点安装Neutron agent组件
- 安装Neutron服务,并编辑配置文件。
[root@localhost ~]# yum -y install openstack-neutron-openvswitch ebtables ipset -y
[root@localhost ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
transport_url = rabbit://openstack:tera123@192.168.4.154
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.154:5000
auth_url = http://192.168.4.154:5000
memcached_servers = 192.168.4.154:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = tera123
[oslo_concurrency]
lock_path = $state_path/lock
[root@localhost ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
local_ip = 192.168.4.100
[agent]
tunnel_types = vxlan
l2_population = True
prevent_arp_spoofing = True
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
[root@localhost ~]# vi /etc/nova/nova.conf
[neutron]
url=http://192.168.4.154:9696
auth_type=password
auth_url=http://192.168.4.154:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name = default
password=tera123
region_name=RegionOne
- 启动Neutron服务
[root@localshot ~]# systemctl start neutron-openvswitch-agent
[root@localshot ~]# systemctl enable neutron-openvswitch-agent
- 验证Neutron网络服务(OpenStack控制节点)
验证Neutron agent启动状态
4.2 准备OpenStack中K8S所需项⽬、⽤户及⽹络信息
创建K8S所需资源可以在dashboard中进行,也可以直接通过命令行操作
- 创建K8S专⽤的项⽬,⽤户信息:
#openstack project create k8s
#openstack user create --password tera123 k8s-user
#openstack role add --project k8s --user k8s-user admin
- 在K8S项⽬下创建pod ⽹络⼦⽹及service ⽹络⼦⽹:
#openstack network create pod_network
#openstack network create service_network
#openstack subnet create --ip-version 4 --subnet-range 10.1.0.0/16 --network pod_network pod_subnet
#openstack subnet create --ip-version 4 --subnet-range 10.2.0.0/16 --network service_network service_subnet
pod-subnet和service-subnet的ip网段要分别跟k8s创建的时候初始化的pod-network-cidr和service-cidr一致
- 在K8S项⽬路由器连接pod⽹络⼦⽹与service⽹络⼦⽹:
#openstack router create k8s-router
#openstack router add subnet k8s-router pod_subnet
#openstack router add subnet k8s-router service_subnet
- 在K8S项⽬创建pod安全组:
#openstack security group create service_pod_access_sg
#openstack security group rule create --remote-ip 10.1.0.0/16 --ethertype IPv4 --protocol tcp service_pod_access_sg
#openstack security group rule create --remote-ip 10.2.0.0/16 --ethertype IPv4 --protocol tcp service_pod_access_sg
注意,这里的创建的project id,user name,password,pod subnet id,service subnet id,security group id均需要记录,用于后期配置kuryr controller。
4.3 kubeadm安装Kubernetes
以下操作在master节点和work 节点均执行。
- 关闭虚拟内存
#swapoff -a
#sed -i ‘s/.*swap.*/#&/’ /etc/fstab
- 配置转发参数
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
net.ipv4.ip_forward = 1
EOF
# sysctl --system
- 配置kubernetes阿里源
#cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
- 设置docker源
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
- 安装docker
#yum install docker-ce-19.03.12 -y
- 启动docker
# systemctl daemon-reload
# systemctl enable docker
# systemctl start docker
- 安装kubernetes相关组件
# yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 kubernetes-cni-0.8.6 -y
#systemctl enable kubelet && systemctl start kubelet
- 开启IPVS
加载ipvs内核,使node节点kube-proxy支持ipvs代理规则。
# modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
cat <<EOF >> /etc/rc.local
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
EOF
以下在Master节点操作
#kubeadm init --apiserver-advertise-address=192.168.4.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.2.0.0/16 --pod-network-cidr=10.1.0.0/16
装完后输出内容如下:
然后根据提示执行如下操作,并相关work节点加入。
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
以下在Work节点操作
使用在master节点安装成功后保存的hubedem join命令,添加node节点。
# kubeadm join 192.168.4.100:6443 --token x8cl7c.ev3xby1nad04aysi \
--discovery-token-ca-cert-hash sha256:d9c6234623e26f87d308d07433f0d6d82f62c783037dd74f522f6f3a0b3a88bc
- 安装flannel
下载kube-flannel.yml
内容如下
#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改几处地方:
“Network”: “10.244.0.0/16″, 改为”Network”: “10.1.0.0/16”,
在所有containers下面的args:添加- –iface=ens192 ,即出口网卡
然后执行
#kubectl apply -f kube-flannel.yml
- 安装dashboard
下载recommended.yaml
#wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
修改
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
spec添加type:NodePort
Ports添加nodePort: 30001
然后执行
#kubectl apply -f recommended.yaml
- 设置代理
为了方便让 Kuryr Controller 简单取得 K8s API Server
kubectl proxy --port=8080 --accept-hosts='.*' --address='0.0.0.0'
4.4 安装配置kur
- 安装kuryr-k8s-controller(k8s的master节点)
安装
#mkdir kuryr-k8s-controller
# cd kuryr-k8s-controller
# virtualenv env
# git clone https://git.openstack.org/openstack/kuryr-kubernetes -b stable/rocky
# . env/bin/activate
# pip install -e kuryr-kubernetes
如果始终无法编译通过,可以跳过. env/bin/activate,直接执行pip install -e kuryr-kubernetes
配置
#cd kuryr-kubernetes
# ./tools/generate_config_file_samples.sh
# mkdir /etc/kuryr
# cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf
这里需要修改配置文件kuryr.conf。具体配置项需根据上文中在openstack内创建的用于K8S环境的信息填写。
[DEFAULT]
use_stderr = true
bindir = /usr/libexec/kuryr
[kubernetes]
api_root = http://192.168.4.100:8080
[neutron]
# 需根据上文章节中创建的项目、用户信息填写
auth_url = http://192.168.4.154:5000/v3
username = k8s-user
user_domain_name = Default
password = tera123
project_name = k8s
project_domain_name = Default
auth_type = password
[neutron_defaults]
ovs_bridge = br-int
# 下面的网络资源ID需根据上文章节中创建的资源ID填写
pod_security_groups = 2d572ef8-2e90-4a5b-a515-9e32fe07a7c4
pod_subnet = f3c34801-6da3-43b9-a2bf-947c7da4ed89
project = 02461bcb1d5f490ca4fdb99b7a32914e
service_subnet = b15f4105-3f12-4976-a83a-d2174a42622a
运行
#kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf -d
- 安装kuryr-cni
安装
需提前安装gcc pip python-devel
# mkdir kuryr-k8s-cni
#cd kuryr-k8s-cni
#virtualenv env
#. env/bin/activate
#git clone https://git.openstack.org/openstack/kuryr-kubernetes -b stable/rocky
#pip install -e kuryr-kubernetes
如果始终无法编译通过,可以跳过. env/bin/activate,直接执行pip install -e kuryr-kubernetes
配置
#cd kuryr-kubernetes
#./tools/generate_config_file_samples.sh
#mkdir /etc/kuryr
#cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf
此处需要修改配置文件kuryr.conf。
[DEFAULT]
use_stderr = true
bindir = /usr/libexec/kuryr
lock_path=/var/lib/kuryr/tmp
[kubernetes]
# 填k8s master的IP
api_root = http://192.168.4.100:8080
- 修改cni配置
执行下述命令。
#mkdir -p /opt/cni/bin
#ln -s $(which kuryr-cni) /opt/cni/bin/
由于前文安装k8s时已经安装过flannel,这里/opt/cni/bin目录已经存在。新增/etc/cni/net.d/10-kuryr.conf文件,按如下信息。
修改配置文件,同时删除同目录下flannel的配置文件。
{
“cniVersion”: “0.3.1”,
“name”: “kuryr”,
“type”: “kuryr-cni”,
“kuryr_conf”: “/etc/kuryr/kuryr.conf”,
“debug”: true
}
运行
# kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d
5 结果验证
在OpenStack创建一个VM,挂载到pod_network下面,在k8s运行一个测试示例,创建一个Nginx,看是否可以相互ping通:
- 创建nginx.yaml
[root@k8s-master~]#vi nginx.yaml
# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
# Kind 的名称
name: nginx-app
spec:
selector:
matchLabels:
# 容器标签的名字,发布 Service 时,selector 需要和这里对应
app: nginx
# 部署的实例数量
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
# 配置容器,数组类型,说明可以配置多个容器
containers:
# 容器名称
- name: nginx
# 容器镜像
image: nginx:1.17
# 只有镜像不存在时,才会进行镜像拉取
imagePullPolicy: IfNotPresent
ports:
# Pod 端口
- containerPort: 80
- 创建pods:
[root@k8s-master~]#kubectl apply -f nginx.yaml
- 查看pod详细信息:
- 查看VM详细信息:
- 在VM上ping pod
6 参考资料
如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com