设为首页 收藏本站
查看: 2519|回复: 0

[经验分享] OpenStack配置笔记

[复制链接]

尚未签到

发表于 2017-6-22 09:10:29 | 显示全部楼层 |阅读模式
  第1章 绪论
  OpenStack 是一个由 NASA(美国国家航空航天局)和 Rackspace 合作研发并发起的,以 Apache 许可证授权的自由软件和开放源代码项目。
  
DSC0000.png
  OpenStack 是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack 支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack 通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。
  
OpenStack 是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过 130 家企业及 1350 位开发者,这些机构与个人都将 OpenStack 作为基础设施即服务(IaaS)资源的通用前端。OpenStack 项目的首要任务是简化云的部署过程并为其带来良好的可扩展性。本文希望通过提供必要的指导信息,帮助大家利用 OpenStack 前端来设置及管理自己的公共云或私有云。
  
OpenStack 云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3的云基础架构服务(Infrastructure as a Service, IaaS)。OpenStack 包含两个主要模块:Nova 和 Swift,前者是 NASA 开发的虚拟服务器部署和业务计算模块;后者是 Rackspace 开发的分布式云存储模块,两者可以一起用,也可以分开单独用。OpenStack 除了有 Rackspace 和 NASA 的大力支持外,还有包括 Dell、 Citrix、 Cisco、 Canonical 等重量级公司的贡献和支持,发展速度非常快。
  
OpenStack 核心项目
  
DSC0001.png
  OpenStack概念架构
  
DSC0002.png
  OpenStack逻辑架构
  
DSC0003.png
  部署架构
  
两节点的nova-network部署示例
  
DSC0004.png
  三节点的neutron 部署示例
  
DSC0005.png
  第2章 OpenStack概况
  2.1、Keystone

  
Keystone(OpenStack>  
Keystone基本概念介绍:
  
2.1.1 User
  
User即用户,他们代表可以通过keystone进行访问的人或程序。Users通过认证信息(credentials,如密码、API Keys等)进行验证。
  
2.1.2 Tenant
  
Tenant即租户,它是各个服务中的一些可以访问的资源集合。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜像存储,在Quantum中一个tenant可以是一些网络资源。Users默认的总是绑定到某些tenant上。
  
2.1.3 Role
  
Role即角色,Roles代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的或租户内的角色中。在全局的role中,用户的role权限作用于所有的租户,即可以对所有的租户执行role规定的权限;在租户内的role中,用户仅能在当前租户内执行role规定的权限。
  
2.1.4 Service
  
Service即服务,如Nova、Glance、Swift。根据前三个概念(User,Tenant和Role)一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个user尝试着访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。例如,当swift需要一个管理员权限的访问进行对象创建时,对于相同的role我们并不一定也需要对nova进行管理员权限的访问。为了实现这个目标,我们应该创建两个独立的管理员role,一个绑定到swift,另一个绑定到nova,从而实现对swift进行管理员权限访问不会影响到Nova或其他服务。
  
2.1.5 Endpoint
  
Endpoint,翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。因此,在keystone中包含一个endpoint模板(endpoint template,在安装keystone的时候我们可以在conf文件夹下看到这个文件),这个模板提供了所有存在的服务endpoints信息。一个endpoint template包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。public url可以被全局访问(如http://compute.example.com),private url只能被局域网访问(如http://compute.example.local),admin url被从常规的访问中分离。
  
DSC0006.png
  2.2 Glance
  
Glance项目提供虚拟机镜像的发现,注册,取得服务。Glance提供restful API可以查询虚拟机镜像的metadata,并且可以获得镜像。通过Glance,虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储(比如OpenStack中swiftx项目)。
  
2.2.1 Glance,像所有的OpenStack项目一样,遵循以下思想:
  
1.基于组件的架构 便于快速增加新特性
  
2.高可用性 支持大负荷
  
3.容错性 独立的进程避免串行错误
  
4.开放标准 对社区驱动的API提供参考实现
  
2.2.2 Glance的几个重要概念:

  
1.Image>  
2.2.2.1
  2.3 Nova
  
Nova提供按需分配的虚拟机。它类似于Rackspaces的cloud servers和亚马逊的Amazon Elastic ;Nova是OpenStack计算的弹性控制器。OpenStack云实例生命期所需的各种动作都将由Nova进行处理和支撑,这就意味着Nova以管理平台的身份登场,负责管理整个云的计算资源、网络、授权及测度。虽然Nova本身并不提供任何虚拟能力,但是它将使用libvirt API与虚拟机的宿主机进行交互。Nova通过Web服务API来对外提供处理接口,而且这些接口与Amazon的Web服务接口是兼容的。
  
2.3.1 Openstack Nova的逻辑架构
  
OpenStack Nova的逻辑组件,用户自定义的python编写的两种守护进程
  
1)WSGI应用程序去接收和中转API请求(nova-api, glance-api 等等);
  
2)Worker守护进程去执行orchestration任务(nova-compute, nova-network, nova-schedule等等);
  
2.3.2 Nova逻辑架构可以总结为以下3点
  
1)终端用户(开发/运维人员和其他OpenStack组件)与nova-api进行交互;
  
2)OpenStack Nova守护进程间通过消息队列(动作)和数据库(信息)交互;
  
3)OpenStack Glance是一个完全和OpenStack Nova不一样的架构,他们之间用过Glance API进行交互;
  
nova-api 起到了Cloud Controller的作用,主要为所有的API查询提供了一个接口(比如Openstack API ,EC2 API),引发多数业务流程的活动(如运行一个实例),并实施一些政策(主要是配额检查)。
  
2.3.3 功能及特点
  
实例生命周期管理
  
计算资源管理
  
网络与授权管理
  
基于REST的API
  
异步连续通信
  
支持各种宿主:Xen、XenServer/XCP、KVM、UML、VMware vSphere及Hyper-V
  
OpenStack计算部件
  
2.3.4 Nova弹性云包含以下主要部分
  
API Server(nova-api)
  
消息队列(rabbit-mq server)
  
运算工作站(nova-compute)
  
网络控制器(nova-network)
  
卷管理(nova-volume)
  
调度器(nova-scheduler)
  
2.3.5 API服务器(nova-api)
  
API服务器提供了云设施与外界交互的接口,它是外界用户对云实施管理的唯一通道。通过使用web服务来调用各种EC2的API,接着API服务器便通过消息队列把请求送达至云内目标设施进行处理。作为对EC2-api的替代,用户也可以使用OpenStack的原生API,我们把它叫做“OpenStack API”。
  
2.3.6 消息队列(Rabbit MQ Server)
  
OpenStack内部在遵循AMQP(高级消息队列协议)的基础上采用消息队列进行通信。Nova对请求应答进行异步调用,当请求接收后便则立即触发一个回调。由于使用了异步通信,不会有用户的动作被长置于等待状态。例如,启动一个实例或上传一份镜像的过程较为耗时,API调用就将等待返回结果而不影响其它操作,在此异步通信起到了很大作用,使整个系统变得更加高效。
  
2.3.7 运算工作站(nova-compute)
  
运算工作站的主要任务是管理实例的整个生命周期。他们通过消息队列接收请求并执行,从而对实例进行各种操作。在典型实际生产环境下,会架设许多运算工作站,根据调度算法,一个实例可以在可用的任意一台运算工作站上部署。
  
2.3.8 网络控制器(nova-network)
  
网络控制器处理主机的网络配置,例如IP地址分配,配置项目VLAN,设定安全群组以及为计算节点配置网络。
  
2.3.9 卷工作站(nova-volume)
  
卷工作站管理基于LVM的实例卷,它能够为一个实例创建、删除、附加卷,也可以从一个实例中分离卷。卷管理为何如此重要?因为它提供了一种保持实例持续存储的手段,比如当结束一个实例后,根分区如果是非持续化的,那么对其的任何改变都将丢失。可是,如果从一个实例中将卷分离出来,或者为这个实例附加上卷的话,即使实例被关闭,数据仍然保存其中。这些数据可以通过将卷附加到原实例或其他实例的方式而重新访问。
  
因此,为了日后访问,重要数据务必要写入卷中。这种应用对于数据服务器实例的存储而言,尤为重要。
  
2.3.10 调度器(nova-scheduler)
  
调度器负责把nova-API调用送达给目标。调度器以名为“nova-schedule”的守护进程方式运行,并根据调度算法从可用资源池中恰当地选择运算服务器。有很多因素都可以影响调度结果,比如负载、内存、子节点的远近、CPU架构等等。强大的是nova调度器采用的是可插入式架构。
  
目前nova调度器使用了几种基本的调度算法:
  
随机化:主机随机选择可用节点;
  
可用化:与随机相似,只是随机选择的范围被指定;
  
简单化:应用这种方式,主机选择负载最小者来运行实例。负载数据可
  
以从别处获得,如负载均衡服务器。
  
DSC0007.png
  2.4 Neutron
  
2.4.1 基本概念
  
1)网络连接服务Network connectivity as a service;
  
2)提供面向租户(Tenant)的API接口,用于创建虚拟网络,路由器,负载均衡等,关联instance到指定的网络和路由;
  
3)通过API接口管理虚拟或物理交换机;
  
4)提供plugin架构来支持不同的技术平台;
  
5) Neutron Private Network – 提供固定私网地址;
  
6)Neutron Public Network – 提供浮动IP地址;
  
2.4.2 关键概念
  
1)Network
  
一个L2二层网络单元;
  
租户可通过Neutron API 创建自己的网络;
  
2) Subnet
  
一段IPV4/IPV6地址段;
  
为Instance提供私网或公网地址;
  
3)Router
  
三层路由器;
  
为租户的Instance提供路由功能;
  
4)Port
  
虚拟交换机上的端口;
  
管理Instance的网卡;
  
2.4.3 Neutron组件
  
■ Neutron Server
  
实现Neutron API和API扩展;
  
管理Network,subnet,port;
  
管理port的IP地址;
  
■ ML2 agent
  
运行在每个计算节点上(compute node);
  
连接虚拟机到网络端口;
  
■ DHCP agent
  
负责DHCP配置,为虚拟机分配IP;
  
开始/停止dhcp服务器In multi-host mode, run on each compute node (deferred);
  
Start/stop dhcp server;
  
Maintain dhcp configuration;
  
■ L3-agent
  
负责公网浮动ip地址和NAT;
  
负责其他三层特性,例如负载均衡等;
  
每个network对应一个L3 agent;
  
■ Metadata-agent
  
提供元数据服务Neutron L3-agent,dhcp-agent, nova metadata API server;
  
Neutron将网络按照三层交换机的概念分为:
  
Network:相当于交换机根据vlan创建的一个三层接口;
  
Subnet:相当于交换机创建了一个三层接口地址;
  
Port:相当于交换机的一个物理端口,但是这个端口有一个MAC地址;
  
Neutron支持的plugin有:
  
Open vSwitch Plugin
  
Cisco UCS/Nexus Plugin
  
Linux Bridge Plugin
  
Modular Layer 2 Plugin
  
Nicira Network Virtualization Platform (NVP) Plugin
  
Ryu OpenFlow Controller Plugin
  
NEC OpenFlow Plugin
  
Big Switch Controller Plugin
  
Cloudbase Hyper-V Plugin
  
MidoNet Plugin
  
Brocade Neutron Plugin Brocade Neutron Plugin
  
PLUMgrid Plugin
  
Mellanox Neutron Plugin Mellanox Neutron Plugin
  
Embrane Neutron Plugin
  
还有一些非官方维护的:
  
OpenContrail Plugin
  
Extreme Networks Plugin
  
Ruijie Networks Plugin
  
Juniper Networks Neutron Plugin
  
DSC0008.png
  Neutron 之前世今生

  
OpenStack 网络服务,现已由之前的 Quantum 改名为 Neutron。Neutron 是 OpenStack 核心项目之一,提供云计算环境下的虚拟网络功能。OpenStack Havana 版本的>  
Multi-Vendor-Support:同时支持多种物理网络类型,支持 Linux Bridge、Hyper-V 和 OVS bridge 计算节点共存;
  
Neutron-Fwaas:支持防火墙服务;
  
VPNaas:支持节点间 VPN 服务;
  
More-Vendors:更多的网络设备支持和开源 SDN 实现完善和提高,新增加了 ML2 (The Modular Layer2) 插件。
  
OpenStack nova-network 网络模型:
  
在 OpenStack 网络组件没有独立出来之前,OpenStack 最初的 nova-network 网络模型。
  
DSC0009.png
  单一平面网络的缺点:
  
存在单一网络瓶颈,缺乏可伸缩性。
  
缺乏合适的多租户隔离。
  
OpenStack Neutron 网络模型
  
OpenStack nova-network 独立成为单独的组件 Neutron 后,形象的网络模型的多平面网络、混合平面私有网络。
DSC00010.png

  混合平面私有网络
  
DSC00011.png
  通过私有网络实现运营商路由功能
  
DSC00012.png
  通过私有网络实现每个租户创建自己专属的网络区段
  
DSC00013.png
  Neutron 网络创建过程
  
Neutron 网络目的是为 OpenStack 云更灵活地划分物理网络,在多租户环境下提供给每个租户独立的网络环境。另外,Neutron 提供 API 来实现这种目标。Neutron 中用户可以创建自己的网络对象,如果要和物理环境下的概念映射的话,这个网络对象相当于一个巨大的交换机,可以拥有无限多个动态可创建和销毁的虚拟端口。在 Horizon 上创建 Neutron 网络过程如下:
  
首先管理员拿到一组可以在互联网上寻址的 IP 地址,并且创建一个外部网络和子网。
  
租户创建一个网络和子网。
  
租户创建一个路由器并且连接租户子网和外部网络。
  
租户创建虚拟机。
  
OpenStack 网络类型
  
一个标准的 OpenStack 网络设置有 4 个不同的物理数据中心网络:
  
管理网络:用于 OpenStack 各组件之间的内部通信。
  
数据网络:用于云部署中虚拟数据之间的通信。
  
外部网络:公共网络,外部或 internet 可以访问的网络。
  
API 网络:暴露所有 OpenStack APIs,包括 OpenStack 网络 API 给租户们。
  
DSC00014.png
  Neutron 服务网络管理的三种模式
  
Flat 模式
  
Flat 模式和 FlatDHCP 模式其实区别不大,都是基于网桥网络,只是 FLat 模式需要管理员手动配置(包括配置网桥和外部的 DHCP 设备)
  
Flat 网络拓扑
  
DSC00015.png
  Flat DHCP 模式
  
这种模式下与 Flat 模式不同的地方在于有一个 DHCP 进程,每一个运行 nova-network 进程的节点(网络控制节点/nove-network 主机)就是一个单独的网络。Nova 会在 nova-network 主机建立网桥(默认名称 br100,配置项 flat_network_bridge=br100),并给该网桥指定该网络的网关 IP,同时 Nova 在网桥处起一个 DHCP 进程,最后,会建立 iptables 规则(SNAT/DNAT)使虚拟机能够与外界通信,同时与一个 metadata 服务器通信以取得 cloud 内的信息。
  
计算节点负责创建对应节点的网桥,此时的计算节点网卡可以不需要 IP 地址,因为网桥把虚拟机与 nove-network 主机连接在一个逻辑网络内。虚拟机启动时会发送 dhcpdiscover 以获取 IP 地址。虚拟机通往外界的数据都要通过 nova-network 主机,DHCP 在网桥处监听,分配 fixed_range 指定的 IP 段
  
Flat DHCP 网络拓扑。
  
DSC00016.png
  VLAN 模式
  
VLAN(Virtual Local Area Network)的中文名为"虚拟局域网"。VLAN 是一种将局域网设备从逻辑上划分成一个个网段,从而实现虚拟工作组的新兴数据交换技术。
  
VLAN 模式与 Flat 模式的区别:
  
在 Flat 模式下,管理员的工作流程应该是这样的:
  
为所有租户创建一个 IP 池:
  
nova-manage network create --fixed_range_v4=10.0.0.0/16 –label=public
  
创建租户
  
租户创建虚拟机,为虚拟机分配 IP 池中的可用 IP
  
DB 中虚拟机信息可能如下图,从图中我们看到 2 个虚拟机处于同一网段。
  
DSC00017.png
  
在 VLAN 模式下流程如下:
  
创建新的租户,并记下租户的标识为该租户创建独占的 fixed_ip 段:
  
nova-manage network create --fixed_range_v4=10.0.1.0/24 --vlan=102 --project_id="tenantID"租户创建虚拟机,从租户的私有 IP 段内分配 IP 给虚拟机。
  
因此,与 Flat 模式相比,VLAN 模式为网络增加了:将网络与租户关联和为网络分配一个 VLAN 号。
  
2.5 Horizon
  
Horizon是一个用以管理、控制OpenStack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等。除此之外,用户还可以在控制面板中使用终端(console)或VNC直接访问实例。总之,Horizon具有如下一些特点:
  
1、实例管理:创建、终止实例,查看终端日志,VNC连接,添加卷等
  
2、访问与安全管理:创建安全群组,管理密匙对,设置浮动IP等
  
3、偏好设定:对虚拟硬件模板可以进行不同偏好设定
  
4、镜像管理:编辑或删除镜像
  
5、查看服务目录
  
6、管理用户、配额及项目用途
  
7、用户管理:创建用户等
  
8、卷管理:创建卷和快照
  
9、对象存储处理:创建、删除容器和对象
  
10、为项目下载环境变量
  
DSC00018.png
  2.6 Cinder
  
Cinder提供持久化块存储,.一个独立的volume可以灵活的挂载和卸载到不同的VM实例(就好比我们的一块硬盘拔插了)。VM实例可以用cinder volume作为启动盘。Block Storage服务无法提供类似于NFS的共享存储。一个块设备同时只能挂在到一个VM实例。
  
2.6.1 服务组件
  
Cinder有如下服务组件:
  
cinder-api:WSGI应用,接受API请求并发送到cinder-volume处理。
  
cinder-scheduler:调度器,处理消息队列中的请求,并根据预定策略(Filter Scheduler)选择合适的cinder-volume节点来完成请求。
  
cinder-volume:cinder-volume服务运行在存储节点上,管理块存储设备。该服务会对cinder数据库进行读写操作,通过消息队列与其他服务交互(如cinder-scheduler)。cinder-volume支持多种后端存储。多个存储节点可以组成一个存储资源池。
  
cinder-backup:可以将volume备份到多种目标对象(如swift、ceph)。
  
Messaging queue:在块存储服务之间传递消息,块存储服务和计算节点交互来为VM提供volume。
  
2.6.2 Cinder其他概念
  
·Back-end Storage Devices.:后端存储设备,默认采用本地LVM VG。此外,Cinder还支持很多种存储。
  
·Users和Tenants (Projects):我的理解是这里也是基于Keystone的权限控制。对于租户而言,cinder quota控制可以做如下限制:创建volume的数量、创建快照的数量、每个租户总空间(volume和快照分享)。用户有权使用哪些volume是通过租户来限制的。控制硬件资源quota是对每个租户启用的,而授予vomle访问权限的key pairs是对单个用户启用的。
  
2.6.3 Volume Type
  
Volume Type是一个条件的抽象集合,这个集合用来定义一个特定的服务水平(如惯称的金、银、铜),包含一个key/value pairs列表(可通过cinder extra-specs-list查看)。可以在创建volume时指定volume类型,volume创建后类型是可以修改的。cinder scheduler可以根据volume类型定义来指定存储后端,而且volume类型还可以用来指定存储后端的行为依赖的特殊信息。volume类型名可以任意指定。
  
当使用cinder-volume节点使用多种后端存储时,必须启用filter_scheduler。scheduler使用 filtering和weighing来选择最优的存储后端。首先,filter scheduler过滤可用的存储后端,默认情况下,AvailabilityZoneFilter,CapacityFilter和CapabilitiesFilter被启用。然后,filter scheduler会通过scheduler weigher权衡先前过滤的存储后端,默认情况下,CapacityWeigheris被启用,此种情况下会优先使用容量较多的存储后端。
  
Volume类型默认key pairs有:volume_backend_name(在cinder.conf定义的名字)、verdor_name、driver_version、storage_protocol。每个厂商的存储会有自己的Extra Specs。此外,目前cinder还支持Qos,Cinder的Qos主要依赖于frontend(hypervisor)和backend(存储)。
  
Frontend可以通过吞吐量(total_bytes_sec, read_bytes_sec, write_bytes_sec)、IPOS(total_iops_sec,read_iops_sec,write_iops_sec)来控制。
  
DSC00019.png
  2.7 Swift
  
Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack 开源社区作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务。Swift 构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。
  
2.7.1 数据模型
  
Swift 采用层次数据模型,共设三层逻辑结构:Account/Container/Object(即账户/容器/对象),每层节点数均没有限制,可以任意扩展。这里的账户和个人账户不是一个概念,可理解为租户,用来做顶层的隔离机制,可以被多个个人账户所共同使用;容器代表封装一组对象,类似文件夹或目录;叶子节点代表对象,由元数据和内容两部分组成。
  
2.7.2 系统架构
  
Swift 采用完全对称、面向资源的分布式系统架构设计,所有组件都可扩展,避免因单点失效而扩散并影响整个系统运转;通信方式采用非阻塞式 I/O 模式,提高了系统吞吐和响应能力。
  
2.7.3 基本原理
  
一致性散列(Consistent Hashing)
  
面对海量级别的对象,需要存放在成千上万台服务器和硬盘设备上,首先要解决寻址问题,即如何将对象分布到这些设备地址上。Swift 是基于一致性散列技术,通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用 2 的 n 次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。
  
DSC00020.png
  

以逆时针方向递增的散列空间有 4 个字节长共 32 位,整数范围是[0~232-1];将散列结果右移 m 位,可产生 232-m个虚拟节点,例如 m=29 时可产生 8 个虚拟节点。在实际部署的时候需要经过仔细计算得到合适的虚拟节点数,以达到存储空间和工作负载之间的平衡。  

  2.7.4 数据一致性模型(Consistency Model)
  
按照 Eric Brewer 的 CAP(Consistency,Availability,Partition Tolerance)理论,无法同时满足 3 个方面,Swift 放弃严格一致性(满足 ACID 事务级别),而采用最终一致性模型(Eventual Consistency),来达到高可用性和无限水平扩展能力。为了实现这一目标,Swift 采用 Quorum 仲裁协议(Quorum 有法定投票人数的含义):
  
(1)定义:N:数据的副本总数;W:写操作被确认接受的副本数量;R:读操作的副本数量;
  
(2)强一致性:R+W>N,以保证对副本的读写操作会产生交集,从而保证可以读取到最新版本;如果 W=N,R=1,则需要全部更新,适合大量读少量写操作场景下的强一致性;如果 R=N,W=1,则只更新一个副本,通过读取全部副本来得到最新版本,适合大量写少量读场景下的强一致性。
  
(3)弱一致性:R+W<=N,如果读写操作的副本集合不产生交集,就可能会读到脏数据;适合对一致性要求比较低的场景。
  
Swift 针对的是读写都比较频繁的场景,所以采用了比较折中的策略,即写操作需要满足至少一半以上成功 W >N/2,再保证读操作与写操作的副本集合至少产生一个交集,即 R+W>N。Swift 默认配置是 N=3,W=2>N/2,R=1 或 2,即每个对象会存在 3 个副本,这些副本会尽量被存储在不同区域的节点上;W=2 表示至少需要更新 2 个副本才算写成功;当 R=1 时意味着某一个读操作成功便立刻返回,此种情况下可能会读取到旧版本(弱一致性模型);当 R=2 时,需要通过在读操作请求头中增加 x-newest=true 参数来同时读取 2 个副本的元数据信息,然后比较时间戳来确定哪个是最新版本(强一致性模型);如果数据出现了不一致,后台服务进程会在一定时间窗口内通过检测和复制协议来完成数据同步,从而保证达到最终一致性。
  
2.7.5 环的数据结构
  
环是为了将虚拟节点(分区)映射到一组物理存储设备上,并提供一定的冗余度而设计的,其数据结构由以下信息组成:
  
存储设备列表、设备信息包括唯一标识号(id)、区域号(zone)、权重(weight)、IP 地址(ip)、端口(port)、设备名称(device)、元数据(meta)。
  
分区到设备映射关系(replica2part2dev_id 数组)
  
计算分区号的位移(part_shift 整数,即图 1 中的 m)
  
以查找一个对象的计算过程为例:
  
环的数据机构
  
DSC00021.png
  

使用对象的层次结构 account/container/object 作为键,使用 MD5 散列算法得到一个散列值,对该散列值的前 4 个字节进行右移操作得到分区索引号,移动位数由上面的 part_shift 设置指定;按照分区索引号在分区到设备映射表(replica2part2dev_id)里查找该对象所在分区的对应的所有设备编号,这些设备会被尽量选择部署在不同区域(Zone)内,区域只是个抽象概念,它可以是某台机器,某个机架,甚至某个建筑内的机群,以提供最高级别的冗余性,建议至少部署 5 个区域;权重参数是个相对值,可以来根据磁盘的大小来调节,权重越大表示可分配的空间越多,可部署更多的分区。Swift 为账户,容器和对象分别定义了的环,查找账户和容器的是同样的过程。  

  2.7.6数据模型
  
Swift 采用层次数据模型,共设三层逻辑结构:Account/Container/Object(即账户/容器/对象),每层节点数均没有限制,可以任意扩展。这里的账户和个人账户不是一个概念,可理解为租户,用来做顶层的隔离机制,可以被多个个人账户所共同使用;容器代表封装一组对象,类似文件夹或目录;叶子节点代表对象,由元数据和内容两部分组成。
  
DSC00022.png
  2.7.8 系统架构
  
Swift 采用完全对称、面向资源的分布式系统架构设计,所有组件都可扩展,避免因单点失效而扩散并影响整个系统运转;通信方式采用非阻塞式 I/O 模式,提高了系统吞吐和响应能力。
  
DSC00023.png
  2.7.9 Swift 组件
  
代理服务(Proxy Server):对外提供对象服务 API,会根据环的信息来查
  
找服务地址并转发用户请求至相应的账户、容器或者对象服务;由于采用无状态的REST 请求协议,可以进行横向扩展来均衡负载。
  
认证服务(Authentication Server):验证访问用户的身份信息,并获得
  
一个对象访问令牌(Token),在一定的时间内会一直有效;验证访问令牌的有效性并缓存下来直至过期时间。
  
缓存服务(Cache Server):缓存的内容包括对象服务令牌,账户和容器的
  
存在信息,但不会缓存对象本身的数据;缓存服务可采用 Memcached 集群,Swift
  
会使用一致性散列算法来分配缓存地址。
  
账户服务(Account Server):提供账户元数据和统计信息,并维护所含容
  
器列表的服务,每个账户的信息被存储在一个 SQLite 数据库中。
  
容器服务(Container Server):提供容器元数据和统计信息,并维护所含
  
对象列表的服务,每个容器的信息也存储在一个 SQLite 数据库中。
  
对象服务(Object Server):提供对象元数据和内容服务,每个对象的内
  
容会以文件的形式存储在文件系统中,元数据会作为文件属性来存储,建议采用支持扩展属性的 XFS 文件系统。
  
复制服务(Replicator):会检测本地分区副本和远程副本是否一致,具体
  
是通过对比散列文件和高级水印来完成,发现不一致时会采用推式(Push)更新
  
远程副本,例如对象复制服务会使用远程文件拷贝工具 rsync 来同步;另外一
  
个任务是确保被标记删除的对象从文件系统中移除。
  
更新服务(Updater):当对象由于高负载的原因而无法立即更新时,任务
  
将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新;例如成功创建对象后容器服务器没有及时更新对象列表,这个时候容器的更新操作就会进入排队中,更新服务会在系统恢复正常后扫描队列并进行相应的更新处理。审计服务(Auditor):检查对象,容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误会被记录到日志中。
  
账户清理服务(Account Reaper):移除被标记为删除的账户,删除其所包
  
含的所有容器和对象。
  
Swift 通过 Proxy Server 向外提供基于 HTTP 的 REST 服务接口,对账
  
户、容器和对象进行 CRUD 等操作。在访问 Swift 服务之前,需要先通过认证服务获取访问令牌,然后在发送的请求中加入头部信息 X-Auth-Token。
  
DSC00024.png
  第3章项目实施过程
  3.1 安全
  
OpenStack 服务支持各种各样的安全方式,包括密码 password、policy 和 encryption,支持的服务包括数据库服务器,且消息 broker 至少支持 password 的安全方式。
  
下面的表格给出了需要密码的服务列表以及它们在指南中关联关系:
  
DSC00025.png
  OpenStack和配套服务在安装和操作过程中需要管理员权限。另外,网络服务设定内核网络参数的默认值并且修改防火墙规则。
  
3.2 环境
  
开启多台虚拟机搭建分布式OpenStack,搭建移动热点使各个节点和主机连接起来,在局域网内建立分布式openstack。
  
DSC00026.png
  
DSC00027.png
  配置每个节点和主机的IP地址:
  
Network节点ip地址配置:
DSC00028.png

  
DSC00029.png
  Controller节点IP地址配置:
  
DSC00030.png
  
DSC00031.png
  Compute节点1IP地址配置:
  
DSC00032.png
  Compute节点2IP地址配置:
  
DSC00033.png
  Block Storage节点IP地址配置:
  
DSC00034.png
  
Object Storage节点1IP地址配置:
  
DSC00035.png
  Object Storage节点2IP地址配置:
  
DSC00036.png
  配置主机环境
  
DSC00037.png
  安装时间同步服务,在每台主机上安装时间同步服务,其中的一台配置如下图:
  
DSC00038.png
  
DSC00039.png
  

配置OpenStack安装包源,为每个节点配置yum安装源,其中的一台主机的安装源配置如下:  

DSC00040.png

  在控制节点安装消息队列服务RabbitMQ
  
DSC00041.png
DSC00042.png

  
DSC00043.png
  
DSC00044.png
  3.3 安装数据库Mariadb
  
DSC00045.png
  
DSC00046.png
  
DSC00047.png
  创建证书和密钥,启动keystone,并设置keystone开机启动
  
DSC00048.png
  修改keyston配置文件/etc/keystone/keystone.conf
  
DSC00049.png
  
启动openstack-keystone服务
  

  创建周期性的任务清除keystone数据库数据,避免数据库存放大量过期令牌而降低服务器性能;
  

  配置环境变量
  


  3.4 创建租户、用户和角色
  
创建管理员租户
  

  将管理员账号admin加入管理员租户admin和管理员角色admin
  

  创建管理员角色

  创建一般租户demo
  

  创建用户demo并加入租户demo
  

  为openstack服务创建一个租户
  

  为keystone创建服务实体
  

  创建keystone服务API访问点
  

  删除环境变量,以管理员身份查看令牌
  

  以管理员身份查看租户列表
  

  以管理员身份查看用户列表
  

  以管理员身份查看角色列表
  

  以普通用户身份获取令牌
  

  以普通用户身份查看用户列表,发现没有权限
  

  创建管理员环境
  

  创建普通用户环境
  

  3.5 网络节点配置
  

  

  

  

  

  

  

  

  3.6 计算节点配置
  

  

  

  

  


  

  

  3.7 添加镜像服务
  
OpenStack 的镜像服务 (glance) 允许用户发现、注册和恢复虚拟机镜像。它提供了一个 REST API,允许您查询虚拟机镜像的 metadata 并恢复一个实际的镜像。您可以存储虚拟机镜像通过不同位置的镜像服务使其可用,就像 OpenStack 对象存储那样从简单的文件系统到对象存储系统。
  
OpenStack镜像服务是IaaS的核心服务,
  
如同 :ref:get_started_conceptual_architecture所示。它接受磁盘镜像或服务器镜像API请求,和来自终端用户或OpenStack计算组件的镜像元数据。它也支持包括OpenStack对象存储在内的多种类型仓库上的磁盘镜像或服务器镜像存储。
  
大量周期性进程运行于OpenStack镜像服务上以支持缓存。同步复制(Replication)服务保证集群中的一致性和可用性。其它周期性进程包括auditors, updaters, 和 reapers。
  
OpenStack镜像服务包括以下组件:
  
glance-api
  
接收镜像API的调用,诸如镜像发现、恢复、存储。
  
glance-registry
  
存储、处理和恢复镜像的元数据,元数据包括项诸如大小和类型。
  
数据库
  
存放镜像元数据,用户是可以依据个人喜好选择数据库的,多数的部署使用MySQL或SQLite镜像文件的存储仓库。支持多种类型的仓库,它们有普通文件系统、对象存储、RADOS块设备、HTTP、以及亚马逊S3。记住,其中一些仓库仅支持只读方式使用。
  
安装和配置:
  
前提条件
  
安装和配置镜像服务之前,你必须创建创建一个数据库、服务凭证和API端点。
  
1)完成下面的步骤以创建数据库:
  
用数据库连接客户端以 root 用户连接到数据库服务器
  
创建 glance 数据库
  
对glance数据库授予恰当的权限
  
退出数据库客户端。
  

  2)获得 admin 凭证来获取只有管理员能执行命令的访问权限:
  

  3)要创建服务证书
  
创建 glance 用户:
  
添加 admin 角色到 glance 用户和 service 项目上
  
*创建glance服务实体:
  

  4)创建镜像服务的 API 端点:
  

  安全并配置组件
  
1、安装软件包
  

  2、编辑文件 /etc/glance/glance-api.conf 并完成如下动作:
  
1)在 [database] 部分,配置数据库访问
  
2)在 [keystone_authtoken] 和 [paste_deploy] 部分,配置认证服务访问
  
3)在“[glance_store]”部分,配置本地文件系统存储和镜像文件位置
  
4)“[DEFAULT]”部分,配置 noop 禁用通知,因为他们只适合与可选的Telemetry 服务
  
5)(可选的)为帮助排错,在 “[DEFAULT]”部分启用详细日志
  

  3、编辑文件 /etc/glance/glance-registry.conf 并完成如下动作
  
1)在 [database] 部分,配置数据库访问
  
2)在 [keystone_authtoken] 和 [paste_deploy] 部分,配置认证服务访问
  
3)在“[DEFAULT]”部分,配置 noop 禁用通知,因为他们只适合与可选的Telemetry 服务
  

  4、写入镜像服务数据库
  

  完成安装
  
启动镜像服务、配置他们随机启动
  

  

  第5章项目出现问题
  问题1:unable to establish connection to
  
http://controller:35357/v2.0/
  
问题2:keystone user-create --name neutron --pass xcu2016
  
Expecting an auth URL via either --os-auth-url or env[OS_AUTH_URL]
  
source admin-openrc.sh

  问题3:keystone endpoint-create --service-id $(keystone service-list | awk '/>  
usage: keystone [--version] [--debug] [--os-username
  问题4:出现错误,有待解决:
  

  问题5:
  

  Rm -f /var/run/yum.pid
  
问题6:重
  
启服务是起不来,日志也不报错
  解决办法参考:
  
http://blog.csdn.net/Moolight_shadow/article/details/46848771
  
问题7:在web浏览dashboard,可以访问输入用户和密码,dashboard/admin页面提示“报错,请刷新,如需帮助请联系管理员”刷新后还是此错误;
  

  解决办法参考:http://www.aboutyun.com/forum.php?mod=viewthread&tid=11954
  
问题8:
  

  解决办法参考:
  
http://bbs.csdn.net/topics/390388209
  
http://blog.csdn.net/mashangyou/article/details/24237819
  
问题9:
  

  解决方法参考:
  
http://www.aboutyun.com/thread-11424-1-1.html
  
http://www.iyunv.com/Linux/2013-02/78919p4.htm
  
问题10:
  

  解决方法参考链接:
  
http://blog.csdn.net/yxwmzouzou/article/details/43892261
  
http://bbs.csdn.net/topics/390847319
  
http://www.aboutyun.com/thread-11203-1-1.html
  
问题11:
  

  
http://bbs.vmsky.com/thread-48297-1-1.html#userconsent#
  
http://www.aboutyun.com/blog-61-1758.html
  
https://ask.openstack.org/en/question/54706/swiftclientserviceswifterror-account-not-found/
  
问题12:
  
错误信息:
  
$ env |grep OS
  
OS_PROJECT_DOMAIN_ID=default
  
OS_IMAGE_API_VERSION=2
  
OS_USER_DOMAIN_ID=default
  
OS_PROJECT_NAME=admin
  
OS_PASSWORD=admin
  
OS_AUTH_URL=http://controller:35357/v3
  
OS_USERNAME=admin
  
OS_TENANT_NAME=admin
  
OS_VOLUME_API_VERSION=2
  
$ swift --debug list
  
DEBUG:keystoneclient.auth.identity.v2:Making authentication request to http://controller:35357/v3/tokens
  
INFO:urllib3.connectionpool:Starting new HTTP connection (1): controller
  
DEBUG:urllib3.connectionpool:"POST /v3/tokens HTTP/1.1" 404 93
  
DEBUG:keystoneclient.session:Request returned failure status: 404
  
ERROR:swiftclient:Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID: req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
Traceback (most recent call last):
  
File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 1235, in _retry self.url, self.token = self.get_auth()
  
File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 1209, in get_auth insecure=self.insecure)
  
File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 406, in get_auth
  
    auth_version=auth_version)
  
  File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 341, in get_auth_keystone
  
    raise ClientException('Authorization Failure. %s' % err)
  
ClientException: Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID:req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID:req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
解决方法参考:
  
https://bugs.launchpad.net/python-swiftclient/+bug/1470328
  
错误信息:
  
$ env |grep OS
  
OS_PROJECT_DOMAIN_ID=default
  
OS_IMAGE_API_VERSION=2
  
OS_USER_DOMAIN_ID=default
  
OS_PROJECT_NAME=admin
  
OS_PASSWORD=admin
  
OS_AUTH_URL=http://controller:35357/v3
  
OS_USERNAME=admin
  
OS_TENANT_NAME=admin
  
OS_VOLUME_API_VERSION=2
  
$ swift --debug list
  
DEBUG:keystoneclient.auth.identity.v2:Making authentication request to http://controller:35357/v3/tokens
  
INFO:urllib3.connectionpool:Starting new HTTP connection (1): controller
  
DEBUG:urllib3.connectionpool:"POST /v3/tokens HTTP/1.1" 404 93
  
DEBUG:keystoneclient.session:Request returned failure status: 404
  
ERROR:swiftclient:Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID: req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
Traceback (most recent call last):
  
  File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 1235, in _retry
  
self.url, self.token = self.get_auth()
  
  File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 1209, in get_auth
  
    insecure=self.insecure)
  
  File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 406, in get_auth
  
    auth_version=auth_version)
  
  File "/usr/lib/python2.7/dist-packages/swiftclient/client.py", line 341, in get_auth_keystone
  
    raise ClientException('Authorization Failure. %s' % err)
  
ClientException: Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID: req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
Authorization Failure. Authorization Failed: The resource could not be found. (HTTP 404) (Request-ID: req-f62328e5-d8e9-49e6-9b0d-50130c3bcd8d)
  
解决方法:
  
https://bugs.launchpad.net/python-swiftclient/+bug/1470328
  
问题13:
  
安装yum源出现的错误:A
  

  解决方法:
  

  重新安装neutron节点的插件:

  


  

  

  

  

  

  

  

  

  

  使用nova-network方法安装neutron节点:
  

  

  

  使用以下命令时出错:
  
nova network-create demo-net --bridge br100 --multi-host T --fixed-range-v4 255.255.255.0
  
遇到问题
  
执行命令:
  
swift list
  
产生如下错误:
  
1.Traceback (most recent call last):
  
2.File "/usr/bin/swift", line 10, in
  不能定位错误,使用--debug,如下命令
  
swif--debug stat
  

  
解决方法一:
  
检查和创建身份认证服务
  

  

  


  解决方法二:
  

  
解决方法三:
  
swift start 提示Account not found错误
  
查看swift stat
  
Traceback (most recent call last):  File "/usr/bin/swift", line 10, in
  解决方式六:
  

  

  解决方式七:
  

  

  解决方式八:
  

  

  问题14:
  

  解决方法一:
  

  解决方法二:
  可用的解决方案:
  
Setup of this environment is based on installation guide of kilo version. The openstack service on keystone node works just fine but swift doesn't. After then I modified the openstack client enviroment scripts from export OS_AUTH_URL=http://controller:35357/v3 to export OS_AUTH_URL=http://controller:35357/v2.0 the debug info is as below
  
解决方案三:
  

  set OS_AUTH_VERSION=3
  
解决方法参考链接:
  
http://www.aboutyun.com/blog-61-1758.html
  
http://www.aboutyun.com/thread-11692-1-1.html
  
http://bbs.vmsky.com/thread-48297-1-1.html
  
http://www.cnblogs.com/fczjuever/p/3224022.html
  
https://bugs.launchpad.net/python-swiftclient/+bug/1392813
  
https://bugs.launchpad.net/openstack-manuals/+bug/1485278/comments/13
  
https://ask.openstack.org/en/question/54706/swiftclientserviceswifterror-account-not-found/
  
http://blog.csdn.net/evandeng2009/article/details/48775087
  
https://ask.openstack.org/en/question/68565/error-openstack-the-resource-could-not-be-found-http-404-openstack-user-list/
  
https://bugs.launchpad.net/python-swiftclient/+bug/1469974
  
http://www.gossamer-threads.com/lists/openstack/operators/40255
  
https://bugs.launchpad.net/python-swiftclient/+bug/1470328
  
问题15:
  
网络节点和swfit无法正常启动,修改安装源,重新配置配置openstack。
  
参考22日工作日志;
  
问题16:WARNING: swift has no endpoint in ! Available endpoints for this service:
  参考链接:
  
http://blog.csdn.net/linglong0820/article/details/48392119
  
http://docs.openstack.org/liberty/zh_CN/install-guide-rdo/common/app_support.html
  
public-instance
  
ERROR (ClientException): Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.
  
<class 'keystoneclient.exceptions.ConnectionRefused'> (HTTP 500) (Request-ID: req-cd203753-3b91-4c44-9e90-83dd1287261f)
  
解决办法参考链接:
  
https://bugs.launchpad.net/nova/+bug/1519641
  
https://wiki.openstack.org/wiki/Nova/BugsTeam/BugReportTemplate
  
http://docs.openstack.org/liberty/zh_CN/install-guide-rdo/common/app_support.html
  
http://docs.openstack.org/liberty/install-guide-ubuntu/launch-instance-public.html
  
https://bugs.launchpad.net/nova/+bug/1534163
  
https://ask.openstack.org/en/question/85804/liberty-ubuntu-launch-instance-failure-expecting-passwordcredentials/
  
https://bugs.launchpad.net/nova/+bug/1535079
  
https://bugs.launchpad.net/python-keystoneclient/+bug/1309180
  
https://answers.launchpad.net/nova/+question/222498
  
http://nullege.com/codes/search/keystoneclient.exceptions.ConnectionRefused
  参考文献
  http://www.ibm.com/developerworks/cn/cloud/library/1310_zhanghua_openstackswif/
  
http://www.pythontip.com/blog/post/11128/
  
http://blog.csdn.net/zzcase/article/details/6623424
  
http://jingyan.baidu.com/article/624e7459afe5ef34e9ba5a7d.html
  
http://blog.sina.com.cn/s/blog_4cccd8d30102vbr5.html
  
http://www.pythontip.com/blog/post/11128/
  
http://wenku.baidu.com/link?url=iENssQyC_pfmDjByQCvjTDEojCibILR0cFJXMeiiJn7x-V
  
5CF8AsfdFMpqzkpJkWfFQCrFLo4b-pTYRhf41H_0fFFM0 2LqLK6kXCDEkemze
  
http://www.openstack.cn/?p=1065
  
http://www.server110.com/openstack/201403/6926.html
  
http://blog.csdn.net/xiangmin2587/article/details/7737778
  
http://www.aboutyun.com/thread-9264-1-1.html
  
http://www.aboutyun.com/thread-7111-1-1.html
  
http://jingyan.baidu.com/article/624e7459afe5ef34e9ba5a7d.html
  
http://www.xuebuyuan.com/1201872.html
  
http://www.open-open.com/doc/view/264e20cb38854451ac60e275ea64414e
  
http://my.oschina.net/u/138210/blog/144639
  
http://www.verydemo.com/demo_c287_i28027.html
  
http://www.pythontip.com/blog/post/11128/
  
OpenStack 官方安装文档《openstack-install-guide-apt-kilo.pdf》
  
极客学院ujnzhoubing:《http://www.jikexueyuan.com/course/openstack/》
  
https://www.ustack.com/blog/neutron_intro/
  
https://www.ustack.com/blog/neutron_loadbalance/?cm_mc_uid=40971213882214662471179&cm_mc_sid_50200000=1466253986
  
http://www.ibm.com/developerworks/cn/cloud/library/1402_chenhy_openstacknetwor/
  
http://blog.csdn.net/u012336923/article/details/50181713
  
http://bbs.csdn.net/topics/390649427
  
http://stackoverflow.com/questions/29589835/unable-to-establish-a-connection-with-http-controller35357-v2-

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-386712-1-1.html 上篇帖子: html/css 下篇帖子: HTML基础做出属于自己的完美网页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表