Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811
OpenStack、K8s

整合 OpenStack 与 Kubernetes 网络

整合 OpenStack 与 Kubernetes 网络

1 目标

本文的目标是通过安装配置Kuryr-Kubernetes组件,实现OpenStack的网络和Kubernetes的网络整合,实现统一管理。
部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称IP地址备注
K8s-master192.168.4.100Master节点
K8s-node1192.168.4.101Node节点
K8s-node2192.168.4.103Node节点
Openstack-controller192.168.4.154控制节点、网络节点
Openstack-compute1192.168.4.155计算节点
Openstack-compute2192.168.4.156计算节点

表1:设备管理口IP及组件列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
服务器CPU:至少2核
内存:最低2
磁盘:不少于20G
6

表2:硬件环境

软件版本备注
操作系统Centos7.6安装时选择Compute Node 模式
OpenStackstein
Kubernetes1.18.0
DockerDocker-ce19.03
Etcd3.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 和 OpenStack独立部署网络集成
图1:Kubernetes 和 OpenStack独立部署网络集成
  • 第二种: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 通信。
运行在OpenStack之上的Kubernetes与OpenStack网络集成
图2:运行在OpenStack之上的Kubernetes与OpenStack网络集成

本文主要实现第一种集成。

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启动状态

验证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详细信息:
pod详细信息
  • 查看VM详细信息:
VM详细信息
  • 在VM上ping pod

6 参考资料

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

A-lab-云网络, A-lab-部署验证

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2