From 726496a53b4835d02c9fbeb061e9f66b6b600d8c Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Wed, 21 Nov 2018 21:19:25 +0800 Subject: [PATCH 1/7] Change --- _sidebar.md | 5 - introduction/basic-concepts.md | 23 -- introduction/changelog.md | 22 -- introduction/conditions-of-use.md | 199 ----------- introduction/kirk-sla.md | 143 -------- introduction/prices.md | 92 ----- introduction/product-introduction.md | 46 --- user-guide/namespace.md | 97 ----- user-guide/origin-mode.md | 514 --------------------------- 9 files changed, 1141 deletions(-) delete mode 100644 introduction/basic-concepts.md delete mode 100644 introduction/changelog.md delete mode 100644 introduction/conditions-of-use.md delete mode 100644 introduction/kirk-sla.md delete mode 100644 introduction/prices.md delete mode 100644 introduction/product-introduction.md delete mode 100644 user-guide/namespace.md delete mode 100644 user-guide/origin-mode.md diff --git a/_sidebar.md b/_sidebar.md index de0bd40..0e23d2f 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -1,8 +1,3 @@ -* 产品简介 - * [产品介绍](introduction/product-introduction.md) - * [基本概念](introduction/basic-concepts.md) - * [七牛云用户服务协议](introduction/conditions-of-use.md) - * [容器服务等级协议](introduction/kirk-sla.md) * 快速开始 * [开始创建一个服务](quick-start/create-app.md) * [服务在集群内/集群外的访问](quick-start/cluster-app.md) diff --git a/introduction/basic-concepts.md b/introduction/basic-concepts.md deleted file mode 100644 index df56777..0000000 --- a/introduction/basic-concepts.md +++ /dev/null @@ -1,23 +0,0 @@ -## 区域 {docsify-ignore} -区域标识了用户所创建资源所在的机房位置,用户可以通过切换区域来自主选择机房,当前支持华东一区。 - -## 空间 {docsify-ignore} -Kubernetes的Namespace概念。同一个区域下的多个空间或者多个区域下的同名空间之间资源隔离,进程相互独立。一个用户可以创建多个空间,空间类型包括公开空间和私有空间,公开空间用来管理公开镜像仓库,私有空间用来管理私有镜像仓库。 - -## 集群 {docsify-ignore} -集群由区域和空间唯一确定,即用户创建资源在某个空间下的某个区域内,这些资源所在的主机可以称为是一个集群。集群下资源之间允许做内网访问。 - -## 服务 {docsify-ignore} -Kubernetes的Service概念。服务分为有状态服务和无状态服务。有状态服务可以持久化存储数据,只能单容器实例。无状态服务不能持久化存储数据,可以多容器实例。 - -## 容器 {docsify-ignore} -Container,是docker镜像运行时的实例。 - -## 镜像 {docsify-ignore} -Docker的Image概念。服务打包的标准形式,除了包含服务代码,还包含服务运行所需的库、资源、配置等文件。镜像被集中存储在镜像仓库中。 - -## 公开镜像 {docsify-ignore} -所有七牛容器云注册用户都可以访问拉取的服务镜像。镜像可以在[七牛镜像中心控制台](https://hub.qiniu.com/portal)进行管理,被存储在公开空间下的镜像仓库。 - -## 私有镜像 {docsify-ignore} -只有具备权限的用户才能访问拉取的服务镜像。镜像可以在[七牛镜像中心控制台](https://hub.qiniu.com/portal)进行管理,被存储在私有空间下的镜像仓库。 \ No newline at end of file diff --git a/introduction/changelog.md b/introduction/changelog.md deleted file mode 100644 index 54c4b84..0000000 --- a/introduction/changelog.md +++ /dev/null @@ -1,22 +0,0 @@ -## 2017-12-15 Version 3.0 -**这一版,我们新增了以下服务:** -- **TLB** - -- **告警中心** - -- **GPU服务** - -- **应用市场** - - -## 2017-11-15 Version 2.0 - -**这一版,我们新增了以下服务:** -- **ALB** - -- **域名管理** - -- **API** - - -## 2017-08-31 Version 1.0 - -**七牛容器云面世了,我们很高兴为您提供以下服务:** -- **有状态服务 & 无状态服务** - -- **镜像中心** - -- **配置中心** - -- **监控 & 日志** - -- **私人空间 & 团队空间** - diff --git a/introduction/conditions-of-use.md b/introduction/conditions-of-use.md deleted file mode 100644 index c2d6c6e..0000000 --- a/introduction/conditions-of-use.md +++ /dev/null @@ -1,199 +0,0 @@ -# 七牛云用户服务协议 {docsify-ignore-all} - -本协议是上海七牛信息技术有限公司(以下称“七牛云”)与用户(以下称“您”)就您使用七牛云所提供的各项服务(以下称“七牛云服务”)等相关事宜所签订的具有法律效力的合约。您通过打印件加盖公章并寄回、或在七牛云官方网站(即 www.qiniu.com,以下称“七牛云官网”)相关版面点击确认,或以其它另行约定的方式加以确认后,即表示您与七牛云已达成约定,同意接受本协议所列全部条款内容。在签订本协议之前,请您仔细阅读本协议所列全部条款内容。如果您对本协议的条款内容有疑问,请联系七牛云商务部门垂询,七牛云将为您解释各项条款内容。如果您不同意本协议的任一条款内容,或者无法准确理解七牛云对相关条款的解释,请勿进行后续操作。您知晓进行后续操作或点击确认即视为无条件接受本协议全部条款的约束。 - -## 1. 服务内容 - -1.1 本协议中“服务”指:七牛云向您提供七牛云官网上所展示的对象存储、融合CDN、直播云、数据处理等七牛云服务以及相关的技术支持服务和网络支持服务。 - -1.2 七牛云提供的服务必须符合本协议的说明与约定。未尽事宜,由双方另行签订《七牛云服务合同》约定,其所列条款内容将成为本协议不可分割的部分。如《七牛云服务合同》所列条款内容与本协议所列条款内容有不一致之处,以《七牛云服务合同》为准。 - -## 2. 服务费用 - -2.1 服务费用将根据七牛云官网上现时有效的价格表计算并在订购版面列明,您需在约定的支付期限内通过约定的支付手段支付相应服务费用。 - -2.2 在您未按照约定支付全部服务费用之前,七牛云将保留不向您提供技术支持和/或服务,以及终止技术支持和/或服务的权利。 - -2.3 您完全理解七牛云服务价格体系中所有的赠送服务项目或活动均为七牛云服务在正常服务价格之外的一次性特别优惠,优惠内容不包括赠送服务项目的修改、更新及维护费用,同时赠送服务项目不可折价冲抵服务费用。 - -## 3. 权利义务 - -### 3.1 您的权利、义务 - -3.1.1 您同意遵守本协议以及七牛云官网服务展示版面所列的相关管理规范及流程。您已知晓上述协议及规范等的内容可能会不时变更。如本协议的任何条款内容发生变动,七牛云将提前在七牛云官网适当版面公告并提示您查看修改内容。如您不同意七牛云对本协议相关条款内容所做修改,您有权停止使用七牛云所提供的服务。此种情况下,七牛云将与您进行服务费用结算(如有),并向您提供相关业务数据的下载备份服务。如您继续使用七牛云服务,则视为您接受七牛云对本协议相关条款内容所做的修改。 - -3.1.2 您需按照七牛云官网相关版面提示及本协议的约定支付相应服务费用。 - -3.1.3 您承诺: - -3.1.3.1 如果您利用七牛云提供的服务开展的经营活动需要获得国家有关部门的许可或批准的,必须提前获得相关许可或批准,包括但不限于以下内容: 如果您的网站使用七牛云服务,必须保证您的网站已获得国家有关部门的许可或批准; 如您网站提供非经营性互联网信息服务的,必须提前办理非经营性网站备案,并保证已提交的所有备案信息真实有效,在备案信息发生变化时及时在备案系统中变更备案信息; 如您网站提供经营性互联网信息服务的,还必须提前自行向当地通信管理部门申请并获取经营性网站许可证; 如您网站提供BBS等电子公告服务的,必须根据相关法规政策要求备案或获得相应批准; 如您经营互联网游戏网站的,您应依法申请获得网络文化经营许可证等; 如您从事新闻、出版、教育、医疗保健、药品和医疗器械等互联网信息服务,依照法律、行政法规以及国家有关规定须经有关主管部门审核同意的,您应在申请经营许可或者履行备案手续前,依法经有关主管部门审核同意; - -3.1.3.2 除七牛云明示许可外,不得修改、翻译、改编、出租、传播或转让七牛云提供的软件及授权信息,不得采用逆向工程、反编译或其它手段试图获取七牛云提供的软件的源代码; - -3.1.3.3 如七牛云的服务涉及第三方软件之许可使用的,您同意遵守相关的许可协议的约束; - -3.1.3.4 不散布电子邮件广告、垃圾邮件(SPAM),不利用七牛云提供的服务散发大量不受欢迎的或者未经请求的电子邮件、电子广告或包含反动、色情等有害信息的电子邮件; - -3.1.3.5 不利用七牛云提供的资源和服务上传(UPLOAD)、下载(DOWNLOAD)、储存、发布如下信息或者内容,不为他人发布该等信息提供任何便利(包括但不限于设置 URL、BANNER 链接等): - -3.1.3.5.1 违反国家规定的政治宣传和 / 或新闻信息; - -3.1.3.5.2 涉及国家秘密和 / 或安全的信息; - -3.1.3.5.3 封建迷信和 / 或淫秽、色情、下流的信息或教唆犯罪的信息; - -3.1.3.5.4 博彩有奖、赌博游戏、“私服”、“外挂” 等非法互联网出版活动; - -3.1.3.5.5 违反国家民族和宗教政策的信息; - -3.1.3.5.6 防碍互联网运行安全的信息; - -3.1.3.5.7 侵害他人合法权益的信息和 / 或其他有损于社会秩序、社会治安、公共道德的信息或内容; - -3.1.3.5.8 其他违反法律法规、部门规章或国家政策的内容。 - -3.1.3.6 不建立或利用有关设备,配置运行与所购服务无关的程序或进程,导致大量占用七牛云系统中各种设备的CPU、内存、磁盘或者网络带宽资源,给七牛云系统或者使用七牛云服务的其他用户的网络、服务器(包括但不限于本地、外地和国际的网络、服务器等)、产品或应用等带来严重的负荷,影响七牛云系统与国际互联网或者特定网络、服务器及七牛云系统内部的通畅联系,或者导致七牛云产品与服务或使用七牛云服务的其他用户网站所在的服务器宕机、死机,或者用户基于七牛云服务的产品或应用不可访问等; - -3.1.3.7 不进行任何危害或试图危害网络安全的行为(包括但不限于钓鱼、非法入侵、网络诈骗,网站或空间中含有或涉嫌散播病毒、木马、恶意代码,以及通过虚拟主机对其他网站、主机进行涉嫌攻击行为如扫描、嗅探、ARP 欺骗、DDoS 等); - -3.1.3.8 不进行任何改变或试图改变七牛云提供的系统配置或破坏系统安全的行为; - -3.1.3.9 不从事其他违法、违规或违反七牛云服务协议的行为。 - -3.1.3.10 如七牛云发现您违反上述条款的约定,有权根据情况采取相应的处理措施,包括但不限于立即终止服务或删除相应数据、信息等。 - -3.1.4 您对自己行为(如自行安装的软件和进行的操作)所引起的结果承担全部责任。 - -3.1.5 您对自己存放在七牛云系统中的数据,以及登录和使用七牛云各类产品与服务的口令或密码的完整性和保密性负责。因您维护不当或保密不当致使上述数据、口令、密码等丢失或泄漏所引起的一切损失和后果均由您自行承担。 - -3.1.6 您应向七牛云提交执行本协议的责任人,以及网站、网络各类产品与服务的联络人员名单。如以上人员发生变动,您须自行更新变动后的信息并及时通知七牛云。因您提供的联络人信息不真实、不准确、不完整,以及因以上人员的行为或不作为而产生的一切后果,均由您自行承担。 - -3.1.7 您须依照《互联网信息服务管理办法》、《信息网络传播权保护条例》、《互联网直播服务管理规定》等法律法规的规定保留自己网站的访问日志记录,包括发布的信息内容及其发布时间、互联网地址(IP)、域名等,国家有关机关依法查询时应配合提供。您应自行承担未按规定保留相关记录而引起的全部法律责任。 - -3.1.8 您了解七牛云无法保证其所提供的服务毫无瑕疵(如七牛云安全产品并不能保证您的硬件或软件的绝对安全),同时七牛云承诺不断提升服务质量与服务水平。所以您同意:即使七牛云提供的服务存在瑕疵,但上述瑕疵是当时行业技术水平所无法避免的,其将不被视为七牛云违约。您同意和七牛云一同合作解决上述瑕疵问题。 - -3.1.9 数据备份系您的义务和责任,七牛云系统具有数据备份功能不意味着数据备份是七牛云的义务。七牛云不保证完全备份用户数据,亦不对用户数据备份工作或结果承担任何责任。 - -### 3.2 七牛云的权利、义务 - -3.2.1 七牛云应按照协议约定提供服务。 - -3.2.2 服务期限内,七牛云将为您提供如下客户服务: - -3.2.2.1 七牛云为付费用户提供7*24售后故障报修服务,为付费用户提供有效联络方式,保证付费用户能够及时联系到故障报修联络人。故障报修联络人在确认故障现象后及时修复和反馈; - -3.2.2.2 七牛云提供 7*24 小时的在线工单服务系统,解答用户在使用服务过程中产生的问题。 - -3.2.3 七牛云将消除您非人为操作所出现的故障,但因您原因和/或不可抗力以及非七牛云控制范围之内的原因所导致的故障除外。 - -3.2.4 七牛云应严格遵守保密义务。 - -## 4.用户数据的保存、销毁与下载 - -4.1 为服务您的目的,七牛云可能通过使用您数据的方式,向您提供服务,包括但不限于向您发出产品和服务信息。 - -4.2 您的用户数据将在下述情况下部分或全部被披露: - -4.2.1 经您同意,向第三方披露; - -4.2.2 根据法律法规的有关规定,或者应行政或司法机构的合法要求,向第三方或者行政、司法机构披露; - -4.2.3 如您的经营活动出现违反中国有关法律法规的情况,需要向第三方披露; - -4.2.4 为提供您所要求的软件或服务,而必须和第三方共用您的数据。 - -4.3 除法定及七牛云和您另行约定外,自本协议执行期满或因任何原因导致本协议提前终止之日起的 30 个自然日内,七牛云将继续存储您的数据,逾期将不再保留您数据,您需自行承担其数据被销毁后引发的一切后果。 - -## 5.知识产权 - -5.1 您应保证提交七牛云的素材、对七牛云服务的使用及使用七牛云服务所产生的成果等未侵犯任何第三方的合法权益。如有任何第三方基于侵犯其合法权益或因您违反中国法律法规或其他适用的法律等原因而向七牛云提起索赔、诉讼或可能向七牛云提起诉讼, 则您应使七牛云完全免责,并应赔偿七牛云因此所遭受的全部损失。 - -5.2 如果有任何第三方对您使用七牛云服务及其相关素材的知识产权归属提出质疑或投诉,您有责任出具相关知识产权证明材料,并配合七牛云处理相关投诉工作。 - -5.3 您承认七牛云向您提供的任何资料、技术或技术支持、软件、服务等的知识产权均属于七牛云或第三方所有。除七牛云或第三方明示同意外,您无权复制、传播、转让、许可或提供他人使用上述资源,否则必须承担相应的责任。 - -## 6.保密条款 - -6.1 保密信息指由一方向另一方披露的所有技术及非技术信息(包括但不限于产品资料,产品计划,价格,财务及营销规划,业务战略,客户信息,客户数据,研发,软件硬件,API应用数据接口,技术说明,设计,特殊公式,特殊算法等)。 - -6.2 本协议任何一方同意对获悉的对方之上述保密信息予以保密,并严格限制接触上述保密信息的员工遵守本协议之保密义务。除非国家机关依法强制要求或上述保密信息已经进入公有领域外,接受保密信息的一方不得对外披露。 - -6.3 本协议双方明确认可各自用户信息和业务数据等是各自的重要资产及重点保密信息。本协议双方同意尽最大的努力保护上述保密信息等不被披露。一旦发现有上述保密信息泄露事件,双方应合作采取一切合理措施避免或者减轻损害后果的产生,并且泄露方应承担由此给保密材料所有方造成的损失。 - -6.4 本条款不因本协议的终止而失效。 - -## 7.期限与终止 - -7.1 服务有效期自七牛云收到您支付七牛云服务款项之日起计算,并以款项数额及现时有效的七牛云服务价格体系为依据确认相应服务期限。 - -7.2 自服务到期日起,该服务所占用的存储空间资源仍会继续按日计费。 - -7.2.1 您的账户余额小于当前消费金额时,七牛云系统将自动对账户执行冻结操作。详细说明请参见《欠费和冻结问题》:[https://support.qiniu.com/question](https://support.qiniu.com/question) - -7.2.2 您必须在账号冻结后的30个自然日内及时解除账户冻结状态,否则七牛云将视为您主动放弃七牛云服务,本协议将终止,存储空间将被回收,存储空间内的数据会被删除清零,且不可恢复。如果在冻结起的 30 个自然日内,您成功解除账户冻结状态,则七牛云服务及数据可以继续正常使用。其中,将以您支付的款项(扣减欠费部分后)为依据确认新的服务期限。 - -7.3 发生下列情形,服务期限提前终止: - -7.3.1 双方协商一致提前终止的; - -7.3.2 您严重违反本协议(包括但不限于 1. 您未按照协议约定履行付款义务,及/或 2. 您严重违反法律法规的强制性规定等),七牛云有权提前终止服务,同时不退还您已经支付的费用; - -7.3.3 您理解并充分认可,虽然七牛云已经建立(并将根据技术的发展不断完善)必要的技术措施来防御包括计算机病毒、网络入侵和攻击破坏(包括但不限于DDoS)等危害网络安全事项或行为(以下统称该等行为),但鉴于网络安全技术的局限性、相对性以及该等行为的不可预见性,因此如因您网站遭遇该等行为而给七牛云或者七牛云的其他用户的网络或服务器(包括但不限于本地及外地和国际的网络、服务器等)带来危害,或影响七牛云与国际互联网或者七牛云与特定网络、服务器及七牛云内部的通畅联系,七牛云可决定暂停或终止服务。 - -7.3.4 七牛云可提前 30 天在七牛云官网上通告、给您发网站内通知以及邮件通知等方式终止本协议。届时七牛云将把您已支付但未消费的款项退还您指定的银行账户或其它可收款账户中。 - -7.4 当您因欠费而被终止服务后,您仍应将欠缴的费用付清。否则,七牛云将保留按照您未付费用的万分之五的标准,按日向您收取滞纳金的权利。 - -## 8.违约责任 - -8.1 本协议任何一方违约均须依法承担违约责任。 - -8.2 如果因七牛云原因造成您不能正常使用七牛云服务的,七牛云以小时为单位向您赔偿损失,即连续达1小时不能正常提供服务的,延长一小时的服务期(以此类推)。如果因七牛云原因造成您连续72小时不能正常使用服务的,或因七牛云硬件故障而给您造成损失(非因七牛云过错造成的故障除外),您可以终止接受服务并可以要求赔偿损失,但非七牛云控制之内的原因引起的除外。 - -8.3 在任何情况下,七牛云均不对任何间接性、后果性、惩戒性、偶然性、特殊性的损害,包括您使用七牛云服务而遭受的利润损失承担责任(即使您已被告知该等损失的可能性)。 - -8.4 在任何情况下,七牛云对本协议所承担的违约赔偿责任总额不超过向您收取的违约所涉服务之年服务费总额的 25%。 - -## 9.免责条款 - -### 9.1 不可抗力 - -9.1.1 不可抗力系指不能预见、不能避免或不能克服的客观事件,包括但不限于自然灾害如洪水、火灾、爆炸、雷电、地震、风暴、海啸等自然灾害,社会事件比如罢工、封锁、劳资纠纷、战争、动乱、政府禁令或区域性的紧急状态等。 - -9.1.2 因不可抗力而全部或部分不能履行本协议或迟延履行本协议时,发生不可抗力的一方在不可抗力的影响范围内得以免除责任,但该方应在上述情况发生后应及时书面通知他方不可抗力发生的情况并提供有效证明。各方按不可抗力对本协议的影响程度,协商是否终止或修改本协议,以及是否免除或部分免除受不可抗力影响一方在本协议项下的义务。 - -9.1.3 遭受不可抗力的一方应采取一切必要措施减少损失,并在事件消除后立即恢复本协议的履行,除非此等履行已不可能或不必要。 - -### 9.2 责任限制 - -9.2.1 您确认因以下情形造成七牛云服务中断或其他影响,不属于七牛云违约,七牛云无须承担任何责任: - -9.2.1.1 因您的源站点故障或您自行进行平台设置调整等您的原因所造成的七牛云服务不可用; - -9.2.1.2 因按您要求的配置进行调试,如配置不合理造成的七牛云服务不可用; - -9.2.1.3 七牛云或者电信部门在进行七牛云所有IDC配置、网络维护时需要短时间中断服务,或者由于互联网上通路的阻塞造成您IDC访问速度下降或中断,您均认同是正常情况,不属于七牛云违约; - -9.2.1.4 鉴于计算机及互联网的特殊性,因黑客、病毒、电信部门技术调整等引致的服务中断或其他影响服务与安全等问题,您认同不属于七牛云违约; - -9.2.1.5 因不可抗力造成的七牛云服务不可用。 - -9.2.2 由于您违反国家法律规定,七牛云有权随时根据国家相关管理机构的要求,或其他第三方权利主体出具的具备法律效力的公函证明、司法文件等所载明的强制性责任,随时暂停或终止向您提供服务,您同意由此引起的一切后果和责任与七牛云无关。对于因此造成您损失的,七牛云无须承担任何责任。 - -9.2.3 您确认,七牛云服务过程中仅对数据进行经授权的分发、传输、缓存、参数处理等工作,而不会私自对数据内容本身进行加工。如您在使用七牛云提供的服务过程中,发生侵权或违反国家法律、法规或公共道德的行为,您认可此与七牛云无关,七牛云对此不承担任何责任。基于云加速的技术特点,七牛云在向您源站点自动获取或由您主动推送的加速内容,您应自行采取备份措施,即您应对原始数据进行妥善备份。对于您源站点的原始数据损失,七牛云不承担任何责任。 - -9.2.4 在履行本协议时,双方仅对协议相对方负责而无需对双方之外的第三方承担责任或履行义务。七牛云对因第三方的作为或不作为而给您造成的损失不负责任,对通过您间接接受七牛云服务的第三方的损失不承担任何责任。 - -9.3 免责条款在本协议终止后仍然有效。 - -## 10.法律适用及争议解决 - -10.1 本协议的订立、效力、解释、履行和争议的解决均适用中华人民共和国法律、法规、电信管理部门的规定和计算机行业的规范。 - -10.2 在执行本协议过程中如发生纠纷,双方应友好协商解决。协商不成时,任何一方可直接向上海市浦东新区人民法院提起诉讼。 - -## 11.附则 - -11.1 本协议附件(如有)、七牛云官网相关版面上的服务说明、价格说明和您确认同意的订购版面等是本协议不可分割的一部分,与本协议具有同等法律效力。如果有任何前述约定与本协议有不一致之处,以本协议附件(如有)、七牛云官网在相关版面上的服务说明、价格说明和您确认同意的订购版面为准。此外,在上述文件中,本协议附件(如有)具有最高效力。 - -11.2 本协议中在性质上或其他方面理应地在本协议终止时继续存在的条款,应视为“继续存在的条款”,这些条款包括但不局限于保密、知识产权、法律适用和争议解决条款。 \ No newline at end of file diff --git a/introduction/kirk-sla.md b/introduction/kirk-sla.md deleted file mode 100644 index a2aaaf1..0000000 --- a/introduction/kirk-sla.md +++ /dev/null @@ -1,143 +0,0 @@ -# 七牛容器云服务等级协议 {docsify-ignore-all} - -## 1. 服务内容 - -七牛容器云服务,是七牛云自主研发的云计算平台,提供应用市场、负载均衡、弹性伸缩、镜像管理、日志&监控等功能,能够有效帮助企业轻松管理资源配置,快速实现应用交付,秒级响应业务变化,有效提高运维效率。用户通过实际使用的资源量进行付费。 - -## 2. 定义 - -2.1 服务指七牛容器云根据本协议向开发者提供的付费服务(未付费情况,不适用本协议)。 - -2.2 用户指使用七牛云提供的云服务或产品的个人、法人或其他组织。 - -## 3.指标项 - -### 3.1 数据可靠性 - -七牛云产品的数据可靠性不低于 99.99999999%,即用户保存的每一百亿个文件中每月最多只有一个文件有丢失的可能性。 - -### 3.2 数据可销毁性 - -3.2.1 在用户主动删除数据或用户服务期满后需要销毁数据,七牛容器云将自动清除对应物理服务器上磁盘和内存数据,使得数据无法恢复。 - -3.2.2 云服务所在的设备报废弃置、委外维修或转售前,将对其物理磁盘采用每扇区重写 3 次工作,每次销毁操作均有二位同事进行,一位操作,一位监督,确保操作的完整性。 - -### 3.3 数据可迁移性 - -支持镜像仓库的远程复制。 - -### 3.4 数据私密性 - -七牛容器云支持多租户之间的资源、网络隔离,通过一系列数据链路层、网络层访问控制技术实现租户间资源的隔离。 - -### 3.5 数据知情权 - -用户对于数据、备份数据所在数据中心地理位置、数据备份数量,具有知情权。用户对数据的访问数量,流量,以及数据量的大小具有知情权。 - -### 3.6 数据可审查性 - -依据现行法律法规或根据政府监管部门监管、安全合规、审计或取证调查等原因的需要,在符合流程和手续完备的情况下,七牛容器云可以提供用户所使用的服务的相关信息,包括关键组件的运行日志、运维人员的操作记录、用户操作记录等信息。 - -### 3.7 服务可用性 - -3.7.1 七牛容器云保证产品服务可用性达到99.9%。 - -3.7.2 服务可用性按照1个服务周期进行计算,1个服务周期为1个自然月,如不满1个自然月则不计算为1个服务周期。服务可用性和不可用性的统计时间最小单位为分钟。 - -3.7.3 服务可用性 = 服务可用时长 / (服务可用时长 + 服务不可用时长) - -3.7.4 服务不可用达到5分钟以上,则该时间段才计入服务不可用时长。且服务不可用不包括系统日常维护时间和由于用户操作不当或不可抗力导致的服务不可用。 - -### 3.8 故障恢复能力及客服保证 - -七牛容器云为用户提供24小时全天候的运行维护,并以在线自助工单系统、客服电话保障等方式提供技术支持。七牛云具备完善的故障监控、自动报警、快速定位、快速恢复等一系列故障应急响应机制。 - -客服咨询电话:400-808-9176;服务时间:7*24小时 - -### 3.9 服务资源调配能力 - -七牛容器云可调配CPU、内存、网络、存储资源。 - -### 3.10 网络接入性能 - -七牛容器云对用户不限制公网出口带宽,采用多线接入,保障用户的网络接入质量。 - -### 3.11 服务计量准确性 - -七牛容器云服务具备准确、透明的计量计费系统。根据用户的实际使用量据实结算,价格及计费模式见七牛云官网。 - -## 4.服务赔偿 - -### 4.1 赔偿范围 - -因七牛容器云设备故障、设计缺陷或操作不当导致用户所购买的容器务无法正常使用,七牛容器云将对不可用时间进行赔偿,但不包括以下原因所导致的服务不可用时间: - -4.1.1 七牛云预先通知用户后进行系统维护所引起的,包括割接、维修、升级和模拟故障演练; - -4.1.2 任何七牛云所属设备以外的网络、设备故障或配置调整引起的; - -4.1.3 用户的应用程序或数据信息受到黑客攻击而引起的; - -4.1.4 用户维护不当或保密不当致使数据、口令、密码等丢失或泄漏所引起的; - -4.1.5 用户自行升级操作系统所引起的; - -4.1.6 用户的应用程序或安装活动所引起的; - -4.1.7 用户的疏忽或由用户授权的操作所引起的; - -4.1.8 不可抗力以及意外事件引起的; - -4.1.9 其他非七牛云原因所造成的不可用。 - -### 4.2 赔偿方案 - -赔偿方案: 七牛云将按照服务不可用时间的 100 倍赔偿,即赔付的金额=发生故障前一个自然日的故障时间的平均每 5 分钟费用 x 服务不可用时间 (每五分钟为一个单位) x 100 倍 。 - -特殊说明: - -4.2.1 赔偿只针对已经使用七牛容器云服务并且支付费用的用户;以七牛云抵用券形式赔偿。 - -4.2.2 服务不可用时间 = 故障开始时间 - 故障结束时间,不可用时间按照每五分钟为单位计算,不足五分钟的以五分钟计算。 - -4.2.3 如果用户没有使用到 24 小时,按照实际使用时长计算平均每五分钟的费用。 - -## 5.免责声明 - -详见《七牛云用户服务协议》中"免责条款"部分的相关内容。 - -## 6.其他 - -6.1 本协议一经公布立即生效,七牛云有权随时对协议内容进行修改。如用户不同意七牛云对本协议相关内容所做的修改,用户有权停止使用七牛云数据处理服务。若用户继续使用七牛云数据处理服务,则视为用户接受七牛云对本协议相关内容所做的修改。 - -6.2 本协议项下七牛容器云服务对于用户所有的通知均可通过网页公告、站内信、电子邮件、手机短信或其他方式进行;该通知于发送之日视为已送达收件人。 - -6.3 本协议签订地为中华人民共和国上海市浦东新区。 - -6.4 本协议的订立、执行和解释及争议的解决均应适用中国法律并受中国法院管辖。若用户和七牛云之间发生任何纠纷或争议,首先应友好协商解决;协商不成功的,双方均同意将纠纷或争议提交本协议签订地有管辖权的人民法院管辖。 - -6.5 本协议构成双方对本协议之约定事项及其他有关事宜的完整协议,除本协议规定的之外,未赋予本协议各方其他权利。 - -6.6 如本协议中的任何协议无论因何种原因完全或部分无效或不具有执行力,本协议的其余部分仍应有效并且有约束力。 - - - - - - - - - - - - - - - - - - - - - - diff --git a/introduction/prices.md b/introduction/prices.md deleted file mode 100644 index 966a165..0000000 --- a/introduction/prices.md +++ /dev/null @@ -1,92 +0,0 @@ -# 计费方式 -当前支持两种付费方式:**按量付费**和**资源包付费**。 - -?>**按量付费:**无需提前估量可能使用的资源数,随时创建,随时释放,根据实际使用的资源量,在每个自然月的月初支付上个月的费用。
- **资源包付费:**资源包不与具体的资源实例绑定,同一种资源规格的实例可以同时消耗一类资源包 -**** - -## 按量付费 -按量付费是一种先使用后付费方式,不需要用户提前估量资源的使用量,随时创建,随时释放。 - -### 适用资源 -**计算资源:**容器实例,规格中包含CPU核数、内存容量、GPU类型、GPU卡数中的部分信息
-**存储资源:**数据卷,规格中包含SSD云盘容量
-**网络资源:**负载均衡,规格中包含负载均衡实例数、公网带宽、公网流量
- -### 计费周期 -按量付费从资源创建成功后开始计费,资源释放结束后停止计费,计量的时间精度为秒。
-多种计费资源拥有不同的价格单位,参考如下:
-**容器实例:** 元/小时,计量精度为秒
-**存储卷:** 元/(GB\*小时),计量精度为秒
-**负载均衡实例:** 元/小时,计量精度为秒
-**公网带宽:** 元/小时,计量精度为秒,带宽范围为[1Mbps,1000Mbps]
-**流量:** 元/GB,计量精度为Byte
- -?>其中容器实例会在「停止服务」的时候自动释放。因此,当服务的状态为**已停止**时,并不会收取该服务的容器实例费用。当重新启动服务时,新的容器实例被创建成功,才开始恢复计费。 - -### 结算周期 -按量付费的结算周期为一个自然月。针对某一种资源规格,系统会自动汇总一个自然月内该种资源规格所有实例的使用量,并统一结算。
- -例如:
-5日12时30分30秒 1U1G的**容器实例1**被创建成功
-5日13时30分30秒 **容器实例1**被成功释放
-25日8时31分20秒 1U1G的**容器实例2**被创建成功;1U2G的**容器实例3**被创建成功
-25日8时32分20秒 **容器实例2**被成功释放;**容器实例3**被成功释放
-**则1个自然月内,1U1G的容器实例计量为3660秒,1U2G的容器实例计量为60秒。** -*** - -## 资源包付费 -资源包付费是一种先付费再使用的方式,消耗单位为秒。 - -### 适用资源 -**计算资源:**容器实例,规格中包含CPU核数、内存容量、GPU类型、GPU卡数中的部分信息
-**存储资源:**数据卷,规格中包含SSD云盘容量
-**网络资源:**负载均衡,规格中包含公网带宽
- -!>网络资源中,**负载均衡实例**和**公网流量**不参与资源包付费模式 - -### 计费周期 -资源包付费的计费周期与购买的资源包时长、相关资源实例数有紧密的关系,这些都会影响到一个资源包的真实计费时长。
- -- 资源包的起始计费时间为创建成功一个符合资源包规格的资源
-例如:
-5月5日12时30分30秒 购买了一个1U1G的720小时**资源包1**
-5月25日12时30分30秒 1U1G的**容器实例1**被创建成功
-6月24日12时30分30秒 **资源包1**使用完毕
- -- 资源包的最长使用失效不超过这个资源包本身的时长
-例如:
-5月5日12时30分30秒 购买了一个1U1G的720小时**资源包1**
-5月25日12时30分30秒 1U1G的**容器实例1**被创建成功
-5月26日12时30分30秒 1U1G的**容器实例1**被释放成功
-6月24日12时30分30秒 **资源包1**使用过期
- -- 资源包不绑定单个资源实例,多个实例可以共享一个资源包
-例如:
-5月5日12时30分30秒 购买了一个1U1G的720小时**资源包1**
-5月25日12时30分30秒 1U1G的**容器实例1**被创建成功;1U1G的**容器实例2**被创建成功
-6月9日12时30分30秒 **资源包1**使用完毕
- -### 计费方式 -资源包付费允许同一种规格的多个资源实例能够共享一个资源包。
-适用的资源包括:
-- 所有的计算资源,即CPU容器实例(如1U1G)和GPU容器实例(如1U1G1P4) -- 所有的存储资源,即存储卷(如10GB)
- -?> 另外由于存储卷的不同规格是线性计费,所以所有规格的存储卷实例都能够共享一个资源包。
-例如:
-5月5日12时30分30秒 购买了一个10GB的720小时**资源包1**
-5月25日12时30分30秒 10GB的**存储卷实例1**被创建成功;20GB的**存储卷实例2**被创建成功
-6月4日12时30分30秒 **资源包1**使用完毕
- -- 部分网络资源,即公网带宽实例(如50Mbps) - -### 资源包余量不足以及使用完毕 -当存在资源包余量不足时,系统会自动发送提醒邮件,请及时购买新的资源包。
-如果资源包使用完毕,接下来将对运行中的资源采取按量付费的方式进行计费。
- -### 购买资源包 -如需购买资源包,联系销售或者发送邮件到qcos-pd@qiniu.com。 - - - diff --git a/introduction/product-introduction.md b/introduction/product-introduction.md deleted file mode 100644 index 88cfe0c..0000000 --- a/introduction/product-introduction.md +++ /dev/null @@ -1,46 +0,0 @@ -## 产品概述 - -七牛容器公有云服务是基于Docker容器技术和Kubernetes容器编排技术的云计算平台。平台实现了一套完整的应用生命周期管理方案,同时集成了应用运行所需的周边服务产品,包括日志、监控、告警中心、负载均衡、域名管理、域名证书管理等。用户可以通过交互界面、API两种方式实现对资源的创建、管理和删除。 - -## 产品架构 - -![产品架构](_figures/introduction/product-architecture.png) - -作为PaaS平台基础框架,七牛容器服务实现了资源统一管理和调度,为用户提供标准化的高可用基础服务,可以承载海量应用,为应用提供智能运维、快速部署、微服务化支撑。 -支持的服务类型包括CPU服务和GPU服务。创建方式除了基于服务镜像之外,也可以将多个服务的配置和调用关系固化为模版,通过模版一键启动应用,实现在多个集群间的快速部署。 - -## 产品优势 - -* **高可靠、高并发** - -平台已经支撑公司内部多条服务线,在实践中验证了平台的高可靠、高并发特性,其中包括入口带宽达10Gbps的大数据公有云服务,日请求量达百亿次的多媒体转码服务,服务组件数量达500个以上的持续交付平台,日训练任务达1000个以上的人工智能训练平台。 - -* **大规模容器集群** - -平台当前在公司四大机房部署了2000个以上的主机节点。其中单集群支持的节点数可达1000个以上,管理容器数量达10w个以上。 - -* **支持CPU和GPU两类服务** - -平台同时支持CPU和GPU两类服务的统一管理,两种资源容器都支持智能调度策略到主机。 - -* **便捷接入方式** - -平台提供了简易的交互式界面和丰富的API接口,两种方式都能够降低用户对Docker和Kubernetes的使用门槛,使聚焦于业务代码本身。 - -## 产品特点 - -* **多应用统一资源池** - -七牛容器服务提供了一套可视化资源管理平台,所有应用可以被统一管理在一个平台上,且底层资源全部实现了池化,包括CPU、内存、硬盘存储、负载均衡等。资源可以被按需手动分配,以及根据动态资源规则实现回收和扩容。 - -* **多种租户隔离能力** - -支持多个部门、厂商、合作伙伴之间的多种资源隔离方式,包括用户鉴权、网络、存储、主机,保障应用和数据的安全性。 - -* **快速应用交付能力** - -支持应用交付链路中多个环节的自动化配置,包括从代码源到镜像的自动构建规则,镜像构建完成后的webhook调度信息。 - -* **智能运维** - -支持多个维度的监控和日志数据,包括主机、底层资源、系统组件等。同时具有基于监控指标,定义告警通知的能力。容器自身具备健康检查的机制,出现指标异常能够主动实现摘除路由,重启,加回路由一连串的恢复行为。 \ No newline at end of file diff --git a/user-guide/namespace.md b/user-guide/namespace.md deleted file mode 100644 index 3bc5cf3..0000000 --- a/user-guide/namespace.md +++ /dev/null @@ -1,97 +0,0 @@ -# 3.12 空间管理 -空间管理可以允许用户对跟自己账户相关的空间进行操作,操作的范围跟账户在空间下的「角色」有关。另外,每个账户最多可以存在于3个空间下,这3个空间包括账户自己创建的空间和其他用户的空间。 - -?>「空间」是Kubernetes的Namespace概念。同一个区域下的多个空间或者多个区域下的同名空间之间资源隔离,进程相互独立。 -*** - -## 3.12.1 属性说明 -### 3.12.1.1 空间属性 -空间自身的属性,包含空间名、空间类型、描述信息。 - -**1. 空间名:**空间一旦创建完成,「空间名」就不能被修改。 - -!> **命名规则:**2-30位的小写字母、数字或"-",不能以"-"开头 - -**2. 空间类型:**当前空间的使用模式,分为简易模式和原生模式,且只能为其中的一种。空间一旦创建完成,不能被修改。 - -?> **简易模式:**使用平台的可视化简易操作
- **原生模式:**使用kubernetes原生的dashboard和kubectl - -**3. 描述信息:**用户自定义的空间描述信息,可以通过「编辑」操作进行修改。 - -**4. 关联的扣费账户:**当前空间下如果产生费用,将从该账户的余额中扣除。 - -**空间创建后,如何指定关联的扣费账户?**
-空间创建后,会默认指定空间创建人的账户为扣费账户。如果想要更换扣费账户,请发邮件到qcos-pd@qiniu.com,由相关工作人员处理。 - -### 3.12.1.2 空间人员属性 -空间人员在空间内的属性,包含邮箱、角色。 - -**1. 邮箱:**账户在平台注册/登入时的邮箱地址。 - -**2. 角色:**当前空间下账户的角色信息,分为管理员和成员。 - -?> **管理员:**能够操作空间下组件资源,也能够进行人员管理。一个空间下要保证至少有一名管理员。
- **成员:**能够操作空间下组件资源,但是不能进行人员管理。 -*** - -## 3.12.2 如何创建空间 -操作如下: - -**1)点击控制台左边栏的「空间管理」,切换至空间管理界面** - -**2)点击「新建空间」,开始创建一个新的空间** - -!> **每个账户最多可以存在于3个空间下:**如果列表中已经存在3个空间,用户将不能主动创建新的空间和被拉取到他人空间
-*** - -## 3.12.3 如何编辑空间描述信息 -操作如下: - -**1)点击控制台左边栏的「空间管理」,切换至空间管理界面** - -**2)点击目标空间最右侧的「编辑」** -*** - -## 3.12.4 如何添加人员到空间 -只有「管理员」才有权限添加人员到空间,如果你已经是管理员,可以操作如下: - -**1)点击控制台左边栏的「空间管理」,切换至空间管理界面** - -**2)点击目标空间右侧的「人员管理」,进入人员管理界面** - -**3)点击「添加人员」,开始添加一个新的人员到空间** - -!> 添加人员之前请一定确保人员ID正确,否则可能导致ID不存在或者添加了其他人员进入空间。 - -**如何查看ID信息?** - -**1)点击控制台左边栏的「账户中心」,切换至个人账户中心** - -![](_figures/user-guide/account-id-information.jpg) - -*** - -## 3.12.5 如何修改人员角色 -当前人员角色分为「管理员」和「成员」。只有「管理员」才能够修改人员角色,如果你已经是管理员,可以操作如下: - -**1)点击控制台左边栏的「空间管理」,切换至空间管理界面** - -**2)点击目标空间右侧的「人员管理」,进入人员管理界面** - -**3)点击目标人员右侧的「角色管理」,就可以对当前人员的角色进行更改** - -!> 如果当前空间下有且只有一名管理员时,管理员在指定一名新的管理员之前,不能对自身做角色修改。 -*** - -## 3.12.6 如何将人员移出空间 -只有「管理员」才有权限将人员移出空间,如果你已经是管理员,可以操作如下: - -**1)点击控制台左边栏的「空间管理」,切换至空间管理界面** - -**2)点击目标空间右侧的「人员管理」,进入人员管理界面** - -**3)点击目标人员右侧的「移出空间」** - -!> 如果当前空间下有且只有一名管理员时,管理员在指定一名新的管理员之前,不能够将自己移出空间。 -*** \ No newline at end of file diff --git a/user-guide/origin-mode.md b/user-guide/origin-mode.md deleted file mode 100644 index ec3ce0e..0000000 --- a/user-guide/origin-mode.md +++ /dev/null @@ -1,514 +0,0 @@ -# 3.14 原生模式 -原生模式提供了一种通过kubernetes的dashboard和kubectl来接管七牛容器集群的方式。通过这种方式,如果你已经习惯于使用kubenetes的原生工具,可以通过原生工具的方式来管理你在七牛容器云上的资源。 - -!> 如果要使用原生模式,在创建空间时请选择空间类型为「原生模式」。 - -**kubectl介绍说明:**https://kubernetes.io/docs/reference/kubectl/overview/
-**dashboard介绍说明:**https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ -*** - -## 3.13.1 属性说明 -### 3.13.1.1 dashboard的接入 -dashboard是kubenetes原生支持的可视化界面。 - -**1. 适用范围:**当前空间。在某个原生空间下「打开dashboard」,用户通过dashboard只能操作该空间资源。 - -**2. 集群kubernetes版本:**当前集群的kubernetes版本号。 - -### 3.13.1.2 kubectl的接入 -kubectl是kubenetes原生支持的命令行工具。 - -**1. 适用范围:**当前集群。在某个集群的某个原生空间下「导出kubeconfig文件」,系统会自动将该原生空间名写入config文件,这意味着操作这个原生空间时,所有的kubectl命令中无须带`-n xxxxx`的空间名信息。而操作同集群下其他原生空间时,就需要在所有的kubectl命令中携带`-n xxxxx`的空间名信息,来指定该命令所要操作的空间。 - -**2. 集群kubernetes版本:**当前集群的kubernetes版本号。 -*** - -## 3.13.2 如何下载并安装kubectl工具 -### 3.13.2.1 下载并kubectl工具 - -我们提供kubectl工具的内网下载方式,支持的版本为**v1.7.16**、**v1.9.3**、**v1.11.0**。
- -!> 请保证使用的kubectl工具版本和集群的kubernetes版本一致。 - -#### MacOS - -**1)通过命令行下载kubectl** - -`curl -LO http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release//darwin/amd64/kubectl` - -例如当前集群为v1.7.16,则命令行如下:
-`curl -LO http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release/v1.7.16/darwin/amd64/kubectl` - -**2)将其变为可执行文件** - -`chmod +x ./kubectl` - -**3)将二进制文件移动到环境变量的PATH中** - -`sudo mv ./kubectl /usr/local/bin/kubectl` - -#### Linux - -**1)通过命令行下载kubectl** - -`curl -LO http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release//linux/amd64/kubectl` - -例如当前集群为v1.7.16,则命令行如下:
-`curl -LO http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release/v1.7.16/linux/amd64/kubectl` - -**2)将其变为可执行文件** - -`chmod +x ./kubectl` - -**3)将二进制文件移动到环境变量的PATH中** - -`sudo mv ./kubectl /usr/local/bin/kubectl` - -#### Windows - -**1)通过浏览器下载kubectl** - -在下面的链接中正确补充``后,通过浏览器可以直接下载可执行文件。
-`http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release//windows/amd64/kubectl.exe` - -例如当前集群为v1.7.16,则下载地址为:
-`http://oyh1cogl9.bkt.clouddn.com/install/kubectl-release/v1.7.16/windows/amd64/kubectl.exe` - -**2)将二进制文件移动到环境变量的PATH中** - -### 3.13.2.2 验证是否成功安装kubectl -输入以下命令,查看当前安装的kubectl版本 - -`kubectl version` - -例子:如果是MacOS,显示如下 - -`Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"darwin/amd64"} -` -*** - -## 3.13.3 如何配置kubectl接入集群 -首先要保证账号下存在原生模式的空间。 - -### 3.13.3.1 导出集群kubeconfig文件 -操作如下: - -**1)点击控制台上边栏的「集群」,下拉选择需要对接kubectl的集群** - -**2)点击控制台上边栏的「空间」,下拉选择当前集群下的任意一个原生模式空间** - -**3)点击控制台左边栏的「原生模式」,切换至原生模式界面** - -**4)点击「导出kubeconfig文件」** - -!> kubeconfig文件中需要保存你的AK/SK秘钥用于鉴权登入
- -**5)点击「同意」,导出kubeconfig文件到本地** - -### 3.13.3.2 kubeconfig文件在本地的配置 -操作如下: - -#### MacOS -**1)创建子目录`~/.kube/`** - -`mkdir ~/.kube/` - -**2)通过命令行移动kubeconfig文件到`~/.kube/`下** - -`mv ~//config ~/.kube/` - -#### Linux -**1)创建子目录`~/.kube/`** - -`mkdir ~/.kube/` - -**2)通过命令行移动kubeconfig文件到`~/.kube/`下** - -`mv ~//config ~/.kube/` - -#### Windows -**1)更改kubectl寻找配置文件的位置(配置KUBECONFIG环境变量)** - -`$env:KUBECONFIG=""` - -### 3.13.3.3 验证是否成功接入集群 -输入以下命令,如果有URL被返回,则表示kubectl已经可以接入集群。 - -`kubectl cluster-info` -*** - -## 3.13.4 如何使用「TCP 负载均衡」 -在原生模式下,可以使用下述的方式来创建简易模式下对应的负载均衡资源。 - -### 3.13.4.1 TCP 负载均衡 - -创建下述 YAML 文件: - -```yaml -apiVersion: ke.qiniu.com/v1 -kind: TLB -metadata: - name: tlbname - namespace: ns -spec: - bandwidthLimit: 100 - chargeMode: bandwidth - ipType: telecom - serviceSpec: - ports: - - name: port-1935 - port: 1935 - protocol: TCP - targetPort: 1935 - selector: - app: appv1 -``` -其中 `spec` 内的各个参数表示: -- bandwidthLimit: 带宽限制,范围为 0-1000 Mbps -- chargeMode: 计费方式,目前只支持 `bandwidth` 流量计费。 -- ipType: 可选 `telecom` 电信、`unicom` 联通、`mobile` 移动、`in-cluster` 内网 -- serviceSpec.ports.port: 对应监听的端口 -- serviceSpec.ports.protocol: 协议,当前仅支持 TCP -- serviceSpec.ports.targetPort: Pod 监听端口 -- serviceSpec.selector: Pod 的 LabelSelector - -使用 `kubectl create -f` 命令 创建后,通过下述命令可以获取 TCP 负载均衡资源的详细信息: - -``` -kubectl -n ns get tlb tlbname -o yaml -``` - -此时获得的 TLB 资源内,会有 `status` 字段: - -```yaml -apiVersion: ke.qiniu.com/v1 -kind: TLB -... -status: - phase: pending -``` -phase `pending` 状态表示系统正在为此 TCP 负载均衡分配一个 IP,等分配完成后,status.phase 会变成 `ready`,此时 status 内会添加一个 ip 的字段,表示分配后的 IP 地址 - - -```yaml -apiVersion: ke.qiniu.com/v1 -kind: TLB -... -status: - ip: 115.231.110.9 - phase: ready -``` - -至此,一个 TCP 负载均衡已经创建完毕并可以对外提供服务。 -*** - -## 3.13.5 快速实践 - 创建一个wordpress应用 -wordpress应用包含两类服务,MySQL数据库服务和Wordpress web服务。其中我们通过PersistentVolumeClaim(PVC)存储MySQL数据,通过Secret存储MySQL的root密码。因此,整个应用的创建流程分为以下4个步骤:
- -- 创建一个Secret用于存储MySQL密码 -- 创建一个PVC用于存储MySQL数据 -- 部署MySQL服务 -- 部署Wordpress服务 - -### 3.13.5.1 创建一个Secret用于存储MySQL密码 -Secret是kubernetes用于存储隐秘性数据的对象,数据格式为key-value。 - -**1)通过以下命令,创建一个key=“mysql-pass”,value=“root123”的secret对象** - -`kubectl create secret generic mysql-pass --from-literal=password=root123` - -**2)通过以下命令,验证Secret对象是否被创建成功** - -`kubectl get secrets` - -能够在列表中找到刚刚创建的Secret对象 - -``` -NAME TYPE DATA AGE -mysql-pass Opaque 1 2d ``` -### 3.13.5.2 创建一个PVC用于存储MySQL数据 -PVC是Pod用于挂载并持久化存储数据的对象。 - -**1)在本地创建一个包含以下内容的YAML文件,命名为"ceph-volumes.yaml"** - -```ceph-volumes.yaml -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: mysql-pv-claim - labels: - app: wordpress -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 20Gi - storageClassName: ceph -``` - -**2)通过以下命令,基于"ceph-volumes.yaml"创建一个PVC** - -`kubectl create -f /ceph-volumes.yaml` - -**3)通过以下命令,验证PVC对象是否被创建成功** - -`kubectl get pvc` - -能够在列表中找到刚刚创建的PVC对象 - -``` -NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE -mysql-pv-claim Bound pvc-84adae57-93dd-11e8-9503-6c92bf12a558 20Gi RWO ceph 10s -``` - -### 3.13.5.3 部署MySQL服务 -基于YAML文件部署MySQL服务的deployment对象。YAML文件中也包含了对之前secret和PVC两个对象的配置描述:
- -- 容器挂载PVC对象mysql-pv-claim到内部路径`/var/lib/mysql`
-- 通过环境变量`MYSQL_ROOT_PASSWORD`设置MySQL密码,使用secret对象mysql-pass作为变量的值 - -**1)在本地创建一个包含以下内容的YAML文件,命名为"mysql-deployment.yaml"** - -```mysql-deployment.yaml -apiVersion: v1 -kind: Service -metadata: - name: wordpress-mysql - labels: - app: wordpress -spec: - ports: - - port: 3306 - selector: - app: wordpress - tier: mysql - clusterIP: None ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: wordpress-mysql - labels: - app: wordpress -spec: - strategy: - type: Recreate - template: - metadata: - labels: - app: wordpress - tier: mysql - spec: - containers: - - image: mysql:5.6 - name: mysql - env: - - name: MYSQL_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: mysql-pass - key: password - ports: - - containerPort: 3306 - name: mysql - volumeMounts: - - name: mysql-persistent-storage - mountPath: /var/lib/mysql - volumes: - - name: mysql-persistent-storage - persistentVolumeClaim: - claimName: mysql-pv-claim``` - -**2)通过以下命令,基于"mysql-deployment.yaml"创建mysql deployment对象** - -`kubectl create -f /mysql-deployment.yaml` - -**3)通过以下命令,验证MySQL的pod是否已经运行成功** - -`kubectl get pods` - -能够在列表中找到刚刚创建的MySQL pods - -``` -NAME READY STATUS RESTARTS AGE -wordpress-mysql-2917821887-7k7jj 1/1 Running 0 2m -``` - -### 3.13.5.4 部署Wordpress服务 -同样基于YAML文件部署Wordpress服务的deployment对象。YAML文件中包含了Wordpress服务连接MySQL数据库所需的环境变量描述:
- -- 通过环境变量`WORDPRSS_DB_HOST`,实现和MySQL的内网服务发现 -- 通过环境变量`WORDPRESS_DB_PASSWORD`,获取访问MySQL所需的密码 - -**1)在本地创建一个包含以下内容的YAML文件,命名为"wordpress-deployment.yaml"** - -```wordpress-deployment.yaml -apiVersion: v1 -kind: Service -metadata: - name: wordpress - labels: - app: wordpress -spec: - ports: - - port: 80 - selector: - app: wordpress - tier: frontend - type: LoadBalancer ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: wordpress - labels: - app: wordpress -spec: - strategy: - type: Recreate - template: - metadata: - labels: - app: wordpress - tier: frontend - spec: - containers: - - image: wordpress:4.8-apache - name: wordpress - env: - - name: WORDPRESS_DB_HOST - value: wordpress-mysql - - name: WORDPRESS_DB_PASSWORD - valueFrom: - secretKeyRef: - name: mysql-pass - key: password - ports: - - containerPort: 80 - name: wordpress -``` - -**2)通过以下命令,基于"wordpress-deployment.yaml"创建wordpress deployment对象** - -`kubectl create -f /wordpress-deployment.yaml` - -**3)通过以下命令,验证wordpress的service是否已经运行成功** - -`kubectl get services wordpress` - -能够在列表中找到刚刚创建的wordpress service,以及mysql service - -``` -NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE -wordpress 172.16.75.94 115.231.110.21 80:30625/TCP 1m -wordpress-mysql None 3306/TCP 14m ``` - -### 3.13.5.5 验证Wordpress应用是否部署成功 - -复制wordpress service的`EXTERNAL-IP`到浏览器 - -![](_figures/user-guide/origin-mode-wordpress.jpg) - -访问IP,能够显示如下的wordpress页面 - -![](_figures/user-guide/origin-mode-wordpress-web.jpg) -*** - -## 3.13.6 kubeconfig文件说明 -kubeconfig中描述了用户集群、用户空间、用户账户以及用户认证相关的信息。kubectl根据kubeconfig来选择集群并与集群的API服务器进行通信。 -默认情况下,kubectl使用的配置文件是`/.kube`目录下的config文件,用户也可以通过设置环境变量`KUBECONFIG`或者`--kubeconfig`指定其他的配置文件。 - -### 3.13.6.1 「导出kubeconfig文件」说明 -当用户登入c.qiniu.com控制台,并切换到某一个原生模式空间时,就会在左边栏为原生模式的TAB下看到这个控件。 -这个控件帮助用户能够导出一个系统自动生成的kubeconfig文件。文件中描述了导出文件所在空间的信息、该空间所在集群的信息、用户的AK/SK信息。 -```config -apiVersion: v1 -clusters:#集群组,一组集群信息包含集群服务器API地址以及集群名 -- cluster: - server: https://authgate-xq.qiniu.com/v1/kube/ - name: -contexts:#访问参数组,一组访问参数包含集群名、用户名、空间名 -- context: - cluster: - user: - namespace: - name: -current-context: -kind: Config -preferences: {} -users:#用户的认证信息 -- name: - user: - username: - password: -``` - -通过这个config文件,用户可以获得以下能力: -- 直接操作导出文件所在空间:如果用户输入的kubectl命令行中不带`-n xxxx`空间信息,那么命令将会直接作用在该config文件所导出的空间。 -- 间接操作同一个集群下的其他原生空间:如果用户需要操作同一个集群下的其他原生空间,可以在kubectl命令行中携带`-n xxxx`信息,来指定该命令所要做用的空间。 - -这些能力的适用范围只能是导出文件所在的集群,其他的集群并不能通过这个config文件进行操作。 -当然,如果要操作多个集群的资源,这个同样是可以办到的,请看下一节。 - -### 3.13.6.2 如何实现在多个集群间进行切换操作 -当用户有多个集群的资源,这时候用户通过「导出kubeconfig文件」获得了多个集群的config,这时候该如何处理,能够使用kubectl命令实现集群间的切换呢?这里有两种方法,一种是通过`--kubeconfig`的方式来指定kubectl所引用的config文件,另一种是通过修改`KUBECONFIG`环境变量,使多个config文件能够被kubectl合并引用。 - -#### 通过`--kubeconfig`的方式来指定kubectl所引用的config文件 - -**1)先把所有的config文件通过改名,都放到指定目录`~/.kube`下,比如取名为config-xq,config-nb** - -**2)通过终端,进入`~/.kube`目录** - -**3)通过以下命令,对kubectl引用的config文件进行切换。切换需要同时指定config文件,以及config文件中所描述的某个context名(通常context名是导出config文件所在空间的名字,你也可以通过打开config文件查看)。** - -`kubectl config --kubeconfig= use-context ` - -如果看到以下反馈,表示已经切换成功 - -`Switched to context "".` - -通过这种方式,你就可以切换不同的config文件,来实现在多个集群之间的切换,但是每次命令都需要携带`--kubeconfig`参数。 - -#### 通过修改`KUBECONFIG`环境变量,使多个config文件能够被kubectl合并引用 -因为kubectl是根据context名来区分不同的context组,所以需要确保每个config文件中不存在同名的context。如果有同名,需要修改config文件。 - -**1)修改环境变量`KUBECONFIG`** - -##### MacOS - -通过以下命令,添加多个config文件路径到环境变量中 - -`export KUBECONFIG=$KUBECONFIG:/:/` - -##### Linux - -通过以下命令,添加多个config文件路径到环境变量中 - -`export KUBECONFIG=$KUBECONFIG:/:/` - -##### Windows - -通过以下命令,添加多个config文件路径到环境变量中 - -`$env:KUBECONFIG="/;/` - -**2) 通过以下命令,验证kubectl是否对多个config文件做了合并引用** - -`kubectl config view` - -能够查看到多个config文件内的cluster和context、users信息被整合了。 - -**3)通过以下命令,对不同的context进行切换。** -`kubectl config ` - -如果看到以下反馈,表示已经切换成功 - -`Switched to context "".` - -切到某个context,也意味着引用了这个context所在的config文件,那么用户就可以对这个config文件所在的集群进行操作了。 -*** - -## 3.13.7 其他说明 -### 3.13.7.1 kubectl命令行 -参考kubernetes官网,https://kubernetes.io/docs/reference/kubectl/kubectl/ From 6deac08cd81f768a32876333eca0246c69a2c156 Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Thu, 22 Nov 2018 11:49:32 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _sidebar.md | 2 +- quick-start/create-app.md | 73 ++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/_sidebar.md b/_sidebar.md index 0e23d2f..81e0afc 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -1,5 +1,5 @@ * 快速开始 - * [开始创建一个服务](quick-start/create-app.md) + * [基于镜像创建一个应用](quick-start/create-app.md) * [服务在集群内/集群外的访问](quick-start/cluster-app.md) * 用户指南 * [账号注册](user-guide/registry.md) diff --git a/quick-start/create-app.md b/quick-start/create-app.md index 71012e6..fc794f0 100644 --- a/quick-start/create-app.md +++ b/quick-start/create-app.md @@ -1,36 +1,49 @@ -# 2.1 开始创建一个服务 {docsify-ignore-all} -一个应用一般由多个服务组成,所以创建一个应用就是创建多个服务并配置多个服务之间的依赖关系。开始创建一个服务,操作如下: +# 1.1 基于镜像创建一个应用 {docsify-ignore-all} +一个应用一般由多个服务组成,所以创建一个应用就是创建多个服务并配置多个服务之间的依赖关系。开始创建一个应用,操作如下: -[2.1.1 选择空间](#jump1) -[2.1.2 创建服务](#jump3) +[1.1.1 选择空间](#jump1) +[1.1.2 添加应用](#jump2) +[1.1.3 创建服务](#jump3) -- [2.1.2.1 创建无状态服务](#jump31) -- [2.1.2.2 创建有状态服务](#jump32) +- [2.1.3.1 创建无状态服务](#jump31) +- [2.1.3.2 创建有状态服务](#jump32) -## 2.1.1 选择空间 +## 1.1.1 选择空间 -选择当前服务需要被创建在哪个空间下。空间彼此之间资源隔离,如果服务有内网互访的需求,需要创建在一个空间下。操作如下: +选择当前应用需要被创建在哪个空间下。空间彼此之间资源隔离,如果应用间有内网互访的需求,需要创建在一个空间下。操作如下: -**下拉控制台顶部的「空间」进行空间切换** +**1)下拉控制台顶部的「空间」进行空间切换** ![下拉选择空间](_figures/quick-start/create-app-namespace.png) - *** -## 2.1.2 创建服务 +## 1.1.2 添加应用 + +操作如下: + +**2)点击左侧菜单栏「应用」,进入应用管理界面** -**1)点击控制台左边栏的「服务」,切换至服务页面** +**3)点击「添加应用」,选择创建方式为「基于镜像创建」** -**2)点击「创建服务」** +?> **基于镜像创建:**应用基于镜像中心的镜像创建,需要自行配置应用下服务间依赖。
+ **从应用市场创建:**应用基于应用市场的应用模版创建,一键创建,实现自运维。 + +**4)填写「应用名」** +!> **命名规则:**2-30位的小写字母、数字,开头为字母 + +**5)点击「添加服务」** +*** + +## 1.1.3 添加服务 ![](_figures/quick-start/create-app-5.png) -服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<服务名>:<服务端口>** 实现同一个区域同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 +服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<服务名>:<服务端口>** 实现同一个集群同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 ?> **有状态服务:**用于持久化存储数据,需要挂「存储卷」。只能单容器实例。 **无状态服务:**不能持久化存储数据。支持多容器实例,允许做「服务伸缩」。 -### 2.1.2.1 创建无状态服务 +### 1.1.3.1 创建无状态服务 **1. 服务名:**填写服务名 @@ -40,10 +53,8 @@ **3. 镜像地址:**点击「选择镜像」。挑选需要部署的服务镜像,点击「部署」icon -?> **docker官方镜像:**docker官方镜像 - **第三方公开镜像:**除docker官方镜像之外的其他公开镜像,可能来自七牛容器团队、七牛镜像中心用户 - **我的收藏:**用户收藏的公开镜像 - **我的镜像:**用户自己的镜像,包含公开镜像和私有镜像 +?> **公有镜像:**集群内所有用户可见
+ **私有镜像:**当前空间下用户可见
![](_figures/quick-start/create-app-images-center.png) @@ -67,25 +78,25 @@ 内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 **如何配置服务的外网暴露:** -服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及外部用户的服务访问。[服务的外网访问](https://kirk-enterprise.github.io/kirk-docs/#/quick-start/cluster-app?id=span-idjump2222-服务的外网访问) +服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨集群的服务互访,以及外部用户的服务访问。 -**7. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。[详见3.10](user-guide/configmap.md) +**7. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。 ?> **挂载路径:**容器内部文件路径,用于存放配置文件 - **配置集名称:**选择需要挂载的配置集。一个配置集包含多个配置项,一个配置项是一个配置文件。 + **配置集名称:**选择需要挂载的配置集。一个配置集包含多个配置项,一个配置项是一个配置文件 **8. 环境变量**:配置服务的「环境变量」。 > **加载方式** ?> **手动填写:**手动管理「变量值」 - **配置中心:**通过「配置中心」的「配置项」管理「变量值」,[详见3.10.3](https://kirk-enterprise.github.io/kirk-docs/#/user-guide/configmap?id=_3103-环境变量中的应用) + **配置中心:**通过「配置中心」的「配置项」管理「变量值」 **9. 运行目录**:容器启动后,在「运行目录」下执行命令。 **10. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被忽略。 -### 2.1.2.2 创建有状态服务 +### 1.1.3.2 创建有状态服务 **1. 服务名:**填写服务名 @@ -95,10 +106,8 @@ **3. 镜像地址:**点击「选择镜像」。挑选需要部署的服务镜像,点击「部署」icon -?> **公有镜像:**七牛镜像中心平台所有被公开的镜像资源 - **Docker官方镜像:**七牛官方认证的镜像,已由平台同步到七牛镜像仓库地址 - **收藏夹:**您收藏的公开镜像 - **我的镜像:**您创建的镜像,包含公开镜像和私有镜像 +?> **公有镜像:**集群内所有用户可见
+ **私有镜像:**当前空间下用户可见
![](_figures/quick-start/create-app-images-center.png) @@ -113,7 +122,7 @@ **5. 容器数量**:服务下的容器实例数。「有状态服务」只能配1,且不能做「服务伸缩」。 -**6. 存储卷配置**:用于持久化存储数据。只有「有状态服务」能够添加存储卷。 +**6. 存储卷配置**:用于持久化存储数据,只有「有状态服务」能够添加存储卷。 ?> **存储名称:**下拉选择需要添加的存储卷(如果没有可用存储卷,也可以临时创建新的存储卷) **读写方式:**服务对存储卷的操作权限,分读写和只读 @@ -128,9 +137,9 @@ 内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 **如何配置服务的外网暴露:** -服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及外部用户的服务访问。[详见3.6](user-guide/loadbalance.md) +服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及外部用户的服务访问。 -**8. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。[详见3.10](user-guide/configmap.md) +**8. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。 ?> **挂载路径:**容器内部文件路径,用于存放配置文件 **配置集名称:**选择需要挂载的配置集。一个配置集包含多个配置项,一个配置项是一个配置文件。 @@ -140,7 +149,7 @@ > **加载方式** ?> **手动填写:**手动管理「变量值」 - **配置中心:**通过「配置中心」的「配置项」管理「变量值」,[详见3.10.3](https://kirk-enterprise.github.io/kirk-docs/#/user-guide/configmap?id=_3103-环境变量中的应用) + **配置中心:**通过「配置中心」的「配置项」管理「变量值」 **10. 运行目录**:容器启动后,在「运行目录」下执行命令。 From af603d5205eb39e1036c093a5f4eb21f77375827 Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Mon, 26 Nov 2018 23:22:26 +0800 Subject: [PATCH 3/7] private_edit --- _sidebar.md | 4 +- quick-start/cluster-app.md | 37 +++---- user-guide/app.md | 19 ++-- user-guide/apps.md | 185 ++++++++++++++++++++++++++++++++++ user-guide/configmap.md | 22 ++-- user-guide/container.md | 18 ++-- user-guide/domain.md | 41 ++------ user-guide/image.md | 63 ++++-------- user-guide/loadbalance_4.md | 36 ++----- user-guide/loadbalance_7.md | 38 +++---- user-guide/log-and-monitor.md | 8 +- user-guide/service.md | 29 +++--- user-guide/storage.md | 25 +++-- user-guide/warning.md | 54 +++++----- 14 files changed, 344 insertions(+), 235 deletions(-) create mode 100644 user-guide/apps.md diff --git a/_sidebar.md b/_sidebar.md index 81e0afc..4b64117 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -2,11 +2,11 @@ * [基于镜像创建一个应用](quick-start/create-app.md) * [服务在集群内/集群外的访问](quick-start/cluster-app.md) * 用户指南 - * [账号注册](user-guide/registry.md) + * [应用](user-guide/app.md) * [服务](user-guide/service.md) * [容器](user-guide/container.md) * [存储](user-guide/storage.md) - * [HTTP/HTTPS七层负载均衡](user-guide/loadbalance_7.md) + * [HTTP七层负载均衡](user-guide/loadbalance_7.md) * [TCP四层负载均衡](user-guide/loadbalance_4.md) * [域名管理](user-guide/domain.md) * [镜像中心](user-guide/image.md) diff --git a/quick-start/cluster-app.md b/quick-start/cluster-app.md index 1beed09..cbf2854 100644 --- a/quick-start/cluster-app.md +++ b/quick-start/cluster-app.md @@ -1,15 +1,15 @@ -# 2.2 服务的内网访问和外网访问 +# 1.2 服务的内网访问和外网访问 -[2.2.1 服务的内网访问](#jump1) -[2.2.2 服务的外网访问](#jump2) +[1.2.1 服务的内网访问](#jump1) +[1.2.2 服务的外网访问](#jump2) -- [2.2.2.1 HTTP/HTTPS七层负载均衡](#jump21) -- [2.2.2.2 TCP四层负载均衡](#jump22) +- [1.2.2.1 HTTP/HTTPS七层负载均衡](#jump21) +- [1.2.2.2 TCP四层负载均衡](#jump22) ![](_figures/quick-start/cluster-app-netconfig.png) *** -## 2.2.1 服务的内网访问 +## 1.2.1 服务的内网访问 容器在发生重启后,会出现内网IP的改变。这种情况下,如果还是通过IP+PORT的形式访问容器,会导致访问异常。因此容器的内网访问通过服务注册发现的机制来完成。操作如下: **1)填写监听的「容器端口」** @@ -19,26 +19,26 @@ ?> 服务创建后会自动添加DNS记录,服务以 **<服务名>:<服务端口>** 的形式暴露访问端口 ![](_figures/quick-start/cluster-app-inside.png) - *** -## 2.2.2 服务的外网访问 + +## 1.2.2 服务的外网访问 负载均衡可以扩展服务的访问能力到外网,平台支持「HTTP/HTTPS」七层和「TCP」四层两类负载均衡。 -### 2.2.2.1 HTTP/HTTPS七层负载均衡 +### 1.2.2.1 HTTP/HTTPS七层负载均衡 七层负载均衡可以通过两种方式挂载到服务: 第一种是在「创建服务」时添加。 第二种是先在「负载均衡」组件页面下创建负载均衡,再选择需要挂载的服务。 -这里以第一种为例,第二种[详见3.6.2](https://kirk-enterprise.github.io/kirk-docs/#/user-guide/loadbalance_7?id=先创建负载均衡,再选择挂载的服务),操作如下: +这里以第一种为例,操作如下: -**1)首先「开启负载均衡」** +**1)首先「开启负载均衡」。如果当前没有负载均衡实例,通过点击「添加」,创建一个负载均衡实例** -**2)如果负载均衡已经存在,可以直接下拉选择;如果负载均衡不存在,可以点击「添加」icon,创建一个负载均衡实例** +**2)下拉选择负载均衡实例,如果实例不存在,可以通过点击「添加」icon,创建一个新的负载均衡实例** ?> 创建负载均衡实例需要以下信息: **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾。
**描述:**负载均衡的文本描述。
**计费方式:**负载均衡的计费方式,当前仅支持按流量计费。
- **域名:**负载均衡绑定的域名,[详见3.6.5](https://kirk-enterprise.github.io/kirk-docs/#/user-guide/loadbalance_7?id=_365-如何绑定用户域名)。
+ **域名:**负载均衡绑定的域名。如果当前没有可用的域名,需要先去「域名管理」中添加
![](_figures/quick-start/cluster-app-7loadbalance-on.jpg) @@ -48,9 +48,9 @@ **3)填写「路径」,将域名下的某个子目录指向服务。** 该服务的域名访问方式是 **<域名>/<路径>** -### 2.2.2.2 TCP四层负载均衡 +### 1.2.2.2 TCP四层负载均衡 +将四层负载均衡挂载到服务,操作如下: -将四层负载均衡挂载到服务,操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** **2)点击「TCP」,切换到TCP四层负载均衡子页面** @@ -60,12 +60,7 @@ ?> 创建负载均衡实例需要以下信息: **名称:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾。
**描述:**负载均衡的文本描述。
- **IP类型:**服务的IP访问方式,包括内网、电信、联通。内网类型用于服务在同一区域下被其他空间服务访问的需求。
- **计费方式:**按带宽计费。如果选择内网,则不计费。
- **带宽限制:**限制负载均衡最大带宽。
**后端服务:**选择负载均衡挂载到的服务。
- **转发规则:**配置负载均衡的「监听端口」到服务的「后端端口」。
- -![](_figures/quick-start/cluster-app-balance4-1.png) + **转发规则:**服务的「后端端口」。
**4)点击「创建」,完成四层负载均衡的创建** \ No newline at end of file diff --git a/user-guide/app.md b/user-guide/app.md index e20f5a0..9280e2e 100644 --- a/user-guide/app.md +++ b/user-guide/app.md @@ -1,10 +1,10 @@ -# 3.2 应用 +# 2.1 应用 应用是服务的上一层抽象,一个应用包含的所有服务都可以创建在该应用下。 ![](_figures/user-guide/app-create-0.png) *** -## 3.2.1 属性说明 +## 2.1.1 属性说明 ![添加应用](_figures/user-guide/app-create-2.png) **1. 应用名:**应用一旦创建完成,「应用名」就不能被修改。会在服务配置内网访问时用到 **<应用名>-<服务名>:<端口号>**。 @@ -16,7 +16,7 @@ ![下拉选择空间](_figures/quick-start/create-app-namespace.png) *** -## 3.2.1 如何创建应用 +## 2.1.2 如何创建应用 应用创建有两种方式:「基于镜像创建」和「从应用市场创建」。 ?> **基于镜像创建:**应用下所有服务都是基于「镜像中心」的服务镜像创建,服务的配置以及服务间的网络通信都是在平台上可视化定义。
@@ -24,7 +24,7 @@ ![](_figures/user-guide/app-create-1.png) -### 3.2.1.1 基于镜像创建 +### 2.1.2.1 基于镜像创建 **1. 应用名:**应用一旦创建完成,「应用名」就不能修改。会在服务配置内网访问时用到 **<应用名>-<服务名>:<端口号>**。 !> **命名规则:**2-30位的小写字母、数字,开头为字母 @@ -33,10 +33,14 @@ ![下拉选择空间](_figures/quick-start/create-app-namespace.png) -**2. 添加服务** [详见3.3.1](/user-guide/service?id=_331-%e6%b7%bb%e5%8a%a0%e6%9c%8d%e5%8a%a1) +**3. 添加服务** + +### 2.1.2.2 从应用市场创建 +参见 **应用市场** + *** -## 3.2.2 如何删除应用 +## 2.1.3 如何删除应用 应用一旦被删除,将无法恢复。操作如下: @@ -47,7 +51,6 @@ ![添加应用](_figures/user-guide/app-delete.png) *** -## 3.2.3 应用下的日志和监控 +## 2.1.4 应用下的日志和监控 平台提供了对一个应用下所有容器日志和容器监控的应用级聚类。在应用页面能够轻松筛选出该应用下的任何容器日志和监控。 -[详见3.12](user-guide/log-and-monitor.md) diff --git a/user-guide/apps.md b/user-guide/apps.md new file mode 100644 index 0000000..9215c87 --- /dev/null +++ b/user-guide/apps.md @@ -0,0 +1,185 @@ +# 2.10 告警中心 +告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +*** + +## 2.10.1 属性说明 +### 3.10.1.1 告警规则 +用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 + +**1. 规则名称:**定义告警项的名称 + +**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 + +**3. 告警对象:**触发告警的真正实例 + +?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 + **选择实例:**勾选「告警产品」下部分实例为告警监测对象 + +**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> + +?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
+ **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
+ **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
+ **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
+ **阈值:**用户期望的统计结果临界值 + +**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 + +**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 + +**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack + +### 2.10.1.2 告警人 +用于管理所有可能接收告警通知的人员通讯录。 + +![](_figures/user-guide/warning-person-create.png) + +**1. 姓名:**定义告警通知人的姓名 + +**2. 手机:**接收告警通知的手机号 + +**3. 邮箱:**接收告警通知的邮箱 + +### 2.10.1.3 告警组 +用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 + +![](_figures/user-guide/warning-team-create-1.png) + +**1. 组名称:**定义告警通知组的名称 + +**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 + +**3. 添加告警人:**用于临时添加新的「高警人」 + +**4. Channel:**Slack Channel + +**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +*** + +## 2.10.2 如何添加告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击「新建」,开始创建一条新的告警规则。** + +!> 添加告警项前要保证已经存在「告警组」。
+ 如需通知对象接收slack,请确保「告警组」配置了slack。 +*** + +## 2.10.3 如何修改告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击目标告警规则最右侧的「编辑」** +*** + +## 2.10.4 如何删除告警规则 +删除告警规则支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.4.1 批量删除 +操作如下: + +**1)点击目标告警规则最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_rule_delete1.jpg) + +### 2.10.4.2 单条删除 +操作如下: + +**1)点击目标告警规则最右侧的「删除」** +*** + +## 2.10.5 如何添加告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击「新建」,开始添加一个新的告警人。** +*** + +## 2.10.6 如何修改告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击目标告警人最右侧的「编辑」** +*** + +## 2.10.7 如何删除告警人 +删除告警人支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.7.1 批量删除 +操作如下: + +**1)点击目标告警人最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_member_delete.jpg) + +### 2.10.7.2 单条删除 +操作如下: + +**1)点击目标告警人最右侧的「删除」** +*** + +## 2.10.8 如何添加高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击「新建」,开始添加一个新的告警组。** +*** + +## 2.10.9 如何修改高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击目标告警组最右侧的「编辑」** +*** + +## 2.10.10 如何删除告警组 +删除告警组支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 批量删除 + +**1)点击目标告警组最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_team_delete.jpg) + +### 单条删除 + +**1)点击目标告警组最右侧的「删除」** +*** + +## 2.10.11 如何设置告警通知 +### 3.10.11.1 设置slack +slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 + +**如何配置Slack API URL:**
+需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL diff --git a/user-guide/configmap.md b/user-guide/configmap.md index f694aee..fa2b570 100644 --- a/user-guide/configmap.md +++ b/user-guide/configmap.md @@ -1,9 +1,9 @@ -# 3.9 配置中心 +# 2.9 配置中心 配置中心可以用于管理容器的「环境变量」和「配置文件」。 *** -## 3.9.1 属性说明 -### 3.9.1.1 配置集 +## 2.9.1 属性说明 +### 2.9.1.1 配置集 「配置集」是多个「配置项」的上层聚类。 **1. 配置集名称:**配置集一旦创建完成,「配置集名称」就不能被修改 @@ -14,7 +14,7 @@ **3. 创建时间:**当前「配置集」创建的时间 -### 3.9.1.2 配置项 +### 2.9.1.2 配置项 「配置项」是以key-value的形式进行管理。 **1. 配置项名称:**配置项一旦创建完成,「配置项名称」就不能被修改 @@ -24,7 +24,7 @@ **2. 配置内容:**可以是任意字符,且支持随时修改 *** -## 3.9.2 如何添加配置集和配置项 +## 2.9.2 如何添加配置集和配置项 操作如下: **1)点击控制台左边栏的「配置中心」,切换至配置中心页面** @@ -38,7 +38,7 @@ ![重新部署](_figures/user-guide/configmap_add2.jpg) *** -## 3.9.3 如何修改配置项 +## 2.9.3 如何修改配置项 「配置项」被创建后,只能修改「配置内容」。
操作如下:
**1)点击控制台左边栏的「配置中心」,切换至配置中心页面** @@ -49,7 +49,7 @@ ![重新部署](_figures/user-guide/configmap_edit_value.jpg) *** -## 3.9.4 如何在环境变量中应用配置集 +## 2.9.4 如何在环境变量中应用配置集 「配置项」的「配置内容」能够被关联到多个「环境变量」的「变量值」,实现统一设置和修改,可以有效避免手动输入带来的重复操作以及出错风险。 先要保证已经创建完成「配置集」以及「配置项」,通过「创建服务」或者「服务升级」对「环境变量」进行添加或修改,接下来操作如下: @@ -60,7 +60,7 @@ ![重新部署](_figures/user-guide/configmap_env2.jpg) *** -## 3.9.5 如何在配置文件中应用配置集 +## 2.9.5 如何在配置文件中应用配置集 「配置集」除了可以通过「环境变量」的方式注入进容器,还能以「配置文件」的形式挂载到容器内的指定目录,这样就满足了一些应用通过读取文件的方式加载配置。 先要保证已经创建完成「配置集」以及「配置项」,通过「创建服务」或者「服务升级」对「配置文件」进行添加或修改,接下来操作如下: @@ -74,14 +74,14 @@ ?>「配置集」下的每个「配置项」都以一个配置文件挂载到容器内的「挂载路径」,其中「配置项名称」是文件名,「配置内容」是文件内容 *** -## 3.9.6 如何删除配置集和配置项 -### 3.9.6.1 删除配置项 +## 2.9.6 如何删除配置集和配置项 +### 2.9.6.1 删除配置项 操作如下: **1)点击目标配置项最右侧的「删除」icon** ![重新部署](_figures/user-guide/configmap_delete_value1.jpg) -### 3.9.6.2 删除配置集 +### 2.9.6.2 删除配置集 操作如下: **1)点击目标配置集最左侧的「选中」icon** diff --git a/user-guide/container.md b/user-guide/container.md index 1d5989f..2cbcd42 100644 --- a/user-guide/container.md +++ b/user-guide/container.md @@ -1,8 +1,8 @@ -# 3.3 容器 +# 2.3 容器 Container,是docker镜像运行时的实例。 *** -## 3.3.1 属性说明 +## 2.3.1 属性说明 **1. 容器规格:**提供6种容器规格 ?> **1U1G:**单个容器配1个CPU核和1G内存资源 @@ -15,19 +15,17 @@ Container,是docker镜像运行时的实例。 **2. 镜像:**标明了该容器所基于的镜像类型和版本号,以及镜像所在的仓库地址。格式为**<仓库地址>/<空间名>/<镜像名称>:<版本号>** *** -## 3.3.2 如何设置容器数量 -容器数量可以在「创建服务」和「服务伸缩」时做设置。[详见3.2](/user-guide/service.md) +## 2.3.2 如何设置容器数量 +容器数量可以在「创建服务」和「服务伸缩」时做设置。 *** -## 3.3.3 如何手动重启容器 +## 2.3.3 如何手动重启容器 选中需要重启的容器,点击「重新部署」。重启容器一般用于服务的「配置文件」和「环境变量」所依赖的「配置项」被修改,需要重启生效。 !> **注意:**容器重新部署会导致该容器日志和容器监控重置 - -![重新部署](_figures/user-guide/container-redeploy.gif) *** -## 3.3.4 如何通过终端登入容器 +## 2.3.4 如何通过终端登入容器 类似 `docker exec` 命令功能,以Terminal形式登入进容器内部。操作如下: **1)点击控制台左边栏的「容器」,切换至容器页面** @@ -39,6 +37,6 @@ Container,是docker镜像运行时的实例。 2.通过平台添加环境变量。步骤如下:服务升级 -> 高级配置 -> 环境变量 -> 添加环境变量 -> 变量名为 `LANG`,变量值为 `C.UTF-8`
*** -## 3.3.5 容器日志和监控 -平台提供容器日志和容器监控。[详见3.11](user-guide/log-and-monitor.md) +## 2.3.5 容器日志和监控 +平台提供容器日志和容器监控。 diff --git a/user-guide/domain.md b/user-guide/domain.md index 489988d..e95e074 100644 --- a/user-guide/domain.md +++ b/user-guide/domain.md @@ -1,21 +1,13 @@ -# 3.7 域名 -用户可以自主添加域名到平台,通过绑定域名到「HTTP/HTTPS七层负载均衡」,使负载均衡绑定的服务能够以用户域名的方式在外网暴露。 +# 2.7 域名 +用户可以自主添加域名到平台,通过绑定域名到「HTTP七层负载均衡」,使负载均衡绑定的服务能够以用户域名的方式在外网暴露。 *** -## 3.7.1 属性说明 - -![](_figures/user-guide/domain_para.jpg) +## 2.7.1 属性说明 **1. 域名名称:**域名一旦被添加,就不能修改域名名称 - -**2. 选择证书:**添加证书是为了开启HTTPS,证书购买和管理使用的是[七牛云开发者平台 - SSL证书服务](https://portal.qiniu.com/certificate/ssl#cert)
- -!> 注意:证书对应的域名需要与「域名名称」一致并且证书需要在有效期内。 - -**3. 开启HTTPS:**开启HTTPS需要先「选择证书」。开启后,对域名的请求将转成HTTPS请求 *** -## 3.7.2 如何添加域名 +## 2.7.2 如何添加域名 操作如下: @@ -24,13 +16,9 @@ **2)点击「添加域名」** ?> 域名名称:域名一旦被添加,就不能修改域名名称
- 选择证书:添加证书是为了开启HTTPS,证书购买和管理使用的是[七牛云开发者平台 - SSL证书服务](https://portal.qiniu.com/certificate/ssl#cert)
- 开启HTTPS:开启HTTPS需要先「选择证书」。开启后,对域名的请求将转成HTTPS请求
- -!> 注意:证书对应的域名需要与「域名名称」一致并且证书需要在有效期内。 *** -## 3.7.2 如何配置 CNAME +## 2.7.3 如何配置 CNAME 添加域名完成后,会提示需要配置域名 CNAME 到指定的「CNAME 域名」,「CNAME 域名」只能用于配置 CNAME,不能访问,CNAME 生效后方可使用。 @@ -44,22 +32,7 @@ **已绑定** - CNAME 地址成功绑定到域名 *** -## 3.7.3 如何更新域名证书 - -操作如下: - -**1)点击左侧菜单栏「域名管理」,进入域名管理界面** - -**2)点击域名右侧的「编辑」icon** - -![编辑域名](_figures/user-guide/domain_edit.jpg) - -**3)点击「选择证书」,进行证书切换** - -?>如果需要从域名下线证书,必须先将「开启HTTPS」置为否。 -*** - -## 3.7.4 如何删除域名 +## 2.7.4 如何删除域名 操作如下: @@ -68,5 +41,3 @@ **2)勾选需要删除的域名,点击上方的「删除域名」按钮即可删除域名** !> 已被添加至负载均衡的域名需要先从负载均衡中移除才可删除。 - -![删除域名](_figures/user-guide/domain_delete.jpg) diff --git a/user-guide/image.md b/user-guide/image.md index eda23c1..552d266 100644 --- a/user-guide/image.md +++ b/user-guide/image.md @@ -1,85 +1,68 @@ -# 3.8 镜像中心 -镜像中心用于集中管理镜像仓库,仓库类型分为公开和私有。一个镜像仓库可以用于托管某一类服务镜像的所有版本。「Docker官方镜像」、「第三方公开镜像」、「我的收藏」下的镜像仓库都是公开镜像仓库,「我的镜像」下包含了用户自己创建的公开或私有镜像仓库。镜像仓库的管理可以通过[镜像中心控制台](https://hub.qiniu.com/portal)。 +# 2.8 镜像中心 +镜像中心用于集中管理镜像仓库,仓库类型分为公开和私有。一个镜像仓库可以用于托管某一类服务镜像的所有版本。 ?>公开镜像仓库:平台所有用户可见、可用,但不可操作。
私有镜像仓库:仅自己可见、可用、可操作。 *** -## 3.8.1 属性说明 +## 2.8.1 属性说明 -**1. 镜像仓库来源** - -?>**Docker官方镜像:**Docker官方认证的镜像仓库
- **第三方公开镜像:**七牛镜像中心用户自己公开的镜像仓库
- **我的收藏:**用户收藏的公开镜像仓库
- **我的镜像:**用户自己创建的公开或私有镜像仓库
- -**2. 镜像仓库信息** - -?> **仓库名称:**用户可以在[镜像中心控制台](https://hub.qiniu.com/portal)自定义仓库名称。也可以直接通过‘docker pull’的方式上传镜像,默认使用镜像名称作为仓库名称 - **仓库类型:**公开或私有 - **仓库地址:**<仓库地址>/<空间名>/<镜像名称>:<版本号> - **更新时间:**仓库信息或镜像版本更新的最新时间 - **所选版本:**罗列了仓库托管的所有镜像版本,选中版本后,可以通过「部署」操作创建基于该版本的服务 +**1. 仓库名称:**用户可以在[镜像中心控制台](https://hub.qiniu.com/portal)自定义仓库名称。也可以直接通过‘docker pull’的方式上传镜像,默认使用镜像名称作为仓库名称 +**2. 仓库地址:**<仓库地址>/<空间名>/<镜像名称>:<版本号> +**3. 更新时间:**镜像版本更新的最新时间 +**4. 所选版本:**罗列了仓库托管的所有镜像版本,选中版本后,可以通过「部署」操作创建基于该版本的服务 *** -## 3.8.2 如何创建镜像仓库 +## 2.8.2 如何创建镜像仓库 -创建镜像仓库有两种方式:
-第一种是由用户主动创建,需要到[镜像中心控制台](https://hub.qiniu.com/portal)操作。
-第二种是用户推送本地镜像到仓库的时候,如果该仓库不存在,会自动以镜像名作为仓库名创建。
+用户推送本地镜像到仓库的时候,如果该仓库不存在,会自动以镜像名作为仓库名创建。
*** -## 3.8.3 如何推送本地镜像到仓库 +## 2.8.3 如何推送本地镜像到仓库 ![](_figures/user-guide/image-push.png) 操作如下: -**1)登录七牛镜像中心服务器** +**1)登录镜像中心服务器** ``` -docker login reg.qiniu.com -u {你的七牛账号} -p {密码} +docker login <镜像中心地址> -u {你的七牛账号} -p {密码i ``` 返回「**Login Succeded**」即为登录成功 **2)为本地镜像标记tag** ``` -docker tag {镜像名或id} reg.qiniu.com/{命名空间}/{镜像名}:{标签} -``` -例如: - -``` -docker tag nginx:latest reg.qiniu.com/mynamespace/mynginx:mytag +docker tag {镜像名或id} <镜像中心地址>/{命名空间}/{镜像名}:{标签} ``` **3)推送镜像到仓库** ``` -docker push reg.qiniu.com/{命名空间}/{镜像名}:{标签} +docker push <镜像中心地址>/{命名空间}/{镜像名}:{标签} ``` !>推送已经存在的镜像版本到仓库,会使用新版本的镜像覆盖老版本镜像 *** -## 3.8.4 如何拉取仓库镜像到本地 +## 2.8.4 如何拉取仓库镜像到本地 操作如下: **1)登录七牛镜像中心服务器** ``` -docker login reg.qiniu.com -u {你的七牛账号} -p {密码} +docker login <镜像中心地址> -u {你的七牛账号} -p {密码} ``` 返回「**Login Succeded**」即为登录成功 **2)拉取镜像到本地** ``` -docker pull reg.qiniu.com/{命名空间}/{镜像名}:{标签} +docker pull <镜像中心地址>/{命名空间}/{镜像名}:{标签} ``` *** -## 3.8.5 如何基于某个镜像版本创建服务 +## 2.8.5 如何基于某个镜像版本创建服务 基于镜像版本创建服务有两种方式:
-第一种是先「创建服务」,再选择服务的镜像版本,[详见 2.1](quick-start/create-app.md)
+第一种是先「创建服务」,再选择服务的镜像版本
第二种是先在「镜像中心」选择镜像版本,再选择部署服务
操作如下: @@ -87,14 +70,6 @@ docker pull reg.qiniu.com/{命名空间}/{镜像名}:{标签} **2)点击「所选版本」选择目标镜像的版本** -![](_figures/user-guide/images_tag.jpg) - **3)点击「部署」icon** - -![](_figures/user-guide/images_tag_deploy.jpg) *** -## 3.8.6 如何删除镜像版本或者镜像仓库 - -我们暂时没有开放镜像版本和镜像仓库的主动删除权限,如果有需求,可以通过[镜像中心问题反馈](http://cn.mikecrm.com/ADM9Arh)提交工单,我们一定及时处理。 - diff --git a/user-guide/loadbalance_4.md b/user-guide/loadbalance_4.md index 112ea3d..54af670 100644 --- a/user-guide/loadbalance_4.md +++ b/user-guide/loadbalance_4.md @@ -1,10 +1,8 @@ -# 3.6 TCP四层负载均衡 +# 2.6 TCP四层负载均衡 负载均衡可以扩展服务的访问能力到外网,「TCP」四层负载均衡提供了服务的IP访问方式,实现通过IP从外网访问内网服务。 *** -## 3.6.1 属性说明 - -![](_figures/user-guide/lb_4_para.jpg) +## 2.6.1 属性说明 **1. 名称:**负载均衡一旦创建完成,「名称」将不能被修改 @@ -12,17 +10,12 @@ **2. 描述:**用于做信息备注,可以随时修改 -**3. IP类型:**服务的IP访问方式,包括内网、电信、联通。内网类型用于服务在同一区域下被其他空间服务访问的需求 - -**4. 计费方式:**按带宽计费。如果选择内网,则不计费 - -**5. 带宽限制:**限制负载均衡最大带宽 +**3. 后端服务:**选择负载均衡挂载到的服务 -**6. 后端服务:**选择负载均衡挂载到的服务 - -**7. 转发规则:**配置负载均衡的「监听端口」到服务的「后端端口」 +**4. 转发规则:**配置服务的「后端端口」 +*** -## 3.6.2 如何创建负载均衡,并绑定到服务 +## 2.6.2 如何创建负载均衡,并绑定到服务 操作如下: @@ -35,16 +28,13 @@ ?> 创建负载均衡实例需要以下信息: **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾
**描述:**用于做信息备注,可以随时修改
- **IP类型:**服务的IP访问方式,包括内网、电信、联通。内网类型用于服务在同一区域下被其他空间服务访问的需求
- **计费方式:**按带宽计费。如果选择内网,则不计费
- **带宽限制:**限制负载均衡最大带宽
**后端服务:**选择负载均衡挂载到的服务
- **转发规则:**配置负载均衡的「监听端口」到服务的「后端端口」
+ **转发规则:**配置服务的「后端端口」
**4)点击「创建」** *** -## 3.6.3 如何将负载均衡从服务解绑 +## 2.6.3 如何将负载均衡从服务解绑 操作如下: @@ -54,16 +44,12 @@ **3)点击「编辑」icon** -![添加负载均衡](_figures/user-guide/lb_4_edit.jpg) - **4)点击「解绑」icon** ![添加负载均衡](_figures/user-guide/lb_4_service_off.jpg) *** -## 3.6.4 如何删除负载均衡 - -操作如下: +## 2.6.4 如何删除负载均衡 操作如下: @@ -71,6 +57,4 @@ **2)点击「TCP」,切换到TCP四层负载均衡子页面** -**3)点击「删除」icon** - -![添加负载均衡](_figures/user-guide/lb_4_delete.jpg) \ No newline at end of file +**3)点击「删除」icon** \ No newline at end of file diff --git a/user-guide/loadbalance_7.md b/user-guide/loadbalance_7.md index 571362a..179b689 100644 --- a/user-guide/loadbalance_7.md +++ b/user-guide/loadbalance_7.md @@ -1,8 +1,8 @@ -# 3.5 HTTP/HTTPS七层负载均衡 -负载均衡可以扩展服务的访问能力到外网,「HTTP/HTTPS」七层负载均衡提供了服务的域名访问方式。用户可以绑定域名到负载均衡,达到通过用户域名访问内网服务的目的。 +# 2.5 HTTP七层负载均衡 +负载均衡可以扩展服务的访问能力到外网,「HTTP」七层负载均衡提供了服务的域名访问方式。用户可以绑定域名到负载均衡,达到通过用户域名访问内网服务的目的。 *** -## 3.5.1 属性说明 +## 2.5.1 属性说明 ![](_figures/user-guide/lb_7_para.jpg) @@ -14,40 +14,40 @@ **3. 计费方式:**按流量使用情况计费 -**4. 域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 [详见3.7](user-guide/domain.md) +**4. 域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 **5. 映射关系:**需要填写「域名路径」,以及选择当前负载均衡挂载到的服务。映射的结果就是,可以通过 **<域名>/<路径>** 访问服务 *** -## 3.5.2 如何创建负载均衡,并绑定到服务 +## 2.5.2 如何创建负载均衡,并绑定到服务 添加负载均衡到服务有两种方式: 第一种是在「创建服务」时添加。 -第二种是先在「负载均衡」组件页面的「HTTP/HTTPS」tab下创建,再选择需要挂载到的服务。 +第二种是先在「负载均衡」组件页面的「HTTP」tab下创建,再选择需要挂载到的服务。 -### 3.5.2.1 「创建服务」时添加 +### 2.5.2.1 「创建服务」时添加 操作如下: -**1)首先「开启负载均衡」** +**1)首先「开启负载均衡」。如果当前没有负载均衡实例,通过点击「添加」,创建一个负载均衡实例** -**2)如果负载均衡已经存在,可以直接下拉选择;如果负载均衡不存在,可以点击「添加」icon,创建一个负载均衡实例** +**2)下拉选择负载均衡实例,如果实例不存在,可以通过点击「添加」icon,创建一个新的负载均衡实例** ?> 创建负载均衡实例需要以下信息: **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾
**描述:**用于做信息备注,可以随时修改
**计费方式:**按流量使用情况计费
- **域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 [详见3.7](user-guide/domain.md)
+ **域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名
**3)填写「路径」,将域名下的某个子目录指向服务。** 该服务的域名访问方式是 **<域名>/<路径>** ![](_figures/quick-start/cluster-app-7loadbalance-on.jpg) -### 3.5.2.2 先创建负载均衡,再选择挂载的服务 +### 2.5.2.2 先创建负载均衡,再选择挂载的服务 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** -**2)点击「HTTP/HTTPS」,切换到HTTP/HTTPS七层负载均衡子页面** +**2)点击「HTTP」,切换到HTTP七层负载均衡子页面** **3)点击「添加负载均衡」,打开负载均衡创建页** @@ -55,19 +55,19 @@ **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾
**描述:**用于做信息备注,可以随时修改
**计费方式:**按流量使用情况计费
- **域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 [详见3.7](user-guide/domain.md)
+ **域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名
**映射关系:**需要填写「域名路径」,以及选择当前负载均衡挂载到的服务。映射的结果就是,可以通过 **<域名>/<路径>** 访问服务 **4)点击「创建」** *** -## 3.5.3 如何将负载均衡从服务解绑 +## 2.5.3 如何将负载均衡从服务解绑 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** -**2)点击「HTTP/HTTPS」,切换到HTTP/HTTPS七层负载均衡子页面** +**2)点击「HTTP」,切换到HTTP七层负载均衡子页面** **3)点击「编辑」icon** @@ -78,26 +78,26 @@ ![添加负载均衡](_figures/user-guide/lb_7_service_off_2.jpg) *** -## 3.5.4 如何删除负载均衡 +## 2.5.4 如何删除负载均衡 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** -**2)点击「HTTP/HTTPS」,切换到HTTP/HTTPS七层负载均衡子页面** +**2)点击「HTTP」,切换到HTTP七层负载均衡子页面** **3)点击「删除」icon** ![添加负载均衡](_figures/user-guide/lb_7_delete.jpg) *** -## 3.5.5 如何绑定用户域名 +## 2.5.5 如何绑定用户域名 首先要保证在「域名管理」中已经正确添加了域名,即「状态」为已绑定。接下来的操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** -**2)点击「HTTP/HTTPS」,切换到HTTP/HTTPS七层负载均衡子页面** +**2)点击「HTTP」,切换到HTTP七层负载均衡子页面** **3)点击「编辑」icon** diff --git a/user-guide/log-and-monitor.md b/user-guide/log-and-monitor.md index b88122b..19feb66 100644 --- a/user-guide/log-and-monitor.md +++ b/user-guide/log-and-monitor.md @@ -1,6 +1,6 @@ -# 3.11 日志 & 监控 +# 2.11 日志 & 监控 -## 3.11.1 查看日志 +## 2.11.1 查看日志 七牛容器云日志系统从 **应用** **服务** **容器** 三个层级对容器操作日志进行聚类,帮助用户更方便地定位问题。 @@ -47,7 +47,7 @@ ![](_figures/user-guide/log-container.png) *** -## 3.11.2 日志筛选 +## 2.11.2 日志筛选 **1. 如何按容器筛选日志?(适用于应用日志或服务日志)** @@ -77,7 +77,7 @@ **是否支持多个关键字:**支持,多个关键字通过空格分隔。匹配结果显示同时包含所有关键字的日志条目,使搜索结果更聚焦。 *** -## 3.11.3 查看监控 +## 2.11.3 查看监控 平台提供「容器」和「负载均衡」两类组件的相关监控。其中容器监控又从「应用」「服务」「容器」三个层级对监控信息进行了聚类。 diff --git a/user-guide/service.md b/user-guide/service.md index 0a0b840..dbe963e 100644 --- a/user-guide/service.md +++ b/user-guide/service.md @@ -1,13 +1,14 @@ -# 3.2 服务 +# 2.2 服务 服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<服务名:服务端口>** 实现同一个区域同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 ?> **有状态服务:**用于持久化存储数据,需要挂「存储卷」。只能单容器实例 **无状态服务:**不能持久化存储数据。支持多容器实例,允许做「服务伸缩」 +*** -## 3.2.1 属性说明 +## 2.2.1 属性说明 ![](_figures/quick-start/create-app-5.png) -### 3.2.1.1 基本配置 +### 2.2.1.1 基本配置 **1. 服务名:**服务一旦创建完成,「服务名」就不能被修改。会在服务配置内网访问时用到 **<服务名>:<端口号>** @@ -26,7 +27,7 @@ **4U8G:**单个容器配4个CPU核和8G内存资源 **8U16G:**单个容器配8个CPU核和16G内存资源 -**5. 容器数量**:服务下的容器实例数。服务运行中时,也可以通过「服务伸缩」[详见3.2.4](#jump4) 进行容器数量的扩缩容,期间服务不中断 +**5. 容器数量**:服务下的容器实例数。服务运行中时,也可以通过「服务伸缩」进行容器数量的扩缩容,期间服务不中断 **6. 存储卷配置**:用于持久化存储数据。只有「有状态服务」能够添加存储卷 @@ -34,20 +35,20 @@ **读写方式:**服务对存储卷的操作权限,分读写和只读 **挂载路径:**存储卷映射到容器内部的路径 -### 3.2.1.2 网络配置 +### 2.2.1.2 网络配置 **7. 网络配置**:配置服务网络,包括内网访问和外网访问的相关配置 ?> **服务端口:**服务在内网的访问端口 **协议类型:**服务在内网的访问协议 **如何配置内网服务之间的互相访问?** -内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。[快速开始 - 服务的内网访问](quick-start/cluster-app.md) +内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 **如何配置服务的外网暴露:** -服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及用户的服务访问。[快速开始 - 服务的外网访问](quick-start/cluster-app.md) +服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及用户的服务访问。 -### 3.2.1.3 高级配置 -**8. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。[详见3.9](user-guide/configmap.md) +### 2.2.1.3 高级配置 +**8. 配置文件**:实现容器内配置文件在平台上做维护的目的。将「配置中心」的配置集挂载到容器内某个文件路径。 ?> **挂载路径:**容器内部文件路径,用于存放配置文件 **配置集名称:**选择需要挂载的配置集。一个配置集包含多个配置项,一个配置项是一个配置文件 @@ -57,16 +58,20 @@ > **加载方式** ?> **手动填写:**手动管理「变量值」 - **配置中心:**通过「配置中心」的「配置项」管理「变量值」,[详见3.9.3](https://kirk-enterprise.github.io/kirk-docs/#/user-guide/configmap?id=_3103-环境变量中的应用) + **配置中心:**通过「配置中心」的「配置项」管理「变量值」 **10. 运行目录**:容器启动后,在「运行目录」下执行命令 -**11. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被忽略 +**11. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被覆盖 *** ## 3.2.2 如何删除服务 -![](_figures/user-guide/service-delete.gif) +服务一旦被删除,将无法恢复。操作如下: + +**1)选中待删除服务** + +**2)点击删除服务** *** ## 3.2.3 如何启动/停止服务 diff --git a/user-guide/storage.md b/user-guide/storage.md index 464a0a3..d517577 100644 --- a/user-guide/storage.md +++ b/user-guide/storage.md @@ -1,10 +1,10 @@ -# 3.4 存储 +# 2.4 存储 这里的存储指的是「有状态服务」的持久化存储卷,采用的是ceph分布式存储方案,具备高可靠、高可用、高安全的特性。 - *** -## 3.4.1 属性说明 -### 3.4.1.1 存储卷本身 +## 2.4.1 属性说明 + +### 2.4.1.1 存储卷本身 ![](_figures/user-guide/storage-service.png) **1. 名称:**存储卷一旦创建完成,「名称」就不能被修改 @@ -13,7 +13,7 @@ **2. 大小:**最小为1G,最大为1024G,调整的最小粒度为1G。 -### 3.4.1.2 挂载到服务 +### 2.4.1.2 挂载到服务 ![](_figures/user-guide/storage-create.png) **1. 名称:**存储卷挂载的服务名称 @@ -25,13 +25,13 @@ !>**注意**:如果挂载到的目录内原原先已有文件,挂载存储卷后,整个目录将会被覆盖 -## 3.4.2 如何创建存储卷,并挂载到服务 +## 2.4.2 如何创建存储卷,并挂载到服务 添加存储卷到服务有两种方式: 第一种是在「创建服务」时添加。 第二种是先在「存储」组件页面下创建存储卷,再选择需要挂载到的服务。 -### 3.4.2.1 「创建服务」时添加 +### 2.4.2.1 「创建服务」时添加 首先要保证创建的是有状态服务,接下来操作如下: **1)在「存储卷配置」处,点击「添加存储配置」** @@ -40,7 +40,7 @@ **2)如果存储卷已经存在,可以直接下拉选择;如果存储卷不存在,可以点击「添加」icon,创建一个存储卷实例** ![](_figures/user-guide/storage-create-service-2.png) -### 3.4.2.2 先创建存储卷,再选择挂载的服务 +### 2.4.2.2 先创建存储卷,再选择挂载的服务 操作如下: **1)点击控制台左边栏的「存储」,切换至存储页面** @@ -51,25 +51,24 @@ ![](_figures/user-guide/storage-storage-service.png) *** -## 3.4.3 如何将存储卷从服务解绑 +## 2.4.3 如何将存储卷从服务解绑 从服务解绑存储卷有两种方式: -第一种是选择需要解绑的服务,通过「服务升级」删除存储卷。[详见3.3.5](user-guide/service?id=_335-如何做服务升级) +第一种是选择需要解绑的服务,通过「服务升级」删除存储卷。 第二种是选择需要解绑的存储卷,通过「从服务移除」操作解绑。 !>**注意:**解绑存储卷,可能会导致服务不可用,请谨慎操作 -### 3.4.3.1 通过「从服务移除」解绑存储卷 +### 2.4.3.1 通过「从服务移除」解绑存储卷 操作如下: **1)点击控制台左边栏的「存储」,切换至存储页面** **2)查找需要解绑的存储卷,点击「从服务移除」icon** -![](_figures/user-guide/storage-storage-service-off.png) *** -## 3.4.4 如何删除存储卷 +## 2.4.4 如何删除存储卷 删除存储卷前,先要保证该存储卷已经从服务解绑。 !>**注意:**删除存储卷,会导致数据不可恢复 diff --git a/user-guide/warning.md b/user-guide/warning.md index 582dad8..9215c87 100644 --- a/user-guide/warning.md +++ b/user-guide/warning.md @@ -1,13 +1,11 @@ -# 3.10 告警中心 -告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP/HTTPS七层负载均衡」三个组件,告警通知方式支持slack、短信、邮件。 +# 2.10 告警中心 +告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 *** -## 3.10.1 属性说明 +## 2.10.1 属性说明 ### 3.10.1.1 告警规则 用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 -![](_figures/user-guide/warning_rule.jpg) - **1. 规则名称:**定义告警项的名称 **2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 @@ -29,9 +27,9 @@ **6. 告警对象:**选择该告警项触发时需要通知的「告警组」 -**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持短信、邮件、Slack +**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack -### 3.10.1.2 告警人 +### 2.10.1.2 告警人 用于管理所有可能接收告警通知的人员通讯录。 ![](_figures/user-guide/warning-person-create.png) @@ -42,7 +40,7 @@ **3. 邮箱:**接收告警通知的邮箱 -### 3.10.1.3 告警组 +### 2.10.1.3 告警组 用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 ![](_figures/user-guide/warning-team-create-1.png) @@ -58,21 +56,20 @@ **5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL *** -## 3.10.2 如何添加告警规则 +## 2.10.2 如何添加告警规则 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** **2)点击「告警规则」,切换至告警规则列表Tab** -**3)点击「新建」,开始创建一条新的告警规则。[3.10.1.1 告警规则属性说明](#jump1)** +**3)点击「新建」,开始创建一条新的告警规则。** -!> 添加告警项前要保证已经存在「告警组」。
- 如需通知对象接收邮件和短信,请确保「告警人」邮箱和手机号完整。 +!> 添加告警项前要保证已经存在「告警组」。
如需通知对象接收slack,请确保「告警组」配置了slack。 *** -## 3.10.3 如何修改告警规则 +## 2.10.3 如何修改告警规则 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** @@ -82,12 +79,12 @@ **3)点击目标告警规则最右侧的「编辑」** *** -## 3.10.4 如何删除告警规则 +## 2.10.4 如何删除告警规则 删除告警规则支持两种方式:
第一种是批量删除
第二种是单条删除
-### 3.10.4.1 批量删除 +### 2.10.4.1 批量删除 操作如下: **1)点击目标告警规则最左侧的「选中」icon** @@ -96,23 +93,23 @@ ![](_figures/user-guide/warning_rule_delete1.jpg) -### 3.10.4.2 单条删除 +### 2.10.4.2 单条删除 操作如下: **1)点击目标告警规则最右侧的「删除」** *** -## 3.10.5 如何添加告警人 +## 2.10.5 如何添加告警人 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** **2)点击「告警人」,切换至告警人列表Tab** -**3)点击「新建」,开始添加一个新的告警人。[3.10.1.2 告警人属性说明](#jump2)** +**3)点击「新建」,开始添加一个新的告警人。** *** -## 3.10.6 如何修改告警人 +## 2.10.6 如何修改告警人 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** @@ -122,12 +119,12 @@ **3)点击目标告警人最右侧的「编辑」** *** -## 3.10.7 如何删除告警人 +## 2.10.7 如何删除告警人 删除告警人支持两种方式:
第一种是批量删除
第二种是单条删除
-### 3.10.4.1 批量删除 +### 2.10.7.1 批量删除 操作如下: **1)点击目标告警人最左侧的「选中」icon** @@ -136,23 +133,23 @@ ![](_figures/user-guide/warning_member_delete.jpg) -### 3.10.4.2 单条删除 +### 2.10.7.2 单条删除 操作如下: **1)点击目标告警人最右侧的「删除」** *** -## 3.10.8 如何添加高警组 +## 2.10.8 如何添加高警组 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** **2)点击「告警组」,切换至告警组列表Tab** -**3)点击「新建」,开始添加一个新的告警组。[3.10.1.3 告警组属性说明](#jump3)** +**3)点击「新建」,开始添加一个新的告警组。** *** -## 3.10.9 如何修改高警组 +## 2.10.9 如何修改高警组 操作如下: **1)点击控制台左边栏的「告警中心」,切换至告警中心界面** @@ -162,7 +159,7 @@ **3)点击目标告警组最右侧的「编辑」** *** -## 3.10.10 如何删除告警组 +## 2.10.10 如何删除告警组 删除告警组支持两种方式:
第一种是批量删除
第二种是单条删除
@@ -180,12 +177,9 @@ **1)点击目标告警组最右侧的「删除」** *** -## 3.10.11 如何设置告警通知 +## 2.10.11 如何设置告警通知 ### 3.10.11.1 设置slack slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 **如何配置Slack API URL:**
需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL - -### 3.10.11.2 设置短信和邮件 -短信和邮件的告警设置是在「高警人」中完成,填写告警人手机和邮箱信息。 From 95eada4fe1355be3ae54a73256c6faa062eff022 Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Mon, 26 Nov 2018 23:26:42 +0800 Subject: [PATCH 4/7] private_edit --- _sidebar.md | 16 +--- user-guide/account.md | 185 ++++++++++++++++++++++++++++++++++++++++++ user-guide/nodes.md | 185 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 373 insertions(+), 13 deletions(-) create mode 100644 user-guide/account.md create mode 100644 user-guide/nodes.md diff --git a/_sidebar.md b/_sidebar.md index 4b64117..d481b6b 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -12,19 +12,9 @@ * [镜像中心](user-guide/image.md) * [配置中心](user-guide/configmap.md) * [告警中心](user-guide/warning.md) + * [应用市场](user-guide/apps.md) + * [主机管理](user-guide/nodes.md) + * [账户中心](user-guide/account.md) * [监控 & 日志](user-guide/log-and-monitor.md) - * [空间管理](user-guide/namespace.md) - * [原生模式](user-guide/origin-mode.md) -* API 文档 - * [账户管理](api-doc/account.md) - * [服务接口](api-doc/service.md) - * [服务接口V2](api-doc/service_v2.md) - * [存储接口](api-doc/volume.md) - * [配置接口](api-doc/configmap.md) - * [HTTP/HTTPS 负载均衡接口](api-doc/alb.md) - * [TCP负载均衡](api-doc/tlb.md) - * [云盘接口](api-doc/volume.md) * 最佳实践 * [开始一个Wordpress应用](best-practise/create-wordpress-app.md) -* Q & A - * [常见问题](q-and-a/about-service.md) diff --git a/user-guide/account.md b/user-guide/account.md new file mode 100644 index 0000000..9215c87 --- /dev/null +++ b/user-guide/account.md @@ -0,0 +1,185 @@ +# 2.10 告警中心 +告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +*** + +## 2.10.1 属性说明 +### 3.10.1.1 告警规则 +用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 + +**1. 规则名称:**定义告警项的名称 + +**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 + +**3. 告警对象:**触发告警的真正实例 + +?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 + **选择实例:**勾选「告警产品」下部分实例为告警监测对象 + +**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> + +?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
+ **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
+ **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
+ **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
+ **阈值:**用户期望的统计结果临界值 + +**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 + +**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 + +**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack + +### 2.10.1.2 告警人 +用于管理所有可能接收告警通知的人员通讯录。 + +![](_figures/user-guide/warning-person-create.png) + +**1. 姓名:**定义告警通知人的姓名 + +**2. 手机:**接收告警通知的手机号 + +**3. 邮箱:**接收告警通知的邮箱 + +### 2.10.1.3 告警组 +用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 + +![](_figures/user-guide/warning-team-create-1.png) + +**1. 组名称:**定义告警通知组的名称 + +**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 + +**3. 添加告警人:**用于临时添加新的「高警人」 + +**4. Channel:**Slack Channel + +**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +*** + +## 2.10.2 如何添加告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击「新建」,开始创建一条新的告警规则。** + +!> 添加告警项前要保证已经存在「告警组」。
+ 如需通知对象接收slack,请确保「告警组」配置了slack。 +*** + +## 2.10.3 如何修改告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击目标告警规则最右侧的「编辑」** +*** + +## 2.10.4 如何删除告警规则 +删除告警规则支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.4.1 批量删除 +操作如下: + +**1)点击目标告警规则最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_rule_delete1.jpg) + +### 2.10.4.2 单条删除 +操作如下: + +**1)点击目标告警规则最右侧的「删除」** +*** + +## 2.10.5 如何添加告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击「新建」,开始添加一个新的告警人。** +*** + +## 2.10.6 如何修改告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击目标告警人最右侧的「编辑」** +*** + +## 2.10.7 如何删除告警人 +删除告警人支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.7.1 批量删除 +操作如下: + +**1)点击目标告警人最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_member_delete.jpg) + +### 2.10.7.2 单条删除 +操作如下: + +**1)点击目标告警人最右侧的「删除」** +*** + +## 2.10.8 如何添加高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击「新建」,开始添加一个新的告警组。** +*** + +## 2.10.9 如何修改高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击目标告警组最右侧的「编辑」** +*** + +## 2.10.10 如何删除告警组 +删除告警组支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 批量删除 + +**1)点击目标告警组最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_team_delete.jpg) + +### 单条删除 + +**1)点击目标告警组最右侧的「删除」** +*** + +## 2.10.11 如何设置告警通知 +### 3.10.11.1 设置slack +slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 + +**如何配置Slack API URL:**
+需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL diff --git a/user-guide/nodes.md b/user-guide/nodes.md new file mode 100644 index 0000000..9215c87 --- /dev/null +++ b/user-guide/nodes.md @@ -0,0 +1,185 @@ +# 2.10 告警中心 +告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +*** + +## 2.10.1 属性说明 +### 3.10.1.1 告警规则 +用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 + +**1. 规则名称:**定义告警项的名称 + +**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 + +**3. 告警对象:**触发告警的真正实例 + +?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 + **选择实例:**勾选「告警产品」下部分实例为告警监测对象 + +**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> + +?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
+ **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
+ **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
+ **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
+ **阈值:**用户期望的统计结果临界值 + +**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 + +**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 + +**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack + +### 2.10.1.2 告警人 +用于管理所有可能接收告警通知的人员通讯录。 + +![](_figures/user-guide/warning-person-create.png) + +**1. 姓名:**定义告警通知人的姓名 + +**2. 手机:**接收告警通知的手机号 + +**3. 邮箱:**接收告警通知的邮箱 + +### 2.10.1.3 告警组 +用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 + +![](_figures/user-guide/warning-team-create-1.png) + +**1. 组名称:**定义告警通知组的名称 + +**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 + +**3. 添加告警人:**用于临时添加新的「高警人」 + +**4. Channel:**Slack Channel + +**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +*** + +## 2.10.2 如何添加告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击「新建」,开始创建一条新的告警规则。** + +!> 添加告警项前要保证已经存在「告警组」。
+ 如需通知对象接收slack,请确保「告警组」配置了slack。 +*** + +## 2.10.3 如何修改告警规则 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警规则」,切换至告警规则列表Tab** + +**3)点击目标告警规则最右侧的「编辑」** +*** + +## 2.10.4 如何删除告警规则 +删除告警规则支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.4.1 批量删除 +操作如下: + +**1)点击目标告警规则最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_rule_delete1.jpg) + +### 2.10.4.2 单条删除 +操作如下: + +**1)点击目标告警规则最右侧的「删除」** +*** + +## 2.10.5 如何添加告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击「新建」,开始添加一个新的告警人。** +*** + +## 2.10.6 如何修改告警人 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警人」,切换至告警人列表Tab** + +**3)点击目标告警人最右侧的「编辑」** +*** + +## 2.10.7 如何删除告警人 +删除告警人支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 2.10.7.1 批量删除 +操作如下: + +**1)点击目标告警人最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_member_delete.jpg) + +### 2.10.7.2 单条删除 +操作如下: + +**1)点击目标告警人最右侧的「删除」** +*** + +## 2.10.8 如何添加高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击「新建」,开始添加一个新的告警组。** +*** + +## 2.10.9 如何修改高警组 +操作如下: + +**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** + +**2)点击「告警组」,切换至告警组列表Tab** + +**3)点击目标告警组最右侧的「编辑」** +*** + +## 2.10.10 如何删除告警组 +删除告警组支持两种方式:
+第一种是批量删除
+第二种是单条删除
+ +### 批量删除 + +**1)点击目标告警组最左侧的「选中」icon** + +**2)点击「删除」** + +![](_figures/user-guide/warning_team_delete.jpg) + +### 单条删除 + +**1)点击目标告警组最右侧的「删除」** +*** + +## 2.10.11 如何设置告警通知 +### 3.10.11.1 设置slack +slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 + +**如何配置Slack API URL:**
+需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL From a1e7501614e6b6c0b6d79607d5f9c1e410d2e10c Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Fri, 30 Nov 2018 15:30:44 +0800 Subject: [PATCH 5/7] private_edit --- _figures/user-guide/nodes_add.jpg | Bin 0 -> 45234 bytes _figures/user-guide/nodes_ops_in.jpg | Bin 0 -> 22770 bytes _figures/user-guide/nodes_ops_out.png | Bin 0 -> 27424 bytes quick-start/cluster-app.md | 11 +- quick-start/create-app.md | 19 +- user-guide/account.md | 193 +++++----------- user-guide/app.md | 6 +- user-guide/apps.md | 303 +++++++++++--------------- user-guide/domain.md | 4 - user-guide/image.md | 19 +- user-guide/loadbalance_4.md | 4 - user-guide/loadbalance_7.md | 14 +- user-guide/log-and-monitor.md | 8 +- user-guide/nodes.md | 195 ++++------------- user-guide/service.md | 66 ++++-- user-guide/storage.md | 10 +- user-guide/warning.md | 4 +- 17 files changed, 308 insertions(+), 548 deletions(-) create mode 100644 _figures/user-guide/nodes_add.jpg create mode 100644 _figures/user-guide/nodes_ops_in.jpg create mode 100644 _figures/user-guide/nodes_ops_out.png diff --git a/_figures/user-guide/nodes_add.jpg b/_figures/user-guide/nodes_add.jpg new file mode 100644 index 0000000000000000000000000000000000000000..864dbbec3cc0b8d8452f859fb596f9469a1e776f GIT binary patch literal 45234 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 A$p8QV literal 0 HcmV?d00001 diff --git a/_figures/user-guide/nodes_ops_out.png b/_figures/user-guide/nodes_ops_out.png new file mode 100644 index 0000000000000000000000000000000000000000..47acee954d1dad09911d8a08daa5e7515a2c3ee7 GIT binary patch literal 27424 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 J`Hszje*g%41.2.1 服务的内网访问 容器在发生重启后,会出现内网IP的改变。这种情况下,如果还是通过IP+PORT的形式访问容器,会导致访问异常。因此容器的内网访问通过服务注册发现的机制来完成。操作如下: @@ -16,15 +13,15 @@ **2)选择容器的「通信协议」** -?> 服务创建后会自动添加DNS记录,服务以 **<服务名>:<服务端口>** 的形式暴露访问端口 +?> 服务创建后会自动添加DNS记录,服务以 **<应用名>-<服务名>:<端口号>** 的形式暴露访问端口 ![](_figures/quick-start/cluster-app-inside.png) *** ## 1.2.2 服务的外网访问 -负载均衡可以扩展服务的访问能力到外网,平台支持「HTTP/HTTPS」七层和「TCP」四层两类负载均衡。 +负载均衡可以扩展服务的访问能力到外网,平台支持「HTTP」七层和「TCP」四层两类负载均衡。 -### 1.2.2.1 HTTP/HTTPS七层负载均衡 +### 1.2.2.1 HTTP七层负载均衡 七层负载均衡可以通过两种方式挂载到服务: 第一种是在「创建服务」时添加。 第二种是先在「负载均衡」组件页面下创建负载均衡,再选择需要挂载的服务。 diff --git a/quick-start/create-app.md b/quick-start/create-app.md index fc794f0..e0e118a 100644 --- a/quick-start/create-app.md +++ b/quick-start/create-app.md @@ -1,12 +1,12 @@ # 1.1 基于镜像创建一个应用 {docsify-ignore-all} 一个应用一般由多个服务组成,所以创建一个应用就是创建多个服务并配置多个服务之间的依赖关系。开始创建一个应用,操作如下: -[1.1.1 选择空间](#jump1) +[1.1.1 选择空间](#jump1) [1.1.2 添加应用](#jump2) [1.1.3 创建服务](#jump3) -- [2.1.3.1 创建无状态服务](#jump31) -- [2.1.3.2 创建有状态服务](#jump32) +- [1.1.3.1 创建无状态服务](#jump31) +- [1.1.3.2 创建有状态服务](#jump32) ## 1.1.1 选择空间 @@ -29,6 +29,7 @@ **从应用市场创建:**应用基于应用市场的应用模版创建,一键创建,实现自运维。 **4)填写「应用名」** + !> **命名规则:**2-30位的小写字母、数字,开头为字母 **5)点击「添加服务」** @@ -38,7 +39,7 @@ ![](_figures/quick-start/create-app-5.png) -服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<服务名>:<服务端口>** 实现同一个集群同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 +服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<应用名>-<服务名>:<端口号>** 实现同一个集群同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 ?> **有状态服务:**用于持久化存储数据,需要挂「存储卷」。只能单容器实例。 **无状态服务:**不能持久化存储数据。支持多容器实例,允许做「服务伸缩」。 @@ -67,7 +68,7 @@ **4U8G:**单个容器配4个CPU核和8G内存资源 **8U16G:**单个容器配8个CPU核和16G内存资源 -**5. 容器数量**:服务下的容器实例数。服务运行中时,也可以通过「服务伸缩」进行数量的扩所容,期间服务不中断。 +**5. 容器数量**:服务下的容器实例数。服务运行中时,也可以通过「服务伸缩」进行数量的扩缩容,期间服务不中断。 **6. 网络配置**:配置服务网络,包括内网访问和外网访问的相关配置。 @@ -75,7 +76,7 @@ **协议类型:**服务在内网的访问协议 **如何配置内网服务之间的互相访问?** -内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 +内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<应用名>-<服务名>:<端口号>**。 **如何配置服务的外网暴露:** 服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨集群的服务互访,以及外部用户的服务访问。 @@ -94,7 +95,7 @@ **9. 运行目录**:容器启动后,在「运行目录」下执行命令。 -**10. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被忽略。 +**10. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被覆盖。 ### 1.1.3.2 创建有状态服务 @@ -134,7 +135,7 @@ **协议类型:**服务在内网的访问协议 **如何配置内网服务之间的互相访问?** -内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 +内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<应用名>-<服务名>:<端口号>**。 **如何配置服务的外网暴露:** 服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及外部用户的服务访问。 @@ -153,4 +154,4 @@ **10. 运行目录**:容器启动后,在「运行目录」下执行命令。 -**11. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被忽略。 \ No newline at end of file +**11. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被覆盖。 \ No newline at end of file diff --git a/user-guide/account.md b/user-guide/account.md index 9215c87..2dbd28b 100644 --- a/user-guide/account.md +++ b/user-guide/account.md @@ -1,185 +1,96 @@ -# 2.10 告警中心 -告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +# 2.13 账户中心 +账户中心用于对平台用户和空间的管理,只对平台管理员开放。 *** -## 2.10.1 属性说明 -### 3.10.1.1 告警规则 -用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 +## 2.13.1 属性说明 +### 2.13.1.1 用户管理 +**1. 用户名:**系统自动生成的UID
+**2. 邮箱:**用户邮箱
-**1. 规则名称:**定义告警项的名称 +平台用户分为两种角色,普通用户和系统管理员。
-**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 +?> **普通用户:**平台的普通账户,不具备人员和空间的管理能力
+ **系统管理员:**平台的系统管理员,能够对人员和空间进行管理 -**3. 告警对象:**触发告警的真正实例 - -?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 - **选择实例:**勾选「告警产品」下部分实例为告警监测对象 - -**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> - -?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
- **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
- **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
- **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
- **阈值:**用户期望的统计结果临界值 - -**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 - -**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 - -**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack - -### 2.10.1.2 告警人 -用于管理所有可能接收告警通知的人员通讯录。 - -![](_figures/user-guide/warning-person-create.png) - -**1. 姓名:**定义告警通知人的姓名 - -**2. 手机:**接收告警通知的手机号 - -**3. 邮箱:**接收告警通知的邮箱 - -### 2.10.1.3 告警组 -用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 - -![](_figures/user-guide/warning-team-create-1.png) - -**1. 组名称:**定义告警通知组的名称 - -**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 - -**3. 添加告警人:**用于临时添加新的「高警人」 - -**4. Channel:**Slack Channel - -**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +### 2.13.1.2 集群空间 +**1. 名称:**空间名称
+**2. 空间描述:**空间的描述信息
*** -## 2.10.2 如何添加告警规则 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** +## 2.13.2 如何创建空间 +操作如下:
-**2)点击「告警规则」,切换至告警规则列表Tab** +**1)展开控制台左边栏的「账号中心」,点击「集群空间」,进入空间列表页面** -**3)点击「新建」,开始创建一条新的告警规则。** +**2)点击「添加空间」** -!> 添加告警项前要保证已经存在「告警组」。
- 如需通知对象接收slack,请确保「告警组」配置了slack。 +**3)填写「名称」和「描述信息」** *** -## 2.10.3 如何修改告警规则 -操作如下: +## 2.13.3 如何删除空间 +删除空间,将同步清空空间下资源。操作如下:
-**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** +**1)展开控制台左边栏的「账号中心」,点击「集群空间」,进入空间列表页面** -**2)点击「告警规则」,切换至告警规则列表Tab** +**2)点击空间最右侧的「删除」icon** -**3)点击目标告警规则最右侧的「编辑」** +**3)删除操作需要输入当前平台管理员的密码进行二次确认** *** -## 2.10.4 如何删除告警规则 -删除告警规则支持两种方式:
-第一种是批量删除
-第二种是单条删除
+## 2.13.4 如何创建新的用户账号 +操作如下:
-### 2.10.4.1 批量删除 -操作如下: +**1)展开控制台左边栏的「账号中心」,点击「用户管理」,进入用户列表页面** -**1)点击目标告警规则最左侧的「选中」icon** +**2)点击「添加账号」** -**2)点击「删除」** - -![](_figures/user-guide/warning_rule_delete1.jpg) - -### 2.10.4.2 单条删除 -操作如下: - -**1)点击目标告警规则最右侧的「删除」** +**3)填写「邮箱」和「密码」** *** -## 2.10.5 如何添加告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警人」,切换至告警人列表Tab** - -**3)点击「新建」,开始添加一个新的告警人。** -*** - -## 2.10.6 如何修改告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** +## 2.13.5 如何删除用户账号 +操作如下:
-**2)点击「告警人」,切换至告警人列表Tab** +**1)展开控制台左边栏的「账号中心」,点击「用户管理」,进入用户列表页面** -**3)点击目标告警人最右侧的「编辑」** +**2)点击用户最右侧的「删除」icon** *** -## 2.10.7 如何删除告警人 -删除告警人支持两种方式:
-第一种是批量删除
-第二种是单条删除
+## 2.13.6 如何添加用户到空间 +操作如下:
-### 2.10.7.1 批量删除 -操作如下: +**1)展开控制台左边栏的「账号中心」,点击「集群空间」,进入空间列表页面** -**1)点击目标告警人最左侧的「选中」icon** +**2)点击空间名,进入空间详情** -**2)点击「删除」** - -![](_figures/user-guide/warning_member_delete.jpg) - -### 2.10.7.2 单条删除 -操作如下: - -**1)点击目标告警人最右侧的「删除」** +**3)点击「添加成员」,通过下拉或者搜索的方式查找需要加入当前空间的成员邮箱,再在「角色类型」中勾选赋予他的角色(管理员或者普通成员)** *** -## 2.10.8 如何添加高警组 -操作如下: +## 2.13.7 如何从空间删除用户 +操作如下:
-**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** +**1)展开控制台左边栏的「账号中心」,点击「集群空间」,进入空间列表页面** -**2)点击「告警组」,切换至告警组列表Tab** +**2)点击空间名,进入空间详情** -**3)点击「新建」,开始添加一个新的告警组。** +**3)点击用户最右侧的「删除」icon** *** -## 2.10.9 如何修改高警组 -操作如下: +## 2.13.8 如何设置普通用户为系统管理员 +操作如下:
-**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** +**1)展开控制台左边栏的「账号中心」,点击「用户管理」,进入用户列表页面** -**2)点击「告警组」,切换至告警组列表Tab** +**2)点击系统管理员tab,进入系统管理员列表** -**3)点击目标告警组最右侧的「编辑」** +**3)点击「添加系统管理员」,通过下拉或者搜索的方式查找需要升级为系统管理员的用户邮箱** *** -## 2.10.10 如何删除告警组 -删除告警组支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 批量删除 - -**1)点击目标告警组最左侧的「选中」icon** +## 2.13.9 如何设置系统管理员为普通用户 +操作如下:
-**2)点击「删除」** - -![](_figures/user-guide/warning_team_delete.jpg) - -### 单条删除 - -**1)点击目标告警组最右侧的「删除」** -*** +**1)展开控制台左边栏的「账号中心」,点击「用户管理」,进入用户列表页面** -## 2.10.11 如何设置告警通知 -### 3.10.11.1 设置slack -slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 +**2)点击系统管理员tab,进入系统管理员列表** -**如何配置Slack API URL:**
-需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +**3)点击系统管理员最右侧的「将为普通用户」icon** +*** \ No newline at end of file diff --git a/user-guide/app.md b/user-guide/app.md index 9280e2e..a84d548 100644 --- a/user-guide/app.md +++ b/user-guide/app.md @@ -19,8 +19,8 @@ ## 2.1.2 如何创建应用 应用创建有两种方式:「基于镜像创建」和「从应用市场创建」。 -?> **基于镜像创建:**应用下所有服务都是基于「镜像中心」的服务镜像创建,服务的配置以及服务间的网络通信都是在平台上可视化定义。
- **从应用市场创建:**应用通过「应用市场」的应用模版直接创建,应用模版已经完成服务的部分配置以及服务间的网络通信配置,甚至可以做到一键启动应用。 +?> **基于镜像创建:**应用基于镜像中心的镜像创建,需要自行配置应用下服务间依赖。
+ **从应用市场创建:**应用基于应用市场的应用模版创建,一键创建,实现自运维。 ![](_figures/user-guide/app-create-1.png) @@ -33,7 +33,7 @@ ![下拉选择空间](_figures/quick-start/create-app-namespace.png) -**3. 添加服务** +**3. 添加服务:** 参见 **服务** ### 2.1.2.2 从应用市场创建 参见 **应用市场** diff --git a/user-guide/apps.md b/user-guide/apps.md index 9215c87..e76a66b 100644 --- a/user-guide/apps.md +++ b/user-guide/apps.md @@ -1,185 +1,148 @@ -# 2.10 告警中心 -告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +# 2.11 应用市场 +应用市场包含了三款数据库产品:MySQL、Redis、MongoDB。用户基于应用市场创建应用,只需通过填写表单就能够一键创建出具备高可用、自运维特性的应用。 *** -## 2.10.1 属性说明 -### 3.10.1.1 告警规则 -用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 +## 2.11.1 属性说明 +**1. 应用名称:**应用的名称 -**1. 规则名称:**定义告警项的名称 +!> **命名空间:**2-30位的小写字母、数字,开头为字母 -**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 +**2. 资源规格:**提供6种容器规格 -**3. 告警对象:**触发告警的真正实例 +?> **1U1G:**单个容器配1个CPU核和1G内存资源 + **1U2G:**单个容器配1个CPU核和2G内存资源 + **2U2G:**单个容器配2个CPU核和2G内存资源 + **2U4G:**单个容器配2个CPU核和4G内存资源 + **4U8G:**单个容器配4个CPU核和8G内存资源 + **8U16G:**单个容器配8个CPU核和16G内存资源 -?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 - **选择实例:**勾选「告警产品」下部分实例为告警监测对象 +**3. 存储容量:**最小为1G,最大为1024G,调整的最小粒度为1G -**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> +**4. 每天定时备份时刻:**每天定时自动备份的时刻 -?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
- **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
- **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
- **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
- **阈值:**用户期望的统计结果临界值 +**5. 备份保留时长:**最小为3天,最大为365天,调整的最小粒度为1天 -**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 - -**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 - -**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack - -### 2.10.1.2 告警人 -用于管理所有可能接收告警通知的人员通讯录。 - -![](_figures/user-guide/warning-person-create.png) - -**1. 姓名:**定义告警通知人的姓名 - -**2. 手机:**接收告警通知的手机号 - -**3. 邮箱:**接收告警通知的邮箱 - -### 2.10.1.3 告警组 -用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 - -![](_figures/user-guide/warning-team-create-1.png) - -**1. 组名称:**定义告警通知组的名称 - -**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 - -**3. 添加告警人:**用于临时添加新的「高警人」 - -**4. Channel:**Slack Channel - -**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL -*** - -## 2.10.2 如何添加告警规则 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警规则」,切换至告警规则列表Tab** - -**3)点击「新建」,开始创建一条新的告警规则。** - -!> 添加告警项前要保证已经存在「告警组」。
- 如需通知对象接收slack,请确保「告警组」配置了slack。 -*** - -## 2.10.3 如何修改告警规则 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警规则」,切换至告警规则列表Tab** - -**3)点击目标告警规则最右侧的「编辑」** -*** - -## 2.10.4 如何删除告警规则 -删除告警规则支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 2.10.4.1 批量删除 -操作如下: - -**1)点击目标告警规则最左侧的「选中」icon** - -**2)点击「删除」** - -![](_figures/user-guide/warning_rule_delete1.jpg) - -### 2.10.4.2 单条删除 -操作如下: - -**1)点击目标告警规则最右侧的「删除」** +**6. 初始Root密码:**6-32个字符 *** -## 2.10.5 如何添加告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警人」,切换至告警人列表Tab** - -**3)点击「新建」,开始添加一个新的告警人。** +## 2.11.2 MySQL应用 +MySQL应用是基于Percona XtraDB Cluster集群方案的三主节点架构,实例间会基于Galera Replication技术实现数据的实时同步。在单节点或者两节点出现不可用时,不会影响应用的可用性。MySQL版本为5.7。 + +### 2.11.2.1 基本信息 +**1)部署状态:**分为开始时间、结束时间、阶段三个属性 + +?> **开始时间:**集群开始创建的时间
+ **结束时间:**集群初始化结束,应用可用的时间
+ **阶段:**分为`创建中`、`创建成功`、`创建失败`三个阶段 + +**2)集群健康:**分为集群、节点、是否在修复三个属性 + +?> **集群:**分为`可用`、`部分可用`、`异常`三种状态。`可用`代表三个节点状态均为`green`,整个集群完全正常且可用;`部分可用`代表存在`green`的节点,但是其他节点为`red`或者`yellow`,集群存在异常,但是不影响可用性;`异常`代表三个节点均为`red`,整个集群不可用
+ **节点:** "pod name:节点状态",其中节点状态分为`red`和`yelloW`、`green`。`red`代表该节点异常,不可用;`yellow`代表该节点存在异常,但是仍可以正常读写,不影响可用性;`green`代表该节点正常,完全可用
+ **是否在修复:**是否有节点正在自我修复 + +**3)访问地址:**mysql的`service-ip`。mysql应用通过`service-ip`暴露自己的访问方式,kubernetes能够将对`service-ip`的访问自动解析到应用容器 + +### 2.11.2.2 备份恢复 +MySQL应用的备份/恢复提供手动和自动两种模式。
+**1)最近恢复:**分为恢复开始、结束时间、恢复阶段三个属性 + +?> **恢复时间:**应用开始恢复的时间
+ **结束时间:**备份数据已经恢复完成的时间
+ **恢复阶段:**分为`恢复中`、`恢复成功`、`恢复失败`三个阶段 + +**2)备份:**:包括「立即备份」和「恢复此备份」的操作,以及每次备份的记录。
+点击「立即备份」,会要求填写该备份需要保留的时长,如果超出时长,该备份就会被永久删除。
+点击「恢复此备份」,就会手动触发该备份的手动回复。 + +?> **任务ID:**此次备份的ID
+ **备份名称:**此次备份的名称
+ **开始时间:**此次备份开始的时间
+ **结束时间:**此次备份结束的时间
+ **备份状态:**此次备份的状态,分为`备份中`、`备份成功`、`备份失败` + +### 2.11.2.3 监控 +监控分为资源监控和引擎监控。 + +?> **资源监控:**包括集群内每个节点的CPU利用率、内存利用率。整个集群的入口流量和出口流量。
+ **引擎监控:**包括链接频率、select/insert/update/delete频率、connect aborted、cluster error *** -## 2.10.6 如何修改告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警人」,切换至告警人列表Tab** - -**3)点击目标告警人最右侧的「编辑」** +## 2.11.3 Redis应用 +Redis应用是基于三哨兵节点和主从数据节点架构设计的高可用方案。Redis版本为4.0.6。 + +### 2.11.3.1 基本信息 +**1)部署状态:**分为开始时间、结束时间、阶段三个属性 + +?> **开始时间:**集群开始创建的时间
+ **结束时间:**集群初始化结束,应用可用的时间
+ **阶段:**分为`创建中`、`创建成功`、`创建失败`三个阶段 + +**2)集群健康:**分为集群、节点、是否在修复三个属性 + +?> **集群:**分为`可用`、`部分可用`、`异常`三种状态。`可用`代表五个节点状态均为`green`,整个集群完全正常且可用;`部分可用`代表存在`green`的数据节点,但是有其他为`red`或者`yellow`的节点,集群存在异常,但是不影响可用性;`异常`代表两个数据节点均为`red`,整个集群不可用
+ **节点:** "pod name:节点状态",其中节点状态分为`red`和`yelloW`、`green`。`red`代表该节点异常,不可用;`yellow`代表该节点存在异常,如果是数据节点仍可以正常读写,如果是哨兵节点仍可以做主备切换,不影响可用性;`green`代表该节点正常,完全可用
+ **是否在修复:**是否有节点正在自我修复 + +**3)访问地址:**redis的`service-name`。redis应用通过`service-name`暴露自己的访问方式,kubernetes能够将对`service-name`的访问自动解析到应用容器 + +### 2.11.3.2 备份恢复 +Redis应用的备份/恢复提供手动和自动两种模式。
+**1)最近恢复:**分为恢复开始、结束时间、恢复阶段三个属性 + +?> **恢复时间:**应用开始恢复的时间
+ **结束时间:**备份数据已经恢复完成的时间
+ **恢复阶段:**分为`恢复中`、`恢复成功`、`恢复失败`三个阶段 + +**2)备份:**:包括「立即备份」和「恢复此备份」的操作,以及每次备份的记录。
+点击「立即备份」,会要求填写该备份需要保留的时长,如果超出时长,该备份就会被永久删除。
+点击「恢复此备份」,就会手动触发该备份的手动回复。 + +?> **任务ID:**此次备份的ID
+ **备份名称:**此次备份的名称
+ **开始时间:**此次备份开始的时间
+ **结束时间:**此次备份结束的时间
+ **备份状态:**此次备份的状态,分为`备份中`、`备份成功`、`备份失败` + +### 2.11.3.3 监控 +监控分为资源监控和引擎监控。 + +?> **资源监控:**包括五个主节点的CPU利用率、内存利用率,两个数据节点的磁盘利用率、入口流量和出口流量。 + **引擎监控:**包括Cache Hit Ratio、Master Slave IO Seconds、Total Keys、Active Connections、Top5 Commands Executed *** -## 2.10.7 如何删除告警人 -删除告警人支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 2.10.7.1 批量删除 -操作如下: - -**1)点击目标告警人最左侧的「选中」icon** - -**2)点击「删除」** - -![](_figures/user-guide/warning_member_delete.jpg) - -### 2.10.7.2 单条删除 -操作如下: - -**1)点击目标告警人最右侧的「删除」** -*** - -## 2.10.8 如何添加高警组 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警组」,切换至告警组列表Tab** - -**3)点击「新建」,开始添加一个新的告警组。** -*** - -## 2.10.9 如何修改高警组 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警组」,切换至告警组列表Tab** - -**3)点击目标告警组最右侧的「编辑」** -*** - -## 2.10.10 如何删除告警组 -删除告警组支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 批量删除 - -**1)点击目标告警组最左侧的「选中」icon** - -**2)点击「删除」** - -![](_figures/user-guide/warning_team_delete.jpg) - -### 单条删除 - -**1)点击目标告警组最右侧的「删除」** -*** - -## 2.10.11 如何设置告警通知 -### 3.10.11.1 设置slack -slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 - -**如何配置Slack API URL:**
-需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL +## 2.11.4 MongoDB应用 +MongoDB应用是基于裁判节点和主从数据节点架构设计的高可用方案。MongoDB的版本是3.4。 + +### 2.11.4.1 基本信息 +**1)部署状态:**分为开始时间、结束时间、阶段三个属性 + +?> **开始时间:**集群开始创建的时间
+ **结束时间:**集群初始化结束,应用可用的时间
+ **阶段:**分为`创建中`、`创建成功`、`创建失败`三个阶段 + +**2)集群健康:**分为集群、节点、是否在修复三个属性 + +?> **集群:**分为`可用`、`部分可用`、`异常`三种状态。`可用`代表三个节点状态均为`green`,整个集群完全正常且可用;`部分可用`代表存在`green`的数据节点,但是有其他为`red`或者`yellow`的节点,集群存在异常,但是不影响可用性;`异常`代表两个数据节点均为`red`,整个集群不可用
+ **节点:** "pod name:节点状态",其中节点状态分为`red`和`yelloW`、`green`。`red`代表该节点异常,不可用;`yellow`代表该节点存在异常,如果是数据节点仍可以正常读写,如果是裁判节点仍可以做主备切换,不影响可用性;`green`代表该节点正常,完全可用
+ **是否在修复:**是否有节点正在自我修复 + +**3)访问地址:**`<应用ID>/,`。MongoDB通过`<应用ID>/,`暴露自己的访问方式,kubernetes能够将对``<应用ID>/,`的访问自动解析到应用容器。 + +### 2.11.4.2 备份恢复 +MongoDB应用的备份/恢复提供手动和自动两种模式。
+**1)最近恢复:**分为恢复开始、结束时间、恢复阶段三个属性 + +?> **恢复时间:**应用开始恢复的时间
+ **结束时间:**备份数据已经恢复完成的时间
+ **恢复阶段:**分为`恢复中`、`恢复成功`、`恢复失败`三个阶段 + +**2)备份:**:包括「立即备份」和「恢复此备份」的操作,以及每次备份的记录。
+点击「立即备份」,会要求填写该备份需要保留的时长,如果超出时长,该备份就会被永久删除。
+点击「恢复此备份」,就会手动触发该备份的手动回复。 + +?> **任务ID:**此次备份的ID
+ **备份名称:**此次备份的名称
+ **开始时间:**此次备份开始的时间
+ **结束时间:**此次备份结束的时间
+ **备份状态:**此次备份的状态,分为`备份中`、`备份成功`、`备份失败` diff --git a/user-guide/domain.md b/user-guide/domain.md index e95e074..4496072 100644 --- a/user-guide/domain.md +++ b/user-guide/domain.md @@ -3,12 +3,10 @@ *** ## 2.7.1 属性说明 - **1. 域名名称:**域名一旦被添加,就不能修改域名名称 *** ## 2.7.2 如何添加域名 - 操作如下: **1)点击左侧菜单栏「域名管理」,进入域名管理界面** @@ -19,7 +17,6 @@ *** ## 2.7.3 如何配置 CNAME - 添加域名完成后,会提示需要配置域名 CNAME 到指定的「CNAME 域名」,「CNAME 域名」只能用于配置 CNAME,不能访问,CNAME 生效后方可使用。 ![配置 CNAME](_figures/user-guide/domain_cname.jpg) @@ -33,7 +30,6 @@ *** ## 2.7.4 如何删除域名 - 操作如下: **1)点击左侧菜单栏「域名管理」,进入域名管理界面** diff --git a/user-guide/image.md b/user-guide/image.md index 552d266..c1d6f93 100644 --- a/user-guide/image.md +++ b/user-guide/image.md @@ -6,61 +6,56 @@ *** ## 2.8.1 属性说明 - -**1. 仓库名称:**用户可以在[镜像中心控制台](https://hub.qiniu.com/portal)自定义仓库名称。也可以直接通过‘docker pull’的方式上传镜像,默认使用镜像名称作为仓库名称 +**1. 仓库名称:**用户可以直接通过`docker pull`的方式上传镜像,默认使用镜像名称作为仓库名称 **2. 仓库地址:**<仓库地址>/<空间名>/<镜像名称>:<版本号> **3. 更新时间:**镜像版本更新的最新时间 **4. 所选版本:**罗列了仓库托管的所有镜像版本,选中版本后,可以通过「部署」操作创建基于该版本的服务 *** ## 2.8.2 如何创建镜像仓库 - 用户推送本地镜像到仓库的时候,如果该仓库不存在,会自动以镜像名作为仓库名创建。
*** ## 2.8.3 如何推送本地镜像到仓库 - ![](_figures/user-guide/image-push.png) 操作如下: **1)登录镜像中心服务器** ``` -docker login <镜像中心地址> -u {你的七牛账号} -p {密码i +docker login {镜像中心地址} -u {你的邮箱} -p {密码} ``` 返回「**Login Succeded**」即为登录成功 **2)为本地镜像标记tag** ``` -docker tag {镜像名或id} <镜像中心地址>/{命名空间}/{镜像名}:{标签} +docker tag {镜像名或id} {镜像中心地址}/{命名空间}/{镜像名}:{标签} ``` **3)推送镜像到仓库** ``` -docker push <镜像中心地址>/{命名空间}/{镜像名}:{标签} +docker push {镜像中心地址}/{命名空间}/{镜像名}:{标签} ``` !>推送已经存在的镜像版本到仓库,会使用新版本的镜像覆盖老版本镜像 *** ## 2.8.4 如何拉取仓库镜像到本地 - 操作如下: -**1)登录七牛镜像中心服务器** +**1)登录镜像中心服务器** ``` -docker login <镜像中心地址> -u {你的七牛账号} -p {密码} +docker login {镜像中心地址} -u {你的邮箱} -p {密码} ``` 返回「**Login Succeded**」即为登录成功 **2)拉取镜像到本地** ``` -docker pull <镜像中心地址>/{命名空间}/{镜像名}:{标签} +docker pull {镜像中心地址}/{命名空间}/{镜像名}:{标签} ``` *** ## 2.8.5 如何基于某个镜像版本创建服务 - 基于镜像版本创建服务有两种方式:
第一种是先「创建服务」,再选择服务的镜像版本
第二种是先在「镜像中心」选择镜像版本,再选择部署服务
diff --git a/user-guide/loadbalance_4.md b/user-guide/loadbalance_4.md index 54af670..6bb7e9d 100644 --- a/user-guide/loadbalance_4.md +++ b/user-guide/loadbalance_4.md @@ -3,7 +3,6 @@ *** ## 2.6.1 属性说明 - **1. 名称:**负载均衡一旦创建完成,「名称」将不能被修改 !> **命名规则:**2-64位的小写字母、数字或"-",不能以"-"开头或结尾 @@ -16,7 +15,6 @@ *** ## 2.6.2 如何创建负载均衡,并绑定到服务 - 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** @@ -35,7 +33,6 @@ *** ## 2.6.3 如何将负载均衡从服务解绑 - 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** @@ -50,7 +47,6 @@ *** ## 2.6.4 如何删除负载均衡 - 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** diff --git a/user-guide/loadbalance_7.md b/user-guide/loadbalance_7.md index 179b689..d545077 100644 --- a/user-guide/loadbalance_7.md +++ b/user-guide/loadbalance_7.md @@ -4,23 +4,18 @@ ## 2.5.1 属性说明 -![](_figures/user-guide/lb_7_para.jpg) - **1. 名称:**负载均衡一旦创建完成,「名称」将不能被修改 !> **命名规则:**2-64位的小写字母、数字或"-",不能以"-"开头或结尾 **2. 描述:**用于做信息备注,可以随时修改 -**3. 计费方式:**按流量使用情况计费 - -**4. 域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 +**3. 域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名 -**5. 映射关系:**需要填写「域名路径」,以及选择当前负载均衡挂载到的服务。映射的结果就是,可以通过 **<域名>/<路径>** 访问服务 +**4. 映射关系:**需要填写「域名路径」,以及选择当前负载均衡挂载到的服务。映射的结果就是,可以通过 **<域名>/<路径>** 访问服务 *** ## 2.5.2 如何创建负载均衡,并绑定到服务 - 添加负载均衡到服务有两种方式: 第一种是在「创建服务」时添加。 第二种是先在「负载均衡」组件页面的「HTTP」tab下创建,再选择需要挂载到的服务。 @@ -35,7 +30,6 @@ ?> 创建负载均衡实例需要以下信息: **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾
**描述:**用于做信息备注,可以随时修改
- **计费方式:**按流量使用情况计费
**域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名
**3)填写「路径」,将域名下的某个子目录指向服务。** @@ -54,7 +48,6 @@ ?> 创建负载均衡实例需要以下信息: **名称·:**长度为2-64的小写字母、数字或"-", 不能以"-"开头或结尾
**描述:**用于做信息备注,可以随时修改
- **计费方式:**按流量使用情况计费
**域名:**用于将用户域名绑定到负载均衡。需要确保「域名管理」中有可用域名
**映射关系:**需要填写「域名路径」,以及选择当前负载均衡挂载到的服务。映射的结果就是,可以通过 **<域名>/<路径>** 访问服务 @@ -62,7 +55,6 @@ *** ## 2.5.3 如何将负载均衡从服务解绑 - 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** @@ -79,7 +71,6 @@ *** ## 2.5.4 如何删除负载均衡 - 操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** @@ -92,7 +83,6 @@ *** ## 2.5.5 如何绑定用户域名 - 首先要保证在「域名管理」中已经正确添加了域名,即「状态」为已绑定。接下来的操作如下: **1)点击左侧菜单栏「负载均衡」,进入负载均衡组件页面** diff --git a/user-guide/log-and-monitor.md b/user-guide/log-and-monitor.md index 19feb66..f70eebb 100644 --- a/user-guide/log-and-monitor.md +++ b/user-guide/log-and-monitor.md @@ -1,6 +1,6 @@ -# 2.11 日志 & 监控 +# 2.14 日志 & 监控 -## 2.11.1 查看日志 +## 2.14.1 查看日志 七牛容器云日志系统从 **应用** **服务** **容器** 三个层级对容器操作日志进行聚类,帮助用户更方便地定位问题。 @@ -47,7 +47,7 @@ ![](_figures/user-guide/log-container.png) *** -## 2.11.2 日志筛选 +## 2.14.2 日志筛选 **1. 如何按容器筛选日志?(适用于应用日志或服务日志)** @@ -77,7 +77,7 @@ **是否支持多个关键字:**支持,多个关键字通过空格分隔。匹配结果显示同时包含所有关键字的日志条目,使搜索结果更聚焦。 *** -## 2.11.3 查看监控 +## 2.14.3 查看监控 平台提供「容器」和「负载均衡」两类组件的相关监控。其中容器监控又从「应用」「服务」「容器」三个层级对监控信息进行了聚类。 diff --git a/user-guide/nodes.md b/user-guide/nodes.md index 9215c87..7cd5d7a 100644 --- a/user-guide/nodes.md +++ b/user-guide/nodes.md @@ -1,185 +1,68 @@ -# 2.10 告警中心 -告警中心用于监控指标的阈值告警,当前适应于「服务」、「存储」、「HTTP七层负载均衡」三个组件,告警通知方式支持slack。 +# 2.12 主机管理 +主机管理用于对当前容器集群的主机进行运维管理,包括主机资源监控看板、主机的维护模式、删除节点操作。主机节点只针对平台管理员可见。 *** -## 2.10.1 属性说明 -### 3.10.1.1 告警规则 -用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 +## 2.12.1 属性说明 +**1. 主机:**主机的`hostname` -**1. 规则名称:**定义告警项的名称 +**2. IP地址:**主机IP地址 -**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 +**3. 状态:**当前主机的健康情况 -**3. 告警对象:**触发告警的真正实例 +?> **正常:**主机正确接入集群,且系统组件运行良好
+ **异常:**主机异常接入集群,或者系统组件不能够正常工作 -?> **全部实例:**选择「告警产品」下全部实例为告警监测对象,且后面新增的实例也会被自动添加进该条告警规则 - **选择实例:**勾选「告警产品」下部分实例为告警监测对象 +**4. 角色:**当前节点在集群中担任的节点角色 -**4. 条件:**结构为<告警指标><统计时间><统计方法><比较方法><阈值> +?> **控制节点:**集群的master节点
+ **容器节点:**集群的worker节点,所有的业务容器都是运行在这上面 -?>**告警指标:**「告警产品」运行时的监控指标,用于反馈运行负荷或健康状态
- **统计时间:**统计某个时间周期内的指标数据集合,当前支持1分钟、5分钟、10分钟
- **统计方法:**对统计的指标数据集合做数据处理,当前支持计算集合的平均值、集合中最大值,集合中最小值
- **比较方法:**集合做数据处理后的结果与设定的阈值做数据比较,当前支持大于、大于等于、小于、小于等于、等于、不等于
- **阈值:**用户期望的统计结果临界值 +**5. 容器数:**当前主机上的容器数量 -**5. 触发几次就告警:**当「告警条件」连续满足多少次,就触发一次告警 +**6. CPU:**当前主机上的虚拟核数 -**6. 告警对象:**选择该告警项触发时需要通知的「告警组」 +**7. 内存:**当前主机上的内存大小 -**7. 通知方式:**选择该告警项触发时需要的通知方式,当前支持Slack +**8. 调度状态:**分为调度开启和调度关闭 -### 2.10.1.2 告警人 -用于管理所有可能接收告警通知的人员通讯录。 - -![](_figures/user-guide/warning-person-create.png) - -**1. 姓名:**定义告警通知人的姓名 - -**2. 手机:**接收告警通知的手机号 - -**3. 邮箱:**接收告警通知的邮箱 - -### 2.10.1.3 告警组 -用于管理一组「高警人」。在「告警规则」中,会以「高警组」作为一个告警项触发后的通知接收单元。一个「告警组」可能是一个项目组。 - -![](_figures/user-guide/warning-team-create-1.png) - -**1. 组名称:**定义告警通知组的名称 - -**2. 选择告警人:**从「告警人」的列表中选择一个或几个组成一个「告警组」 - -**3. 添加告警人:**用于临时添加新的「高警人」 - -**4. Channel:**Slack Channel - -**5. API URL:**到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL -*** - -## 2.10.2 如何添加告警规则 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警规则」,切换至告警规则列表Tab** - -**3)点击「新建」,开始创建一条新的告警规则。** - -!> 添加告警项前要保证已经存在「告警组」。
- 如需通知对象接收slack,请确保「告警组」配置了slack。 -*** - -## 2.10.3 如何修改告警规则 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警规则」,切换至告警规则列表Tab** - -**3)点击目标告警规则最右侧的「编辑」** -*** - -## 2.10.4 如何删除告警规则 -删除告警规则支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 2.10.4.1 批量删除 -操作如下: - -**1)点击目标告警规则最左侧的「选中」icon** - -**2)点击「删除」** - -![](_figures/user-guide/warning_rule_delete1.jpg) - -### 2.10.4.2 单条删除 -操作如下: - -**1)点击目标告警规则最右侧的「删除」** -*** - -## 2.10.5 如何添加告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警人」,切换至告警人列表Tab** - -**3)点击「新建」,开始添加一个新的告警人。** -*** - -## 2.10.6 如何修改告警人 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警人」,切换至告警人列表Tab** - -**3)点击目标告警人最右侧的「编辑」** +?> **调度开启:**当前主机允许容器调度
+ **调度关闭:**当前主机不允许容器调度 + +**9. 启动时间:**主机加入集群的时间 *** -## 2.10.7 如何删除告警人 -删除告警人支持两种方式:
-第一种是批量删除
-第二种是单条删除
- -### 2.10.7.1 批量删除 -操作如下: - -**1)点击目标告警人最左侧的「选中」icon** - -**2)点击「删除」** +## 2.12.2 如何删除主机节点 +删除主机节点,将导致节点退出集群,上面的容器会被调度到其他的节点上。 +操作如下:
-![](_figures/user-guide/warning_member_delete.jpg) +**1)点击控制台左边栏的「主机管理」,切换至主机列表页面** -### 2.10.7.2 单条删除 -操作如下: - -**1)点击目标告警人最右侧的「删除」** +**2)点击节点的「删除节点」icon** *** -## 2.10.8 如何添加高警组 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警组」,切换至告警组列表Tab** +## 2.12.3 如何设置节点进入/退出维护模式 +当需要对某节点的配置或者软件包进行更新的时候,可以将节点设置为维护模式,防止在更新过程中,新的容器被调度上来导致服务启动失败。另一方面,如果更新会影响到现有的容器实例正常运行,可以选择提前排空这些容器到其他节点。 -**3)点击「新建」,开始添加一个新的告警组。** -*** - -## 2.10.9 如何修改高警组 -操作如下: - -**1)点击控制台左边栏的「告警中心」,切换至告警中心界面** - -**2)点击「告警组」,切换至告警组列表Tab** - -**3)点击目标告警组最右侧的「编辑」** -*** +操作如下:
-## 2.10.10 如何删除告警组 -删除告警组支持两种方式:
-第一种是批量删除
-第二种是单条删除
+**1)点击控制台左边栏的「主机管理」,切换至主机列表页面** -### 批量删除 +**2)点击节点的「进入维护模式」icon** -**1)点击目标告警组最左侧的「选中」icon** +**3)如果需要排空当前主机上的容器,可以勾选「排空主机上的应用」,否则直接点「进入维护模式」** -**2)点击「删除」** +![](_figures/user-guide/nodes_ops_in.jpg) -![](_figures/user-guide/warning_team_delete.jpg) +**4)进入维护模式后,主机列表页的调度状态将变为`调度关闭`** -### 单条删除 +**5)节点更新完毕后,可以通过点击「退出维护模式」icon,使节点恢复正常工作,此时主机列表页的调度状态将变为`调度开启`** -**1)点击目标告警组最右侧的「删除」** +![](_figures/user-guide/nodes_ops_out.png) *** -## 2.10.11 如何设置告警通知 -### 3.10.11.1 设置slack -slack的告警设置是在「告警组」中完成,填写 Slack Channel 和 Slack API URL 信息。 +## 2.12.4 主机监控 +主机监控支持三类资源的监控看板:CPU、内存、网络。
-**如何配置Slack API URL:**
-需要到slack官网设置[imcoming webhooks](https://qiniu.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),完成后,会有一个Webhook URL + **CPU:**节点CPU使用率
+ **内存:**节点内存总量、使用量、空闲量
+ **网络:**节点网卡入带宽和出带宽 \ No newline at end of file diff --git a/user-guide/service.md b/user-guide/service.md index dbe963e..a3fd817 100644 --- a/user-guide/service.md +++ b/user-guide/service.md @@ -1,5 +1,5 @@ # 2.2 服务 -服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<服务名:服务端口>** 实现同一个区域同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 +服务是kubernetes的service概念,真正管理了容器实例。通过对服务进行操作可以实现容器规格的升级和降级,容器数量的扩容和缩容。用户也可以通过 **<应用名>-<服务名>:<端口号>** 实现同一个区域同一个空间下服务的互相访问。服务类型分为「有状态服务」和「无状态服务」两种类型。 ?> **有状态服务:**用于持久化存储数据,需要挂「存储卷」。只能单容器实例 **无状态服务:**不能持久化存储数据。支持多容器实例,允许做「服务伸缩」 @@ -9,8 +9,7 @@ ![](_figures/quick-start/create-app-5.png) ### 2.2.1.1 基本配置 - -**1. 服务名:**服务一旦创建完成,「服务名」就不能被修改。会在服务配置内网访问时用到 **<服务名>:<端口号>** +**1. 服务名:**服务一旦创建完成,「服务名」就不能被修改。会在服务配置内网访问时用到 **<应用名>-<服务名>:<端口号>** !> **命名规则:**2-30位的小写字母、数字,开头为字母 @@ -42,7 +41,7 @@ **协议类型:**服务在内网的访问协议 **如何配置内网服务之间的互相访问?** -内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<服务名>:<服务端口>**。 +内网通过dns实现服务的注册发现。服务的端口暴露方式是 **<应用名>-<服务名>:<端口号>**。 **如何配置服务的外网暴露:** 服务的外网暴露需要添加「负载均衡」到服务。外网暴露适用于跨空间、跨区域的服务互访,以及用户的服务访问。 @@ -65,47 +64,72 @@ **11. 执行命令**:容器启动后的执行命令。如果填写了「执行命令」,dockerfile文件中定义的执行命令会被覆盖 *** -## 3.2.2 如何删除服务 +## 2.2.2 如何删除服务 +服务一旦被删除,将无法恢复,操作如下: -服务一旦被删除,将无法恢复。操作如下: +**1)点击控制台左边栏的「应用」,切换至应用页面** -**1)选中待删除服务** +**2)点击目标应用的应用名,进入应用详情** -**2)点击删除服务** +**3)选中服务,点击「删除服务」** *** -## 3.2.3 如何启动/停止服务 +## 2.2.3 如何启动/停止服务 +停止服务将导致服务下容器退出,操作如下: -![](_figures/user-guide/service-start-stop.gif) -*** +**1)点击控制台左边栏的「应用」,切换至应用页面** -## 3.2.4 如何做服务伸缩 +**2)点击应用的应用名,进入应用详情** -「服务伸缩」是「无状态服务」对容器实例数量做扩容和缩容操作。 +**3)点击服务最右侧的「停止」icon,服务会被停止,服务的状态会从`运行中`变成`已停止`** -![](_figures/user-guide/service-scale.gif) +**4)点击服务最右侧的「启动」icon,服务会被重新启动,服务的状态会从`已停止`变成`运行中`** *** -## 3.2.5 如何做服务升级 +## 2.2.4 如何做服务伸缩 +「服务伸缩」是「无状态服务」对容器实例数量做扩容和缩容操作。操作如下: + +**1)点击控制台左边栏的「应用」,切换至应用页面** + +**2)点击应用的应用名,进入应用详情** + +**3)点击服务最右侧的「服务伸缩」icon,出现服务伸缩弹窗** + +**4)在服务伸缩弹窗中,可以调整容器的数量,实现服务的伸缩** +*** +## 2.2.5 如何做服务升级 「服务升级」是对服务的「基本配置」和「高级配置」做修改,包括镜像版本、容器规格、存储卷配置、配置文件、环境变量、运行目录、执行命令。多容器实例时,「服务升级」是是在多个实例间做滚动升级(如果有n个实例,升级过程中保证有n-1个实例仍然提供服务),因此升级过程中服务不会中断。 !> **注意:**服务升级会导致该服务下的容器日志和容器监控重置 -![](_figures/user-guide/service-upgrade.gif) +操作如下: +**1)点击控制台左边栏的「应用」,切换至应用页面** + +**2)点击应用的应用名,进入应用详情** + +**3)点击服务最右侧的「服务升级」icon,出现服务升级弹窗** *** -## 3.2.6 如何做服务回滚 -每次「服务升级」都会生成一个新的回滚版本,服务可以随时回滚到任意某个版本。 +## 2.2.6 如何做服务回滚 +每次「服务升级」都会生成一个新的回滚版本,服务可以随时回滚到任意某个时刻的版本。 !> **注意:**服务回滚会导致该服务下的容器日志和容器监控重置 -![](_figures/user-guide/service-rollback.gif) +操作如下: + +**1)点击控制台左边栏的「应用」,切换至应用页面** +**2)点击应用的应用名,进入应用详情** + +**3)点击服务最右侧的「服务回滚」icon,出现回滚版本列表** + +**4)选择想要回滚到的历史版本** *** -## 3.2.7 服务下的日志和监控 -平台提供了对一个服务下所有容器日志和容器监控的服务级聚类。在服务页面能够轻松筛选出该服务下的任何容器日志和监控。[详见3.11](user-guide/log-and-monitor.md) + +## 2.2.7 服务下的日志和监控 +平台提供了对一个服务下所有容器日志和容器监控的服务级聚类。在服务页面能够轻松筛选出该服务下的任何容器日志和监控。 diff --git a/user-guide/storage.md b/user-guide/storage.md index d517577..32357a9 100644 --- a/user-guide/storage.md +++ b/user-guide/storage.md @@ -11,7 +11,7 @@ !> **命名规则:**2-64位的小写字母、数字或"-",不能以"-"开头或结尾 -**2. 大小:**最小为1G,最大为1024G,调整的最小粒度为1G。 +**2. 大小:**最小为1G,最大为1024G,调整的最小粒度为1G ### 2.4.1.2 挂载到服务 ![](_figures/user-guide/storage-create.png) @@ -23,7 +23,7 @@ **3. 挂载路径:**存储卷挂载到容器内的文件路径,对存储卷的读写需要在该路径下操作 *** -!>**注意**:如果挂载到的目录内原原先已有文件,挂载存储卷后,整个目录将会被覆盖 +!>**注意**:如果挂载到的目录内原先已有文件,挂载存储卷后,整个目录将会被覆盖 ## 2.4.2 如何创建存储卷,并挂载到服务 @@ -73,4 +73,8 @@ !>**注意:**删除存储卷,会导致数据不可恢复 -![](_figures/user-guide/storage-delete.gif) +**1)点击控制台左边栏的「存储」,切换至存储页面** + +**2)查找需要删除的存储卷,点击「删除」icon** +*** + diff --git a/user-guide/warning.md b/user-guide/warning.md index 9215c87..87a2412 100644 --- a/user-guide/warning.md +++ b/user-guide/warning.md @@ -3,12 +3,12 @@ *** ## 2.10.1 属性说明 -### 3.10.1.1 告警规则 +### 2.10.1.1 告警规则 用于定义告警项,包含触发告警的监控指标、告警通知对象、告警通知方式等。 **1. 规则名称:**定义告警项的名称 -**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP/HTTPS七层负载均衡」 +**2. 告警产品:**告警对象的大类,当前支持「服务」、「存储」、「HTTP七层负载均衡」 **3. 告警对象:**触发告警的真正实例 From 6f57ec60f5e6cc3a98bb35823078b707c1534334 Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Sun, 2 Dec 2018 14:59:20 +0800 Subject: [PATCH 6/7] =?UTF-8?q?wordpress=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- best-practise/create-wordpress-app.md | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/best-practise/create-wordpress-app.md b/best-practise/create-wordpress-app.md index c46ada4..a285cdb 100644 --- a/best-practise/create-wordpress-app.md +++ b/best-practise/create-wordpress-app.md @@ -1,16 +1,7 @@ # 开始一个Wordpress应用 Wordpress应用包含两类服务,即MySQL数据库服务和Wordpress web服务。 -[1. 选择空间](#jump1) -[2. 创建服务](#jump2) - -- [2.1 创建MySQL服务](#jump21) -- [2.2 创建Wordpress web服务](#jump22) - -[3. 完成创建和访问应用](#jump3) - -## 1. 选择空间 - +## 1. 选择空间 选择当前服务需要被创建在哪个空间下。空间彼此之间资源隔离,如果服务有内网互访的需求,需要创建在一个空间下。操作如下: **下拉控制台顶部的「空间」进行空间切换** @@ -18,16 +9,25 @@ Wordpress应用包含两类服务,即MySQL数据库服务和Wordpress web服 ![下拉选择空间](_figures/quick-start/create-app-namespace.png) *** -## 2. 创建服务 +## 2. 添加应用 +**操作如下:** + +1)点击控制台左边栏的「应用」,切换至应用页面 -**1)点击控制台左边栏的「服务」,切换至服务页面** +2)点击「添加应用」 -**2)点击「创建服务」** +3)选择应用的创建方式,选择「基于镜像创建」 -![](_figures/quick-start/create-app-5.png) +4)填写「应用名」为`wordpress` -### 2.1 创建MySQL服务 +!> **命名规范:**2-30位的小写字母、数字,开头为字母 +5)点击「添加服务」 +*** + +## 3. 添加服务 + +### 3.1 创建MySQL服务 **操作如下:** 1)填写「服务名」为 **"db"** @@ -55,8 +55,7 @@ Wordpress应用包含两类服务,即MySQL数据库服务和Wordpress web服 9)点击「确认」,完成mysql服务创建 -### 2.2 创建Wordpress web服务 - +### 3.2 创建Wordpress web服务 再次点击「创建服务」,添加第二个服务 Wordpress web服务。 **操作如下:** @@ -87,5 +86,5 @@ Wordpress应用包含两类服务,即MySQL数据库服务和Wordpress web服 9)点击「确认」,完成wordpress web服务创建 *** -## 3. 完成创建和访问应用 +## 4. 完成创建和访问应用 至此,一个wordpress应用就创建好了,可以通过wordpress web服务对外暴露的访问地址访问wordpress应用。 From bce3036b678884da1c1812de18def1d62bc99569 Mon Sep 17 00:00:00 2001 From: fengyiyong Date: Wed, 26 Dec 2018 14:15:10 +0800 Subject: [PATCH 7/7] wordpress --- best-practise/create-wordpress-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/best-practise/create-wordpress-app.md b/best-practise/create-wordpress-app.md index a285cdb..fad2f28 100644 --- a/best-practise/create-wordpress-app.md +++ b/best-practise/create-wordpress-app.md @@ -78,7 +78,7 @@ Wordpress应用包含两类服务,即MySQL数据库服务和Wordpress web服 3.点击 「创建」
7)点击「添加环境变量」。 -填写「变量名」为 **"WORDPRESS_DB_HOST"**,选择「加载方式」为 **"手动填写"**,填写「变量值」为 **"db:3306"**; +填写「变量名」为 **"WORDPRESS_DB_HOST"**,选择「加载方式」为 **"手动填写"**,填写「变量值」为 **"wordpress-db:3306"**; 填写「变量名」为 **"WORDPRESS_DB_PASSWORD"**,选择「加载方式」为 **"手动填写"**,填写「变量值」为 **"root123"**; 8)填写「运行目录」为 **"/var/www/html"**