首页 文章 精选 留言 我的

精选列表

搜索[后端],共10004篇文章
优秀的个人博客,低调大师

后端技术杂谈7:OpenStack的基石KVM

Qemu,KVM,Virsh傻傻的分不清 当你安装了一台Linux,想启动一个KVM虚拟机的时候,你会发现需要安装不同的软件,启动虚拟机的时候,有多种方法: virsh start kvm命令 qemu命令 qemu-kvm命令 qemu-system-x86_64命令 这些之间是什么关系呢?请先阅读上一篇《白话虚拟化技术》 有了上一篇的基础,我们就能说清楚来龙去脉。 KVM(Kernel-based Virtual Machine的英文缩写)是内核内建的虚拟机。有点类似于 Xen ,但更追求更简便的运作,比如运行此虚拟机,仅需要加载相应的 kvm 模块即可后台待命。和 Xen 的完整模拟不同的是,KVM 需要芯片支持虚拟化技术(英特尔的 VT 扩展或者 AMD 的 AMD-V 扩展)。 首先看qemu,其中关键字emu,全称emulator,模拟器,所以单纯使用qemu是采用的完全虚拟化的模式。 Qemu向Guest OS模拟CPU,也模拟其他的硬件,GuestOS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。由于所有的指令都要从Qemu里面过一手,因而性能比较差 按照上一次的理论,完全虚拟化是非常慢的,所以要使用硬件辅助虚拟化技术Intel-VT,AMD-V,所以需要CPU硬件开启这个标志位,一般在BIOS里面设置。查看是否开启 对于Intel CPU 可用命令 grep "vmx" /proc/cpuinfo 判断 对于AMD CPU 可用命令 grep "svm" /proc/cpuinfo 判断 当确认开始了标志位之后,通过KVM,GuestOS的CPU指令不用经过Qemu转译,直接运行,大大提高了速度。 所以KVM在内核里面需要有一个模块,来设置当前CPU是Guest OS在用,还是Host OS在用。 查看内核模块中是否含有kvm, ubuntu默认加载这些模块 KVM内核模块通过/dev/kvm暴露接口,用户态程序可以通过ioctl来访问这个接口,例如书写下面的程序 Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做,就是qemu-kvm (qemu-system-XXX) Qemu-kvm对kvm的整合从release_0_5_1开始有branch,在1.3.0正式merge到master qemu和kvm整合之后,CPU的性能问题解决了,另外Qemu还会模拟其他的硬件,如Network, Disk,同样全虚拟化的方式也会影响这些设备的性能。 于是qemu采取半虚拟化或者类虚拟化的方式,让Guest OS加载特殊的驱动来做这件事情。 例如网络需要加载virtio_net,存储需要加载virtio_blk,Guest需要安装这些半虚拟化驱动,GuestOS知道自己是虚拟机,所以数据直接发送给半虚拟化设备,经过特殊处理,例如排队,缓存,批量处理等性能优化方式,最终发送给真正的硬件,一定程度上提高了性能。 至此整个关系如下: qemu-kvm会创建Guest OS,当需要执行CPU指令的时候,通过/dev/kvm调用kvm内核模块,通过硬件辅助虚拟化方式加速。如果需要进行网络和存储访问,则通过类虚拟化或者直通Pass through的方式,通过加载特殊的驱动,加速访问网络和存储资源。 然而直接用qemu或者qemu-kvm或者qemu-system-xxx的少,大多数还是通过virsh启动,virsh属于libvirt工具,libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API,可不止管理KVM。 Libvirt分服务端和客户端,Libvirtd是一个daemon进程,是服务端,可以被本地的virsh调用,也可以被远程的virsh调用,virsh相当于客户端。 Libvirtd调用qemu-kvm操作虚拟机,有关CPU虚拟化的部分,qemu-kvm调用kvm的内核模块来实现 这下子,整个相互关系才搞清楚了。 虽然使用virsh创建虚拟机相对简单,但是为了探究虚拟机的究竟如何使用,下一次,我们来解析一下如何裸使用qemu-kvm来创建一台虚拟机,并且能上网。 如果搭建使用过vmware桌面版或者virtualbox桌面版,创建一个能上网的虚拟机非常简单,但是其实背后做了很多事情,下一次我们裸用qemu-kvm,全部使用手工配置,看创建虚拟机都做了哪些事情。 本章节我们主要介绍通过VMware技术虚拟出相关的Linux软件环境,在Linux系统中,安装KVM虚拟化软件,实实在在的去实践一下KVM到底是一个什么样的技术? Kvm虚拟化技术实践 VMware虚拟机支持Kvm虚拟化技术? 在VMware创建的虚拟机中,默认不支持Kvm虚拟化技术,需要芯片级的扩展支持,幸好VMware提供完整的解决方案,可以通过修改虚拟化引擎。 VMware软件版本信息,VMware® Workstation 11.0.0 build-2305329 首先,你需要启动VMware软件,新建一个CentOS 6.x类型的虚拟机,正常安装完成,这个虚拟机默认的虚拟化引擎,首选模式为”自动”。 如果想让我们的VMware虚拟化出来的CentOS虚拟机支持KVM虚拟化,我们需要修改它支持的虚拟化引擎,打开新建的虚拟机,虚拟机状态必须处于关闭状态,通过双击编辑虚拟机设置>硬件,选择处理器菜单,右边会出现虚拟化引擎区域,选择首选模式为Intel Tv-x/EPT或AMD-V/RVI,接下来勾选虚拟化Intel Tv-x/EPT或AMD-V/RVI(v),点击确定。 KVM需要虚拟机宿主(host)的处理器带有虚拟化支持(对于Intel处理器来说是VT-x,对于AMD处理器来说是AMD-V)。你可以通过以下命令来检查你的处理器是否支持虚拟化: grep --color -E '(vmx|svm)' /proc/cpuinfo 如果运行后没有显示,那么你的处理器不支持硬件虚拟化,你不能使用KVM。 注意: 如果是硬件服务器,您可能需要在BIOS中启用虚拟化支持,参考Private Cloud personal workstation 安装Kvm虚拟化软件 安装kvm虚拟化软件,我们需要一个Linux操作系统环境,这里我们选择的Linux版本为CentOS release 6.8 (Final),在这个VMware虚拟化出来的虚拟机中安装kvm虚拟化软件,具体步骤如下: 首选安装epel源 sudo rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm 安装kvm虚拟化软件 sudo yum install qemu-kvm qeum-kvm-tools virt-manager libvirt 启动kvm虚拟化软件 sudo /etc/init.d/libvirtd start 启动成功之后你可以通过/etc/init.d/libvirtd status查看启动状态,这个时候,kvm会自动生成一个本地网桥virbr0,可以通过命令查看他的详细信息 # ifconfig virbr0 virbr0 Link encap:Ethernet HWaddr 52:54:00:D7:23:AD inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) KVM默认使用NAT网络模式。虚拟机获取一个私有 IP(例如 192.168.122.0/24 网段的),并通过本地主机的NAT访问外网。 # brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400d723ad yes virbr0-nic 创建一个本地网桥virbr0,包括两个端口:virbr0-nic 为网桥内部端口,vnet0 为虚拟机网关端口(192.168.122.1)。 虚拟机启动后,配置 192.168.122.1(vnet0)为网关。所有网络操作均由本地主机系统负责。 DNS/DHCP的实现,本地主机系统启动一个 dnsmasq 来负责管理。 ps aux|grep dnsmasq 注意:启动libvirtd之后自动启动iptables,并且写上一些默认规则。 # iptables -nvL -t nat Chain PREROUTING (policy ACCEPT 304 packets, 38526 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 7 packets, 483 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24 Chain OUTPUT (policy ACCEPT 7 packets, 483 bytes) pkts bytes target prot opt in out source destination kvm创建虚拟机 上传一个镜像文件:CentOS-6.6-x86_64-bin-DVD1.iso 通过qemu创建一个raw格式的文件(注:QEMU使用的镜像文件:qcow2与raw,它们都是QEMU(KVM)虚拟机使用的磁盘文件格式),大小为5G。 qemu-img create -f raw /data/Centos-6.6-x68_64.raw 5G 查看创建的raw磁盘格式文件信息 qemu-img info /data/Centos-6.6-x68_64.raw image: /data/Centos-6.6-x68_64.raw file format: raw virtual size: 5.0G (5368709120 bytes) disk size: 0 启动,kvm虚拟机,进行操作系统安装 virt-install --virt-type kvm --name CentOS-6.6-x86_64 --ram 512 --cdrom /data/CentOS-6.6-x86_64-bin-DVD1.iso --disk path=/data/Centos-6.6-x68_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole 启动之后,通过命令查看启动状态,默认会在操作系统开一个5900的端口,可以通过虚拟机远程管理软件vnc客户端连接,然后可视化的方式安装操作系统。 # netstat -ntlp|grep 5900 tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 2504/qemu-kvm 注意:kvm安装的虚拟机,不确定是那一台,在后台就是一个进程,每增加一台端口号+1,第一次创建的为5900! 虚拟机远程管理软件 我们可以使用虚拟机远程管理软件VNC进行操作系统的安装,我使用过的两款不错的虚拟机远程管理终端软件,一个是Windows上使用,一个在Mac上为了方便安装一个Google Chrome插件后即可开始使用,软件信息Tightvnc或者VNC@Viewerfor Google Chrome 如果你和我一样使用的是Google Chrome提供的VNC插件,使用方式,在Address输入框中输入,宿主机IP:59000,Picture Quality选择框使用默认选项,点击Connect进入到安装操作系统的界面,你可以安装常规的方式进行安装,等待系统安装完成重启,然后就可以正常使用kvm虚拟化出来的操作系统了。 Tightvnc软件的使用,请参考官方手册。 Tightvnc下载地址:www.tightvnc.com/download.ph… Tightvnc下载地址:www.tightvnc.com/download/2.… Tightvnc下载地址:www.tightvnc.com/download/2.… KVM虚拟机管理 kvm虚拟机是通过virsh命令进行管理的,libvirt是Linux上的虚拟化库,是长期稳定的C语言API,支持KVM/QEMU、Xen、LXC等主流虚拟化方案。链接:libvirt.org/ virsh是Libvirt对应的shell命令。 查看所有虚拟机状态 virsh list --all 启动虚拟机 virsh start [NAME] 列表启动状态的虚拟机 virsh list 常用命令查看virsh --help|more less libvirt虚拟机配置文件 虚拟机libvirt配置文件在/etc/libvirt/qemu路径下,生产中我们需要去修改它的网络信息。 # ll total 8 -rw-------. 1 root root 3047 Oct 19 2016 Centos-6.6-x68_64.xml drwx------. 3 root root 4096 Oct 17 2016 networks 注意:不能直接修改xml文件,需要通过提供的命令! virsh edit Centos-6.6-x68_64 kvm三种网络类型,桥接、NAT、仅主机模式,默认NAT模式,其他机器无法登陆,生产中一般选择桥接。 监控kvm虚拟机 安装软件监控虚拟机 yum install virt-top -y 查看虚拟机资源使用情况 virt-top virt-top 23:46:39 - x86_64 1/1CPU 3392MHz 3816MB 1 domains, 1 active, 1 running, 0 sleeping, 0 paused, 0 inactive D:0 O:0 X:0 CPU: 5.6% Mem: 2024 MB (2024 MB by guests) ID S RDRQ WRRQ RXBY TXBY %CPU %MEM TIME NAME 1 R 0 1 52 0 5.6 53.0 5:16.15 centos-6.8 KVM修改NAT模式为桥接[案例] 在开始案例之前,需要知道的必要信息,宿主机IP是192.168.2.200,操作系统版本Centos-6.6-x68_64。 启动虚拟网卡 ifup eth0 这里网卡是NAT模式,可以上网,ping通其他机器,但是其他机器无法登陆! 宿主机查看网卡信息 brctl show ifconfig virbr0 ifconfig vnet0 实现网桥,在kvm宿主机完成 步骤1,创建一个网桥,新建网桥连接到eth0,删除eth0,让新的网桥拥有eth0的ip brctl addbr br0 #创建一个网桥 brctl show #显示网桥信息 brctl addif br0 eth0 && ip addr del dev eth0 192.168.2.200/24 && ifconfig br0 192.168.2.200/24 up brctl show #查看结果 ifconfig br0 #验证br0是否成功取代了eth0的IP 注意: 这里的IP地址为宿主机ip 修改虚拟机桥接到br0网卡,在宿主机修改 virsh list --all ps aux |grep kvm virsh stop Centos-6.6-x68_64 virsh list --all 修改虚拟机桥接到宿主机,修改52行type为bridge,第54行bridge为br0 # virsh edit Centos-6.6-x68_64 # 命令 52 <interface type='network'> 53 <mac address='52:54:00:2a:2d:60'/> 54 <source network='default'/> 55 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> 56 </interface> 修改为: 52 <interface type='bridge'> 53 <mac address='52:54:00:2a:2d:60'/> 54 <source bridge='br0'/> 55 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> 56 </interface> 启动虚拟机,看到启动前后,桥接变化,vnet0被桥接到了br0 启动前: # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29f824c9 no eth0 virbr0 8000.525400353d8e yes virbr0-nic 启动后: # virsh start CentOS-6.6-x86_64 Domain CentOS-6.6-x86_64 started # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29f824c9 no eth0 vnet0 virbr0 8000.525400353d8e yes virbr0-nic Vnc登陆后,修改ip地址,看到dhcp可以使用,被桥接到现有的ip段,ip是自动获取,而且是和宿主机在同一个IP段. # ifup eth0 从宿主机登陆此服务器,可以成功。 # ssh 192.168.2.108 root@192.168.2.108's password: Last login: Sat Jan 30 12:40:28 2016 从同一网段其他服务器登陆此虚拟机,也可以成功,至此让kvm管理的服务器能够桥接上网就完成了,在生产环境中,桥接上网是非常必要的。 总结 通过kvm相关的命令来创建虚拟机,安装和调试是非常必要的,因为现有的很多私有云,公有云产品都使用到了kvm这样的技术,学习基本的kvm使用对维护openstack集群有非常要的作用,其次所有的openstack image制作也得通过kvm这样的底层技术来完成,最后上传到openstack的镜像管理模块,才能开始通过openstack image生成云主机。 到此,各位应该能够体会到,其实kvm是一个非常底层和核心的虚拟化技术,而openstack就是对kvm这样的技术进行了一个上层封装,可以非常方便,可视化的操作和维护kvm虚拟机,这就是现在牛上天的云计算技术最底层技术栈,具体怎么实现请看下图。 如上图,没有openstack我们依然可以通过,libvirt来对虚拟机进行操作,只不过比较繁琐和难以维护。通过openstack就可以非常方便的进行底层虚拟化技术的管理、维护、使用。 原创文章,转载请注明: 转载自Itweet的博客 微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源) ​

优秀的个人博客,低调大师

后端技术杂谈8:OpenStack架构设计

OpenStack 是开源云计算平台,支持多种虚拟化环境,并且其服务组件都提供了API接口便于二次开发。 OpenStack通过各种补充服务提供基础设施即服务 Infrastructure-as-a-Service (IaaS)的解决方案。每个服务都提供便于集成的应用程序接口Application Programming Interface (API)。 openstack 逻辑架构图 OpenStack 本身是一个分布式系统,不但各个服务可以分布部署,服务中的组件也可以分布部署。 这种分布式特性让 OpenStack 具备极大的灵活性、伸缩性和高可用性。 当然从另一个角度讲,这也使得 OpenStack 比一般系统复杂,学习难度也更大。 后面章节我们会深入学习 Keystone、Glance、Nova、Neutron 和 Cinder 这几个 OpenStack 最重要最核心的服务。 openstack的核心和扩展的主要项目如下: OpenStack Compute (code-name Nova) 计算服务 OpenStack Networking (code-name Neutron) 网络服务 OpenStack Object Storage (code-name Swift) 对象存储服务 OpenStack Block Storage (code-name Cinder) 块设备存储服务 OpenStack Identity (code-name Keystone) 认证服务 OpenStack Image Service (code-name Glance) 镜像文件服务 OpenStack Dashboard (code-name Horizon) 仪表盘服务 OpenStack Telemetry (code-name Ceilometer) 告警服务 OpenStack Orchestration (code-name Heat) 流程服务 OpenStack Database (code-name Trove) 数据库服务 OpenStack的各个服务之间通过统一的REST风格的API调用,实现系统的松耦合。上图是OpenStack各个服务之间API调用的概览,其中实线代表client 的API调用,虚线代表各个组件之间通过rpc调用进行通信。松耦合架构的好处是,各个组件的开发人员可以只关注各自的领域,对各自领域的修改不会影响到其他开发人员。不过从另一方面来讲,这种松耦合的架构也给整个系统的维护带来了一定的困难,运维人员要掌握更多的系统相关的知识去调试出了问题的组件。所以无论对于开发还是维护人员,搞清楚各个组件之间的相互调用关系是怎样的都是非常必要的。 对Linux经验丰富的OpenStack新用户,使用openstack是非常容易的,在后续openstack系列文章中会逐步展开介绍。 OpenStack 项目和组件 OpenStack services Dashboard 【Horizon】 提供了一个基于web的自服务门户,与OpenStack底层服务交互,诸如启动一个实例,分配IP地址以及配置访问控制。 Compute 【Nova】 在OpenStack环境中计算实例的生命周期管理。按需响应包括生成、调度、回收虚拟机等操作。 Networking 【Neutron】 确保为其它OpenStack服务提供网络连接即服务,比如OpenStack计算。为用户提供API定义网络和使用。基于插件的架构其支持众多的网络提供商和技术。 Object Storage 【Swift】 通过一个 RESTful,基于HTTP的应用程序接口存储和任意检索的非结构化数据对象。它拥有高容错机制,基于数据复制和可扩展架构。它的实现并像是一个文件服务器需要挂载目录。在此种方式下,它写入对象和文件到多个硬盘中,以确保数据是在集群内跨服务器的多份复制。 Block Storage 【Cinder】 为运行实例而提供的持久性块存储。它的可插拔驱动架构的功能有助于创建和管理块存储设备。 Identity service 【Keystone】 为其他OpenStack服务提供认证和授权服务,为所有的OpenStack服务提供一个端点目录。 Image service 【Glance】 存储和检索虚拟机磁盘镜像,OpenStack计算会在实例部署时使用此服务。 Telemetry服务 【Ceilometer】 为OpenStack云的计费、基准、扩展性以及统计等目的提供监测和计量。 Orchestration服务 【Heat服务】 Orchestration服务支持多样化的综合的云应用,通过调用OpenStack-native REST API和CloudFormation-compatible Query API,支持HOT <Heat Orchestration Template (HOT)>格式模板或者AWS CloudFormation格式模板 通过对这些组件的介绍,可以帮助我们在后续的内容中,了解各个组件的作用,便于排查问题,而在你对基础安装,配置,操作和故障诊断熟悉之后,你应该考虑按照生产架构来进行部署。 生产部署架构 建议使用自动化部署工具,例如Ansible, Chef, Puppet, or Salt来自动化部署,管理生产环境。 这个示例架构需要至少2个(主机)节点来启动基础服务virtual machine <virtual machine (VM)>或者实例。像块存储服务,对象存储服务这一类服务还需要额外的节点。 网络代理驻留在控制节点上而不是在一个或者多个专用的网络节点上。 私有网络的覆盖流量通过管理网络而不是专用网络 控制器 控制节点上运行身份认证服务,镜像服务,计算服务的管理部分,网络服务的管理部分,多种网络代理以及仪表板。也需要包含一些支持服务,例如:SQL数据库,term:消息队列, and NTP。 可选的,可以在计算节点上运行部分块存储,对象存储,Orchestration 和 Telemetry 服务。 计算节点上需要至少两块网卡。 计算 计算节点上运行计算服务中管理实例的管理程序部分。默认情况下,计算服务使用 KVM。 你可以部署超过一个计算节点。每个结算节点至少需要两块网卡。 块设备存储 可选的块存储节点上包含了磁盘,块存储服务和共享文件系统会向实例提供这些磁盘。 为了简单起见,计算节点和本节点之间的服务流量使用管理网络。生产环境中应该部署一个单独的存储网络以增强性能和安全。 你可以部署超过一个块存储节点。每个块存储节点要求至少一块网卡。 对象存储 可选的对象存储节点包含了磁盘。对象存储服务用这些磁盘来存储账号,容器和对象。 为了简单起见,计算节点和本节点之间的服务流量使用管理网络。生产环境中应该部署一个单独的存储网络以增强性能和安全。 这个服务要求两个节点。每个节点要求最少一块网卡。你可以部署超过两个对象存储节点。 网络 openstack网络是非常复杂的,并且也支持多种模式其中支持GRE,VLAN,VXLAN等,在openstack中网络是通过一个组件Neutron提供服务,Neutron 管理的网络资源包括如下。 network 是一个隔离的二层广播域。Neutron 支持多种类型的 network,包括 local, flat, VLAN, VxLAN 和 GRE。 local 网络与其他网络和节点隔离。local 网络中的 instance 只能与位于同一节点上同一网络的 instance 通信,local 网络主要用于单机测试。 flat 网络是无 vlan tagging 的网络。flat 网络中的 instance 能与位于同一网络的 instance 通信,并且可以跨多个节点。 vlan 网络是具有 802.1q tagging 的网络。vlan 是一个二层的广播域,同一 vlan 中的 instance 可以通信,不同 vlan 只能通过 router 通信。vlan 网络可以跨节点,是应用最广泛的网络类型。 vxlan 是基于隧道技术的 overlay 网络。vxlan 网络通过唯一的 segmentation ID(也叫 VNI)与其他 vxlan 网络区分。vxlan 中数据包会通过 VNI 封装成 UPD 包进行传输。因为二层的包通过封装在三层传输,能够克服 vlan 和物理网络基础设施的限制。 gre 是与 vxlan 类似的一种 overlay 网络。主要区别在于使用 IP 包而非 UDP 进行封装。 不同 network 之间在二层上是隔离的。以 vlan 网络为例,network A 和 network B 会分配不同的 VLAN ID,这样就保证了 network A 中的广播包不会跑到 network B 中。当然,这里的隔离是指二层上的隔离,借助路由器不同 network 是可能在三层上通信的。network 必须属于某个 Project( Tenant 租户),Project 中可以创建多个 network。 network 与 Project 之间是 1对多关系。 subnet 是一个 IPv4 或者 IPv6 地址段。instance 的 IP 从 subnet 中分配。每个 subnet 需要定义 IP 地址的范围和掩码。 port 可以看做虚拟交换机上的一个端口。port 上定义了 MAC 地址和 IP 地址,当 instance 的虚拟网卡 VIF(Virtual Interface) 绑定到 port 时,port 会将 MAC 和 IP 分配给 VIF。port 与 subnet 是 1对多 关系。一个 port 必须属于某个 subnet;一个 subnet 可以有多个 port。 如上图所示,为VLAN模式下,网络节点的通信方式。 在我们后续实施安装的时候,选择使用VXLAN网络模式,下面我们来重点介绍一下VXLAN模式。 VXLAN网络模式,可以隔离广播风暴,不需要交换机配置chunk口,解决了vlan id个数限制,解决了gre点对点隧道个数过多问题,实现了大2层网络,可以让vm在机房之间无缝迁移,便于跨机房部署。缺点是,vxlan增加了ip头部大小,需要降低vm的mtu值,传输效率上会略有下降。 涉及的 Linux 网络技术 Neutron 的设计目标是实现“网络即服务”,为了达到这一目标,在设计上遵循了基于“软件定义网络”实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术。理解了 Linux 系统上的这些概念将有利于快速理解 Neutron 的原理和实现。 bridge:网桥,Linux中用于表示一个能连接不同网络设备的虚拟设备,linux中传统实现的网桥类似一个hub设备,而ovs管理的网桥一般类似交换机。 br-int:bridge-integration,综合网桥,常用于表示实现主要内部网络功能的网桥。 br-ex:bridge-external,外部网桥,通常表示负责跟外部网络通信的网桥。 GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的gre,即original pkt/GRE/IP/Ethernet VETH:虚拟ethernet接口,通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。 qvb:neutron veth, Linux Bridge-side qvo:neutron veth, OVS-side TAP设备:模拟一个二层的网络设备,可以接受和发送二层网包。 TUN设备:模拟一个三层的网络设备,可以接受和发送三层网包。 iptables:Linux 上常见的实现安全策略的防火墙软件。 Vlan:虚拟 Lan,同一个物理 Lan 下用标签实现隔离,可用标号为1-4094。 VXLAN:一套利用 UDP 协议作为底层传输协议的 Overlay 实现。一般认为作为 VLan 技术的延伸或替代者。 namespace:用来实现隔离的一套机制,不同 namespace 中的资源之间彼此不可见。 总结 openstack是一个非法复杂的分布式软件,涉及到很多底层技术,我自己对一些网络的理解也是非常有限,主要还是应用层面的知识,所以本章内容写的比较浅显一些,有问题请留言?在下一章节我们会进入生产环境如何实施规划openstack集群,至于openstack底层的技术,我也没有很深入研究,如果有任何不恰当的地方可以进行留言,非常感谢! 微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源) ​

优秀的个人博客,低调大师

微信小程序+java后端整合笔记

用到的工具和技术. 1.微信web开发工具小程序版 2.Myeclipse 2014 3.WebSocket 4.Maven 3.3.9 5.Tomcat 7 步骤 1.安装配置Maven,使用Myeclipse创建web project 使用Maven项目结构. 具体步骤:点击打开链接 2.打开微信web开发工具,由于是内部开发测试,故不要填写 appID, 创建新项目,把项目放在Maven项目目录下 src/main/webapp/项目名 3.创建Websocket 实现握手通信. 以下代码均来自网络资料. java服务器端: [javascript] view plain copy packagewebsocketTest; importjava.io.IOException; importjava.util.concurrent.CopyOnWriteArraySet; importjavax.websocket.*; importjavax.websocket.server.ServerEndpoint; /** *@ServerEndpoint注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, *注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端 */ @ServerEndpoint("/websocket") publicclassTestWebSocket{ //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 privatestaticintonlineCount=0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 privatestaticCopyOnWriteArraySet<TestWebSocket>webSocketSet=newCopyOnWriteArraySet<TestWebSocket>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 privateSessionsession; /** *连接建立成功调用的方法 *@paramsession可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen publicvoidonOpen(Sessionsession){ this.session=session; webSocketSet.add(this);//加入set中 addOnlineCount();//在线数加1 System.out.println("有新连接加入!当前在线人数为"+getOnlineCount()); } /** *连接关闭调用的方法 */ @OnClose publicvoidonClose(){ webSocketSet.remove(this);//从set中删除 subOnlineCount();//在线数减1 System.out.println("有一连接关闭!当前在线人数为"+getOnlineCount()); } /** *收到客户端消息后调用的方法 *@parammessage客户端发送过来的消息 *@paramsession可选的参数 */ @OnMessage publicvoidonMessage(Stringmessage,Sessionsession){ System.out.println("来自客户端的消息:"+message); //群发消息 for(TestWebSocketitem:webSocketSet){ try{ item.sendMessage(message); }catch(IOExceptione){ e.printStackTrace(); continue; } } } /** *发生错误时调用 *@paramsession *@paramerror */ @OnError publicvoidonError(Sessionsession,Throwableerror){ System.out.println("发生错误"); error.printStackTrace(); } /** *这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 *@parammessage *@throwsIOException */ publicvoidsendMessage(Stringmessage)throwsIOException{ this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); } publicstaticsynchronizedintgetOnlineCount(){ returnonlineCount; } publicstaticsynchronizedvoidaddOnlineCount(){ TestWebSocket.onlineCount++; } publicstaticsynchronizedvoidsubOnlineCount(){ TestWebSocket.onlineCount--; } } [javascript] view plain copy 微信小程序客户端: [javascript] view plain copy <prename="code"class="javascript">varapp=getApp() Page({ onLoad:function(){ wx.connectSocket({ url:"ws://localhost:8080/TestYMG/websocket", }) wx.onSocketOpen(function(){ console.log('WebSocket连接已经打开!') wx.sendSocketMessage({ data:'HELLO,WORLD'+Math.random()*0XFFFFFF.toString() }) }); wx.onSocketMessage(function(data){ console.log(data); });</pre><prename="code"class="javascript">//监听是否关闭 wx.onSocketClose(function(){ console.log('WebSocket连接已经关闭!') }); },</pre><prename="code"class="javascript">//手动关闭连接 setclose:function(e){ console.log('WebSocket连接正在关闭!') wx.closeSocket(); } }) </pre><br> <p></p> <pre></pre> <p></p> 原文地址http://www.bieryun.com/671.html

优秀的个人博客,低调大师

Laravel Vue 前后端分离 使用token认证

在做前后台分离的项目中,认证是必须的,由于http是无状态的。前台用户登录成功后,后台给前台返回token。之后前台给后台发请求每次携带token。 原理也非常简单: 前天在请求头中添加 Authorization,如下 image.png 后台取到值,然后去用户表的api_token列进行匹配,如果查到说明验证成功,并且返回相关信息。 Laravel本身自带几种验证方式,下面介绍下token认证的实现的方法。 前台在向后台发起请求时要携带一个token 后台需要做一个返回当前登录用户的信息的api,地址是 /api/user 先添加路由,当给 route/api.php 添加 Route::middleware('auth:api')->get('/user', function (Request $request) { echo $request->user(); }); 如果浏览器直接访问 http://mydomain.com/api/user 会返回 401 Unauthorized 原因是在config/auth.php中有下面的关键配置 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ], 可以看到通过api访问走的是token认证,这里没有提供token所以就认证失败返回401了。 'driver' => 'token' 实际调用的是\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php 上面说到我们需要在request里提供api_token参数,为了区别是哪个用户,需要在user表添加api_token字段 image.png 认证过程调用的是getTokenForRequest方法 public function getTokenForRequest() { $token = $this->request->query($this->inputKey); if (empty($token)) { $token = $this->request->input($this->inputKey); } if (empty($token)) { $token = $this->request->bearerToken(); } if (empty($token)) { $token = $this->request->getPassword(); } return $token; } 这个bearerToken实际找header中是否存在Authorization public function bearerToken() { $header = $this->header('Authorization', ''); if (Str::startsWith($header, 'Bearer ')) { return Str::substr($header, 7); } } 先给user表添加api_token字段php artisan make:migration add_api_token_to_users --table=users 内容 class AddApiTokenToUsers extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { $table->string('api_token', 60)->unique(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('api_token'); }); } } 打开navicat进到user表里,更新users的api_token。 image.png 打开postman image.png 注意这里的header,key是Authorization,值就是Bearer+空格+刚才数据库里设的api_token 这样就能返回内容啦,修改其他用户的token能返回相应的用户信息,说明认证成功,功能基本完成! 下面完善细节 完善逻辑 修改 \app\Http\Controllers\Auth\RegisterController.php protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), // 添加这行 'api_token' => str_random(60), ]); } User Model 的 $fillable也改下 protected $fillable = [ 'name', 'email', 'password', 'api_token', ]; 如果在前台页面,发起请求时如何给后台传这个Authorization header? 方法如下 注意,下面的是Laravel5.4的修改方法。新版本可能有细微区别,只要知道原理就能自己改了。 打开 \resources\assets\js\bootstrap.js 参照着csrf-token。合适的地方添加下面的代码 let token = document.head.querySelector('meta[name="csrf-token"]'); let api_token = document.head.querySelector('meta[name="api-token"]'); if (token) { // 这个要参考axios的文档 window.axios.defaults.headers.common['X-CSRF-TOKEN'] = Laravel.csrfToken =token.content; // 如果用的jquery // Fix jquery ajax crossDomain without Token // jQuery.ajaxPrefilter(function (options, originalOptions, jqXHR) { // // if (options.crossDomain) { // jqXHR.setRequestHeader('Authorization', api_token.content); // jqXHR.setRequestHeader('X-CSRF-TOKEN', token.content); // //} // }); } else { console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); } if (api_token) { window.axios.defaults.headers.common['Authorization'] = api_token.content; } else { console.error('Authorization token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); } 最后修改公共视图模版中 \views\layouts\app.blade.php <meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="api-token" content="{{ Auth::check() ? 'Bearer '.Auth::user()->api_token : 'Bearer ' }}"> 总结: 本质上给用户表添加api_token,后台根据这个字段判断是否是有效的用户,无效返回401,有效返回查询结果。 优点是容易理解,缺点太简单,安全也不够。 为了安全,可以实现下面的功能: 每次登录成功后刷新api_token为新值 其实 Laravel 官方提供了一个 Laravel Passport 的包。Laravel Passport is an OAuth2 server and API authentication package 。 具体使用请等更新。 问题: 如何修改默认的api_token列?

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册