利用 Kuryr 整合 OpenStack 与 Kubernetes 网络

简介: Kubernetes Kuryr 是 OpenStack Neutron 的子项目,其主要目标是通过该项目来整合 OpenStack 与 Kubernetes 的网络。该项目在 Kubernetes 中实作了原生 Neutron-based 的网络,因此使用 Kuryr-Kubernetes 可以让你的 OpenStack VM 与 Kubernetes Pods 能够选择在同一个子网上运作,并且能够使用 Neutron 的 L3 与 Security Group 来对网络进行路由,以及阻挡特定来源 Port。

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


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

  1. Kuryr Controller:
    Controller 主要目的是监控 Kubernetes API 的来获取 Kubernetes 资源的变化,然后依据 Kubernetes 资源的需求来执行子资源的分配和资源管理。
  2. 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,并执行以下步骤。

  1. 新增 K8s project。
  2. 修改 K8s project member 加入到 service project。
  3. 在该 Project 中新增 Security Groups,参考kuryr-kubernetes manually
  4. 在该 Project 中新增 pod_subnet 子网。
  5. 在该 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 来进行沟通:

本文转自kubernetes中文社区- 利用 Kuryr 整合 OpenStack 与 Kubernetes 网络

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
运维 Kubernetes 前端开发
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
本文深入探讨了Kubernetes网络观测的挑战与eBPF技术的应用。首先分析了传统工具在数据碎片化、上下文缺失和性能瓶颈上的局限性,接着阐述了eBPF通过零拷贝观测、全链路关联和动态过滤等特性带来的优势。文章进一步解析了eBPF观测架构的设计与实现,包括关键数据结构、内核探针部署及生产环境拓扑。实战部分展示了如何构建全栈观测系统,并结合NetworkPolicy验证、跨节点流量分析等高级场景,提供具体代码示例。最后,通过典型案例分析和性能数据对比,验证了eBPF方案的有效性,并展望了未来演进方向,如智能诊断系统与Wasm集成。
341 1
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
Kubernetes 负载均衡 网络安全
Kubernetes 网络模型与实践
【8月更文第29天】Kubernetes(K8s)是当今容器编排领域的佼佼者,它提供了一种高效的方式来管理容器化应用的部署、扩展和运行。Kubernetes 的网络模型是其成功的关键因素之一,它支持服务发现、负载均衡和集群内外通信等功能。本文将深入探讨 Kubernetes 的网络模型,并通过实际代码示例来展示服务发现和服务网格的基本概念及其实现。
623 3
|
10月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
397 12
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
536 2
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
402 3
Kubernetes网络插件体系及flannel基础
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
1074 7
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
4077 2
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
683 0
|
Kubernetes Cloud Native 网络安全
云原生入门指南:Kubernetes和容器化技术云计算与网络安全:技术融合的新篇章
【8月更文挑战第30天】在云计算的浪潮中,云原生技术如Kubernetes已成为现代软件部署的核心。本文将引导读者理解云原生的基本概念,探索Kubernetes如何管理容器化应用,并展示如何通过实践加深理解。

热门文章

最新文章

推荐镜像

更多