容器云服务架构与运维 课件 第8、9章 Kubernetes 集群服务、基于K8S 的CICD 服务_第1页
容器云服务架构与运维 课件 第8、9章 Kubernetes 集群服务、基于K8S 的CICD 服务_第2页
容器云服务架构与运维 课件 第8、9章 Kubernetes 集群服务、基于K8S 的CICD 服务_第3页
容器云服务架构与运维 课件 第8、9章 Kubernetes 集群服务、基于K8S 的CICD 服务_第4页
容器云服务架构与运维 课件 第8、9章 Kubernetes 集群服务、基于K8S 的CICD 服务_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

容器云服务架构与运维单元8Kubernetes集群服务学习目标了解Kubernetes的概念、特性;理解Kubernetes集群架构和核心概念;掌握Kubernetes集群的安装部署和应用体验;掌握Kubernetes服务运维与实战等技能。8.1认识Kubernetes集群服务8.2

使用Kubernetes集群服务8.1认识Kubernetes集群服务8.1.1Kubernetes介绍

Kubernetes简介Kubernetes是一个全新的基于容器技术的分布式架构解决方案,是Google开源的一个容器集群管理系统。Kubernetes这个名字源于希腊语,意为“舵手”或“飞行员”。K8S这个缩写是因为K和S之间有8个字符的关系,所以Kubernetes简称K8S。Kubernetes是一个一站式的完备的分布式系统开发和支撑平台,更是一个开放平台,对现有的编程语言、编程框架、中间件没有任何侵入性。Kubernetes提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。8.1.1Kubernetes介绍

Kubernetes的特性(1)自我修复在节点出现故障时,重新启动运行失败的容器,替换和重新部署,保证预期的副本数量;删除健康检查未通过的容器,并且在未准备好之前不会处理用户的请求,确保线上服务不中断。(2)弹性伸缩使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。(3)自动部署和回滚K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。8.1.1Kubernetes介绍

Kubernetes的特性(4)服务发现和负载均衡K8S为多个容器提供一个统一的访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无须考虑容器IP问题。(5)机密和配置管理管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据的安全性,并可以将一些常用的配置存储在K8S中,方便应用程序的使用。(6)存储编排挂载外部存储系统,无论是来自本地存储、公有云,还是网络存储,都作为集群资源的一部分使用,极大地提高存储使用的灵活性。(7)批处理提供一次性任务、定时任务服务,满足批量数据处理和分析的场景。8.1.1Kubernetes介绍

Kubernetes集群架构Kubernetes集群架构以及相关的核心组件如图所示:8.1.1Kubernetes介绍

Kubernetes集群架构一个Kubernetes集群一般包含一个Master节点和多个Node节点,一个节点可以看成是一台物理机或虚拟机。Master是K8S的集群控制节点,每个K8S集群里都需要有一个Master节点来负责整个集群的管理和控制,基本上K8S所有的控制命令都是发给它的,由它来负责具体的执行过程。Master节点通常会占据一个独立的服务器,它太重要了,如果它不可用,那么所有的控制命令都将失效。Master节点上运行着以下关键组件。(1)Kube-APIServerKube-APIServer是集群的统一入口、各组件协调者,以HTTPRest提供接口服务,所有对象资源的增、删、改、查和监听操作都交给APIServer处理后再提交给Etcd存储。8.1.1Kubernetes介绍

Kubernetes集群架构(2)Kube-Controller-ManagerKube-Controller-Manager是K8S里所有资源对象的自动化控制中心,处理集群中的常规后台任务,一个资源对应一个控制器,而Controller-Manager就是负责管理这些控制器的。(3)Kube-Scheduler根据调度算法为新创建的Pod选择一个Node节点,可以部署在同一个节点上,也可以部署在不同的节点上。(4)EtcdEtcd是一个分布式的、一致的Key-Value存储,主要用途是共享配置和服务发现、保存集群状态数据,比如Pod、Service等对象信息。8.1.1Kubernetes介绍

Kubernetes集群架构Node节点上运行着以下关键组件:①Kubelet。Kubelet是Master在Node节点上的Agent(代理),与Master密切协作,管理本机运行容器的生命周期,负责Pod对应的容器的创建、启停等任务,实现集群管理的基本功能。②Kube-Proxy。在Node节点上实现Pod网络代理,实现KubernetesService的通信,维护网络规则和四层负载均衡工作。③DockerEngine。Docker引擎,负责本机的容器创建和管理工作。Node节点可以在运行期间动态增加到K8S集群中,前提是这个节点上已经正确安装、配置和启动了上述关键组件。8.1.1Kubernetes介绍

Kubernetes的核心概念(1)PodPod是K8S中最重要也是最基本的概念,Pod是最小的部署单元,是一组容器的集合。每个Pod都由一个特殊的根容器(Pause容器),以及一个或多个紧密相关的用户业务容器组成。在K8S中,不会直接对容器进行操作,而是把容器包装成Pod再进行管理,Pod在英文中的意思是豌豆荚,可以把容器想像成豌豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豌豆荚(一个Pod)。Pod是运行服务的基础。Pause容器是Pod的根容器,以它的状态代表整个容器组的状态。K8S为每个Pod都分配了唯一的IP地址,称为PodIP。Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂载的Volume。8.1.1Kubernetes介绍

Kubernetes的核心概念(2)Label标签,附加到某个资源上,用于关联、查询和筛选对象。一个Label是一个Key=Value的键值对,Key与Value由用户自己指定。Label可以附加到各种资源上,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源上。用户可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等工作。K8S通过LabelSelector(标签选择器)来查询和筛选拥有某些Label的资源对象。LabelSelector有基于等式(name=label1)和基于集合[namein(label1,label2)]两种方式。8.1.1Kubernetes介绍

Kubernetes的核心概念(3)ReplicaSet(RC)ReplicaSet用来确保预期的Pod副本数量,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统就会再自动创建一些Pod。实际工作过程中很少单独使用ReplicaSet,它主要被Deployment这个更高层的资源对象使用,从而形成一整套Pod创建、删除、更新的编排机制。(4)DeploymentDeployment用于部署无状态应用,Deployment为Pod和ReplicaSet提供声明式更新,只需要在Deployment中描述想要的目标状态,Deployment就会将Pod和ReplicaSet的实际状态改变到目标状态。8.1.1Kubernetes介绍

Kubernetes的核心概念(5)HorizontalPodAutoscaler(HPA)HPA为Pod横向自动扩容,也是K8S的一种资源对象。HPA通过追踪分析RC的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数量。(6)ServiceService定义了一个服务的访问入口,通过LabelSelector与Pod副本集群之间“无缝对接”,定义了一组Pod的访问策略,防止Pod失联。创建Service时,K8S会自动为它分配一个全局唯一的虚拟IP地址,即ClusterIP。服务发现就是通过Service的Name和Service的ClusterIP地址做一个DNS域名映射来解决的。8.1.1Kubernetes介绍

Kubernetes的核心概念(7)NamespaceNamespace即命名空间,Namespace多用于实现多用户的资源隔离。Namespace通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组。K8S集群在启动后,会创建一个名为default的Namespace,如果不特别指明Namespace,则创建的Pod、RC、Service都将被创建到default下。当给每个用户创建一个Namespace来实现多用户的资源隔离时,还可以结合K8S的资源配额管理,限定不同用户能占用的资源,例如CPU使用量、内存使用量等。8.1.2

Kubernetes发展部署方式的发展Kubernetes的发展就是部署方式的发展,回顾这些年来的部署方式,从传统的硬件服务部署(传统部署时代)到虚拟机部署(虚拟化部署时代)再到容器化部署(容器部署时代),发展历程如图所示。8.1.2

Kubernetes发展Kubernetes的发展(1)2013年——Docker容器诞生(2)2014年——Docker发布编排工具(3)Docker和Mesosphere公司的竞争(4)Docker和CoreOS结束合作(5)OCI标准的制定(6)2014年——Kubernetes诞生(7)2015年——CNCF基金会成立(8)2016年——Docker放弃Swarm(9)2017年——Docker将Containerd捐献给CNCF社区8.2

使用Kubernetes集群服务(1)规划节点Kubernetes实验节点规划如下表所示。8.2.1

Kubernetes集群服务案例部署环境准备(2)基础准备准备好VMwareWorkstation工具和CentOS7.5版本虚拟机,使用CentOS7.5虚拟机快照,克隆一台虚拟机,云主机配置自定义,推荐配置4vCPU、12GB内存、100GB硬盘,网络使用NAT模式,master节点IP设置为9,推荐设置主机密码为000000。自行将虚拟机配置好IP、安装Docker服务,关闭SELinux和防火墙服务。环境准备8.2.1

Kubernetes集群服务案例部署Kubernetes部署(1)部署架构K8S集群中有管理节点与工作节点两种类型,部署架构如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(2)环境准备使用VMwareWorkstation进行实验,考虑到PC的配置,使用单节点安装Kubernetes服务,将Master节点和Node节点安装在一个节点上,配置如下表所示。8.2.1

Kubernetes集群服务案例部署此次安装Kubernetes服务的系统为CentOS7.5-1804;Docker版本为docker-ce-19.03.13;Kubernetes版本为1.18.1。Kubernetes部署(3)安装Docker并部署Harbor①基础设置。使用远程连接工具SSH到9节点,修改主机名为master,并关闭该节点的SELinux和防火墙服务,关于如何修改主机名和关闭SELinux及防火墙服务,此处不再赘述,修改完之后,如下所示:[root@master~]#hostnamectlStatichostname:master......[root@master~]#getenforceDisabled[root@master~]#systemctlstatusfirewalld●firewalld.service-firewalld-dynamicfirewalldaemonLoaded:loaded(/usr/lib/systemd/system/firewalld.service;disabled;vendorpreset:enabled)Active:inactive(dead)Docs:man:firewalld(1)8.2.1

Kubernetes集群服务案例部署Kubernetes部署(3)安装Docker并部署Harbor②删除防火墙规则。将master节点的iptables规则清除,命令如下:[root@master~]#iptables–F[root@master~]#iptables–X[root@master~]#iptables–Z[root@master~]#/usr/sbin/iptables-save③配置YUM源。将提供的CentOS-7-x86_64-DVD-1804.iso和chinaskills_cloud_paas.iso镜像文件上传至master节点的/root目录下,把CentOS-7-x86_64-DVD-1804.iso挂载到/opt/centos目录下(/opt/centos目录需自行创建),然后将chinaskills_cloud_paas.iso挂载到/mnt下,并将/mnt目录下的所有文件及软件包复制至/opt目录下。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(3)安装Docker并部署Harbor做完上述操作后,创建本地YUM源文件local.repo,文件内容如下:[root@master~]#cat/etc/yum.repos.d/local.repo[k8s]name=k8sbaseurl=file:///opt/kubernetes-repogpgcheck=0enabled=1[centos]name=centosbaseurl=file:///opt/centosgpgcheck=0enabled=18.2.1

Kubernetes集群服务案例部署Kubernetes部署(3)安装Docker并部署Harbor④安装Docker及Harbor。进入/opt目录,安装Docker服务和Harbor镜像仓库的操作均已整理成脚本k8s_harbor_install.sh,在master节点执行脚本k8s_harbor_install.sh即可完成Docker与Harbor仓库的搭建,命令如下:[root@masteropt]#./k8s_harbor_install.sh等待一段时间后,Docker服务与Harbor仓库安装完毕,登录9访问Harbor仓库界面(登录用户为admin;密码为Harbor12345)。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(3)安装Docker并部署HarborHarbor仓库界面如图所示:8.2.1

Kubernetes集群服务案例部署Kubernetes部署(4)上传镜像上传镜像的操作前先生成脚本k8s_image_push.sh,执行该脚本,再上传镜像,命令如下:[root@masteropt]#./k8s_image_push.sh输入镜像仓库地址(不加http/https):9输入镜像仓库用户名:admin输入镜像仓库用户密码:Harbor12345您设置的仓库地址为:9,用户名:admin,密码:xxx是否确认(Y/N):Y8.2.1

Kubernetes集群服务案例部署Kubernetes部署(4)上传镜像进入Harbor仓库library项目查看镜像列表,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(5)部署Kubernetes部署Kubernetes服务的操作步骤也已经生成了脚本,分别为k8s_master_install.sh和k8s_node_install.sh。因为此处将Master节点和Node节点合并了,只需要执行k8s_master_install.sh一个脚本,命令如下:[root@masteropt]#./k8s_master_install.sh在master节点执行删除污点操作,命令如下:#kubectltaintnodemasternode-role.kubernetes.io/master-在Master节点查看节点的状态,命令如下:[root@masteropt]#kubectlgetnodesNAMESTATUSROLESAGEVERSIONmasterReadymaster98dv1.18.18.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍①kubectl命令语法如下:#kubectl[command][TYPE][NAME][flags]命令语法解析:●command:子命令。●TYPE:资源类型。●NAME:资源名称。●flags:命令参数。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍②kubectl命令选项如下:●--alsologtostderr[=false]:同时输出日志到标准错误控制台和文件。●--api-version="":和服务端交互使用的API版本。●--certificate-authority="":用以进行认证授权的.cert文件路径。●--client-certificate="":TLS使用的客户端证书路径。●--client-key="":TLS使用的客户端密钥路径。●--cluster="":指定使用的kubeconfig配置文件中的集群名。●--context="":指定使用的kubeconfig配置文件中的环境名。●--insecure-skip-tls-verify[=false]:如果为true,将不会检查服务器凭证的有效性,这会导致HTTPS链接变得不安全。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍②kubectl命令选项如下:●--kubeconfig="":命令行请求使用的配置文件路径。●--log-backtrace-at=:0:当日志长度超过定义的行数时,忽略堆栈信息。●--log-dir="":如果不为空,将日志文件写入此目录。●--log-flush-frequency=5s:刷新日志的最大时间间隔。●--logtostderr[=true]:输出日志到标准错误控制台,不输出到文件。●--match-server-version[=false]:要求服务端和客户端版本匹配。●--namespace="":如果不为空,命令将使用此Namespace。●--password="":APIServer进行简单认证使用的密码。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍②kubectl命令选项如下:●-s,--server="":KubernetesAPIServer的地址和端口号。●--stderrthreshold=2:高于此级别的日志将被输出到错误控制台。●--token="":认证到APIServer使用的令牌。●--user="":指定使用的kubeconfig配置文件中的用户名。●--username="":APIServer进行简单认证使用的用户名。●--v=0:指定输出日志的级别。●--vmodule=:指定输出日志的模块。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍③常用命令如下:●kubectlannotate:更新资源的注解。●kubectlapi-versions:以“组/版本”的格式输出服务端支持的API版本。●kubectlapply:通过文件名或控制台输入,对资源进行配置。●kubectlattach:连接到一个正在运行的容器。●kubectlautoscale:对ReplicationController进行自动伸缩。●kubectlcluster-info:输出集群信息。●kubectlconfig:修改kubeconfig配置文件。●kubectlcreate:通过文件名或控制台输入创建资源。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍③常用命令如下:●kubectldelete:通过文件名、控制台输入、资源名或者LabelSelector删除资源。●kubectldescribe:输出指定的一个或多个资源的详细信息。●kubectledit:编辑服务端的资源。●kubectlexec:在容器内部执行命令。●kubectlexpose:输入rc、svc或Pod,并将其暴露为新的KubernetesService。●kubectlget:输出一个或多个资源。●kubectllabel:更新资源的Label。●kubectllogs:输出Pod中一个容器的日志。●kubectlnamespace:(已停用)设置或查看当前使用的Namespace。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍③常用命令如下:●kubectlpatch:通过控制台输入更新资源中的字段。●kubectlport-forward:将本地端口转发到Pod。●kubectlproxy:为KubernetesAPIServer启动代理服务器。●kubectlreplace:通过文件名或控制台输入替换资源。●kubectlrolling-update:对指定的ReplicationController执行滚动升级。●kubectlrun:在集群中使用指定的镜像启动容器。●kubectlscale:为ReplicationController设置新的副本数。●kubectlversion:输出服务端和客户端的版本信息。8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍④常用命令体验。获取Kubernetes集群下Namespace的信息,命令如下:[root@master~]#kubectlgetnamespaceNAMESTATUSAGEdefaultActive102dkube-node-leaseActive102dkube-publicActive102dkube-systemActive102d查看命名空间下的所有信息,命令如下:[root@master~]#kubectlgetallNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEservice/kubernetesClusterIP<none>443/TCP102d8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍④常用命令体验。kubectlgetall这条命令等同于“kubectlgetpod,svc,deployment,rs”。all包括所有pod、svc、deployment和rs。因为在默认的Namespace下没有其他的pod、deployment和rs,所以就只显示了Service。可以查看某个Namespace中的所有信息,比如查看kube-system下所有的信息,命令如下:[root@master~]#kubectlgetall-nkube-system也可以查看某项资源,比如查看Pod,命令如下:[root@master~]#kubectlgetpods8.2.1

Kubernetes集群服务案例部署Kubernetes部署(6)Kubernetes命令介绍④常用命令体验。可以发现当前的default这个Namespace下没有Pod,可以指定其他的Namespace来查看该命名空间下的Pod,命令如下:[root@master~]#kubectlgetpods-nkube-system还可以在命令后面加上-owide来查看更多的信息,读者可以自行输入命令尝试。关于创建资源的命令如下:#通过文件创建一个Deployment#kubectlcreate-f/path/to/deployment.yaml#不过现在一般常用下面的命令来创建资源#kubectlapply-f/path/to/deployment.yaml#通过kubectl命令直接创建#kubectlrunnginx_app--image=nginx:1.9.1--replicas=38.2.1

Kubernetes集群服务案例部署Kubernetes体验在Kubernetes上部署第一个应用前,还需要掌握几个概念。在Kubernetes中不会直接对容器进行操作,在Kubernetes中,Pod是最小的可部署单元。除了要了解Pod外,还需要掌握ReplicaSet、Deployment、Service的概念。K8S常用概念关系如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes体验(1)Kubernetes部署应用初体验使用K8S命令部署一个Nginx应用,命令如下:[root@master~]#kubectlrunnginx--image=9/library/nginx:latestpod/nginxcreated在之前的版本中,使用kubectlrun命令时,系统会先创建一个Deployment,然后再由控制器去创建Nginx的Pod,但是在新版本中,使用kubectlrun命令只会单独创建一个Pod,并不会创建Deployment。可以使用命令查看Nginx的Pod和Deployment,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx1/1Running014s[root@master~]#kubectlgetdeploymentNoresourcesfoundindefaultnamespace.8.2.1

Kubernetes集群服务案例部署Kubernetes体验(1)Kubernetes部署应用初体验查看Pod的IP地址,命令如下:[root@master~]#kubectlgetpods-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnginx1/1Running012m4master<none><none>通过kubectlgetpods-owide命令获取的Pod的IP地址是一个虚拟的IP地址,外部是访问不到的。在Master节点使用curl命令查看Pod地址,命令如下:[root@master~]#curl48.2.1

Kubernetes集群服务案例部署Kubernetes体验(2)使用Deployment部署应用使用Deployment的方式部署Nginx应用,可以使用如下命令:[root@master~]#kubectlcreatedeploymentnginx--image=9/library/nginx:latestdeployment.apps/nginxcreated可以看到一个名叫nginx的Deployment被创建,查看Deployment列表,命令如下:[root@master~]#kubectlgetdeploymentNAMEREADYUP-TO-DATEAVAILABLEAGEnginx1/11135s8.2.1

Kubernetes集群服务案例部署Kubernetes体验(2)使用Deployment部署应用继续查看Pod,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx1/1Running042mnginx-86d8d488f6-pkmcb1/1Running081s可以看到创建Deployment时会自动创建一个Pod,这个时候,Nginx应用也只能内部访问,不能通过外部访问,还需要进行Service服务发现或者叫端口开放,才能进行外部访问,Service服务发现的命令如下:[root@master~]#kubectlexposedeploymentnginx--port=80--type=NodePortservice/nginxexposed8.2.1

Kubernetes集群服务案例部署Kubernetes体验(2)使用Deployment部署应用做完该操作后,查看Service,命令如下:[root@master~]#kubectlgetsvcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP<none>443/TCP99dnginxNodePort4<none>80:30209/TCP3s可以看到Nginx的80端口被映射到30209端口,这时就可以从外部访问Nginx应用了。使用PC的浏览器访问9:30209,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用使用Yaml文件来部署Nginx服务,要求使用Deployment管理Pod,使用ReplicaSet控制器定义副本的数量为2。首先创建Yaml文件,命令如下:[root@master~]#vinginx-deployment.yamlnginx-deployment.yaml文件的内容详见教材。编辑好Yaml文件后,运行该文件,命令如下:[root@master~]#kubectlapply-fnginx-deployment.yamldeployment.apps/nginx-appcreated8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用查看运行的Pod,命令如下(此处已将上面案例中创建的Pod和Deployment删除):[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-app-7bd9c4cb95-dkw8r1/1Running048snginx-app-7bd9c4cb95-dl5b71/1Running048s查看运行的Deployment,命令如下:[root@master~]#kubectlgetdeploymentNAMEREADYUP-TO-DATEAVAILABLEAGEnginx-app2/2222m25s8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用可以看到当前Pod中显示2个正在运行的Pod,Deployment中的Nginx数量也是2/2。但是此时只使用了Deployment管理Pod,然后使用ReplicaSet控制器设置副本的数量为2,此时还不能通过外部网络访问Nginx应用,还需要做Service发现,创建Service的Yaml文件,命令如下:[root@master~]#vinginx-service.yamlnginx-service.yaml文件的内容详见教材。8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用执行nginx-service.yaml文件,命令如下:[root@master~]#kubectlapply-fnginx-service.yamlservice/nginx-servicecreated查看创建的Service,命令如下:[root@master~]#kubectlgetsvcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP<none>443/TCP101dnginx-serviceNodePort32<none>80:31526/TCP19s8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用可以通过宿主机IP地址:31526访问Nginx,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用模拟其中一个Nginx服务挂掉,看是否会影响服务。首先查看Pod,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-app-7bd9c4cb95-dkw8r1/1Running015mnginx-app-7bd9c4cb95-dl5b71/1Running015m当前存在2个Pod,删除其中一个Pod,命令如下:[root@master~]#kubectldeletepodsnginx-app-7bd9c4cb95-dkw8rpod"nginx-app-7bd9c4cb95-dkw8r"deleted8.2.1

Kubernetes集群服务案例部署Kubernetes体验(3)使用Yaml模板部署应用删除完之后,使用网页查看Nginx服务的首页,服务不受影响,继续查看Pod数量,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-app-7bd9c4cb95-dl5b71/1Running015mnginx-app-7bd9c4cb95-zsw4n1/1Running04s8.2.1

Kubernetes集群服务案例部署Kubernetes实战本实战案例拟使用Kubernetes平台部署一个WordPress博客系统,具体配置与介绍如下:①需要用到两个容器镜像,分别为WordPress:4.8-apache和MySQL:5.6。②使用NFS创建PV作为数据库与WordPress的后端存储。③使用Secret生成器管理密码。④最后使用Yaml文件编排部署博客系统。8.2.1

Kubernetes集群服务案例部署Kubernetes实战(1)安装与配置NFS在master节点上安装NFS所需要的软件及依赖,命令如下:[root@master~]#yuminstall-ynfs-utilsrpcbind安装完之后,启动RPC与NFS服务,命令如下:[root@master~]#systemctlstartrpcbind[root@master~]#systemctlenablerpcbind[root@master~]#systemctlstartnfs[root@master~]#systemctlenablenfs8.2.1

Kubernetes集群服务案例部署Kubernetes实战(1)安装与配置NFS创建两个目录,作为NFS的共享目录,然后赋予权限,命令如下:[root@master~]#mkdir-p/home/pvdata/mysql[root@master~]#mkdir-p/home/pvdata/wordpress[root@master~]#chmod777/home/pvdata/mysql[root@master~]#chmod777/home/pvdata/wordpress修改NFS配置文件/etc/exports,将创建的两个目录进行共享,命令如下:[root@master~]#cat/etc/exports#在/etc/exports配置文件中,添加如下两行/home/pvdata/mysql/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501)/home/pvdata/wordpress/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501)8.2.1

Kubernetes集群服务案例部署Kubernetes实战(1)安装与配置NFS生效NFS配置文件,并查看分享的目录,命令如下:[root@master~]#exportfs-r[root@master~]#showmount-e9Exportlistfor9:/home/pvdata/wordpress/24/home/pvdata/mysql/248.2.1

Kubernetes集群服务案例部署Kubernetes实战(2)创建PV在创建PV之前,首先创建一个工作目录,命令如下:[root@master~]#mkdirwordpress[root@master~]#cdwordpress/[root@masterwordpress]#在WordPress目录下创建mysql-persistent-storage.yaml文件,该文件用来创建数据库所使用的PV,文件内容详见教材。在WordPress目录下继续创建wordpress-persistent-storage.yaml文件,该文件用来创建WordPress所使用的PV,文件内容详见教材。8.2.1

Kubernetes集群服务案例部署Kubernetes实战(2)创建PV编辑好Yaml文件后,创建PV卷,命令如下:[root@masterwordpress]#kubectlapply-fmysql-persistent-storage.yamlpersistentvolume/mysql-persistent-storagecreated[root@masterwordpress]#kubectlapply-fwordpress-persistent-storage.yamlpersistentvolume/wordpress-persistent-storagecreated创建完PV后,查看PV,命令如下:[root@masterwordpress]#kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEmysql-persistent-storage2GiRWO,RWXRecycleAvailable11swordpress-persistent-storage2GiRWO,RWXRecycleAvailable5s8.2.1

Kubernetes集群服务案例部署Kubernetes实战(3)设置密码生成器在/root/wordpress目录下创建kustomization.yaml文件,并在文件中添加一个Secret生成器,具体命令如下:[root@masterwordpress]#catkustomization.yamlsecretGenerator:-name:mysql-passliterals:-password=123456ok8.2.1

Kubernetes集群服务案例部署Kubernetes实战(4)编辑Yaml文件首先在/root/wordpress目录下创建一个mysql-deployment.yaml文件,用来部署数据库服务,MySQL容器将PersistentVolume挂载在/var/lib/mysql。MYSQL_ROOT_PASSWORD环境变量设置来自Secret的数据库密码,mysql-deployment.yaml中的具体内容详见教材。编辑好mysql-deployment.yaml之后,数据库的部署就告一段落了。接下来还需要创建一个wordpress-eployment.yaml用来部署WordPress应用,WordPress容器网站数据文件位于/var/www/html。WORDPRESS_DB_HOST环境变量集上定义了MySQL的Service名称,WordPress将通过Service访问数据库。WORDPRESS_DB_PASSWORD密码为Secret生成的数据库密码。具体文件内容详见教材。8.2.1

Kubernetes集群服务案例部署Kubernetes实战(4)编辑Yaml文件可以注意到,此次部署的WordPress版本为WordPress:4.8-apache,该镜像在配套的软件包中有提供,可自行上载到master节点。编辑完之后,保存退出,将以上两个文件补充到kustomization.yaml文件中,命令如下:[root@masterwordpress]#catkustomization.yamlsecretGenerator:-name:mysql-passliterals:

-password=123456ok#在配置文件中添加如下代码

resources:

-mysql-deployment.yaml-wordpress-deployment.yaml8.2.1

Kubernetes集群服务案例部署Kubernetes实战(5)部署应用在/root/wordpress目录下,通过如下方式进行部署,命令如下:[root@masterwordpress]#kubectlapply-k./secret/mysql-pass-ccht6ddg2mcreatedservice/wordpress-mysqlcreatedservice/wordpresscreateddeployment.apps/wordpress-mysqlcreateddeployment.apps/wordpresscreatedpersistentvolumeclaim/mysql-pv-claimcreatedpersistentvolumeclaim/wp-pv-claimcreated8.2.1

Kubernetes集群服务案例部署Kubernetes实战(5)部署应用查看Secret密码是否存在,命令如下:[root@masterwordpress]#kubectlgetsecret验证PVC是否被成功挂载了,命令如下:[rootgmasterwordpress]#kubectlgetpvcAGE最后验证Service是否被成功创建,命令如下:[rootamasterwordpress]#kubectlgetsvc8.2.1

Kubernetes集群服务案例部署Kubernetes实战(6)验证应用通过浏览器访问9:31000,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes实战(6)验证应用根据提示选择语言,并单击“Continue”按钮,进入配置信息界面,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes实战(6)验证应用根据要求填写相关信息,然后单击下方的“InstallWordPress”按钮进行安装,然后就可以登录了。使用自己设置的用户名和密码进行登录,如图所示。8.2.1

Kubernetes集群服务案例部署Kubernetes运维(1)Node的隔离与恢复在硬件升级、硬件维护等情况下,需要将某些Node节点隔离。使用kubectlcordon<node_name>命令可禁止Pod调度到该节点上,但在其上运行的Pod并不会自动停止,管理员需要手动停止在该Node节点上运行的Pod。此处使用的实操环境是一台PC,尝试将master节点隔离(master也是一个Node节点),命令如下:[root@master~]#kubectlcordonmasternode/mastercordoned查看Node节点的状态,命令如下:[root@master~]#kubectlgetnodesNAMESTATUSROLESAGEVERSIONmasterReady,SchedulingDisabledmaster102dv1.18.18.2.1

Kubernetes集群服务案例部署Kubernetes运维(1)Node的隔离与恢复通过kubectluncordon命令完成对Node节点的恢复,命令如下:[root@master~]#kubectluncordonmasternode/masteruncordoned再次查看Node节点信息,命令如下:[root@master~]#kubectlgetnodesNAMESTATUSROLESAGEVERSIONmasterReadymaster102dv1.18.18.2.1

Kubernetes集群服务案例部署Kubernetes运维(2)Pod动态扩容和缩放以NginxDeployment为例,创建一个Nginx的Deployment,副本数为1,命令如下(在做该案例时,为了避免Kubernetes实战中创建的资源受影响,可自行删除):[root@master~]#kubectlcreatedeploymentnginx--image=nginx:latestdeployment.apps/nginxcreated查看Pod和Deployment,命令如下:[root@master~]#kubectlgetpods[root@master~]#kubectlgetdeployment8.2.1

Kubernetes集群服务案例部署Kubernetes运维(2)Pod动态扩容和缩放通过使用kubectlscale命令将NginxDeployment控制的Pod副本数量从初始的1更新为5,命令如下:[root@master~]#kubectlscaledeploymentnginx--replicas=5deployment.apps/nginxscaled更新副本后,继续查看Pod数量,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-674ff86d-7xgct1/1Running066snginx-674ff86d-9mzvx1/1Running066snginx-674ff86d-dw6mb1/1Running066snginx-674ff86d-n6jqq1/1Running04m33snginx-674ff86d-ztm8j1/1Running066s8.2.1

Kubernetes集群服务案例部署Kubernetes运维(2)Pod动态扩容和缩放再将Nginx的Pod副本数调整为3,命令如下:[root@master~]#kubectlscaledeploymentnginx--replicas=3deployment.apps/nginxscaled查看Pod数量,命令如下:[root@master~]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-674ff86d-9mzvx1/1Running04m56snginx-674ff86d-dw6mb1/1Running04m56snginx-674ff86d-n6jqq1/1Running08m23s8.2.1

Kubernetes集群服务案例部署Kubernetes运维(3)将Pod调度到指定的Node节点Label(标签)作为用户可灵活定义的对象属性,在已创建的对象上,仍然可以随时通过kubectllabel命令对其进行增加、修改、删除等操作。使用kubectllabel给Node节点打标签的用法如下:#kubectllabelnodes<node-name><label-key>=<label-value>为Node节点打上一个project=gcxt的标签,命令如下:[root@master~]#kubectllabelnodesnodeproject=gcxtnode/nodelabeled如果想删除Label,只需要在命令行的最后指定Label的key名,并加一个减号即可。[root@master~]#kubectllabelnodenodeprojectnode/nodelabeled8.2.1

Kubernetes集群服务案例部署Kubernetes运维(3)将Pod调度到指定的Node节点在Pod中加入nodeSelector定义,代码详见教材。运行kubectlapply-f命令创建Pod,Scheduler就会将该Pod调度到拥有project=gcxt标签的Node节点上去。[root@master~]#kubectlapply-fnginx.yamlreplicationcontroller/nginx-gcxtcreated查看Pod的详细信息,命令如下:[root@master~]#kubectlgetpods-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnginx-gcxt-hdt5x1/1Running014snode<none><none>8.2.1

Kubernetes集群服务案例部署Kubernetes运维(4)应用滚动升级示例:在第一次部署时使用httpd:2.2.31,然后使用滚动升级更新到httpd:2.2.32。首先定义Yaml文件,在/root目录下创建httpd.yaml文件,文件内容详见教材。创建httpd的Deployment,命令如下:[root@master~]#kubectlapply-fhttpd.yamldeployment.apps/httpdcreated8.2.1

Kubernetes集群服务案例部署Kubernetes运维(4)应用滚动升级查看Pod和Deployment信息,命令如下:[root@master~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEhttpd-745bddc8fb-7h9cr1/1Running09m22shttpd-745bddc8fb-h2s2p1/1Running09m22shttpd-745bddc8fb-wtx8r1/1Running09m22s[root@master~]#kubectlgetdeployment-owideNAMEREADYUP-TO-DATEAVAILABLEAGECONTAINERSIMAGESSELECTORhttpd3/33316mhttpdhttpd:2.2.31app=httpd8.2.1

Kubernetes集群服务案例部署Kubernetes运维(4)应用滚动升级可以看到images的版本是2.2.31,修改httpd.yaml文件,把配置文件中的httpd:2.2.31改为httpd:2.2.32,命令详见教材。再次启动Deployment,命令如下:[root@master~]#kubectlapply-fhttpd.yamldeployment.apps/httpdconfigured再次查看Deployment的信息,命令如下:[root@master~]#kubectlgetdeployment-owideNAMEREADYUP-TO-DATEAVAILABLEAGECONTAINERSIMAGESSELECTORhttpd3/33316mhttpdhttpd:2.2.32app=httpd8.2.1

Kubernetes集群服务案例部署Kubernetes运维(4)应用滚动升级可以看到当前的httpd版本为2.2.32,查看Deployment的详细信息,命令如下:[root@master~]#kubectldescribedeploymenthttpd上面的日志信息描述了滚动升级的过程:①启动一个新版Pod。②把旧版Pod数量降为2。③再启动一个新版Pod,数量变为2。④把旧版Pod数量降为1。⑤再启动一个新版Pod,数量变为3。⑥把旧版Pod数量降为0。这始终保持副本数量为3,控制新旧Pod的交替,实现了无缝升级。8.2.1

Kubernetes集群服务案例部署技能训练1.安装Docker服务并搭建Kubernetes集群服务,查询集群节点的健康状态。2.在集群节点进行运维操作,完成对HTTP服务应用的回滚操作。谢谢!容器云服务架构与运维单元9基于K8S的CI/CD服务学习目标了解什么是持续集成/持续交付(CI/CD);理解CI/CD在日常工作中起到了什么作用、解决了哪些问题;了解构建CI/CD服务需要用到哪些工具;了解CI/CD的优点;掌握CI/CD环境的构建、CI/CD环境的配置与触发等技能。9.1CI/CD服务9.2

基于K8S构建持续集成9.1CI/CD服务9.1.1CI/CD服务介绍持续集成简介在了解持续集成之前,先了解什么叫集成,集成的英文翻译为ContinuousIntegration(简称CI)。持续集成是一种软件开发实践,即团队开发成员经常集成用户的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快地开发软件。9.1.1CI/CD服务介绍持续集成简介如果没有持续集成,则会发生以下情况:①项目做模块集成的时候,发现很多接口都不通,从而浪费大量时间。②需要人手动去编译打包最新的代码,构建过程不透明。③发布代码、上线等基本靠手工,脚本太多。使用持续集成可以:①维护一个单一的代码库。②使构建自动化。③执行测试是构建的一部分。④集成日志及历史记录。⑤使用统一的依赖包管理库。⑥每天至少集成一次。9.1.1CI/CD服务介绍持续交付介绍持续集成包含了构建与自动化测试的阶段,而持续交付(ContinuousDelivery,CD)在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的“类生产环境”之中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化的持续集成之上。此外,持续交付同样遵循一个小型的构建周期,可以将一小批代码推送到多个环境:开发、测试或生产。在此过程中,它结合了持续集成和持续部署的实践(即让主干始终处于可部署状态)。当提交的代码完成以上步骤后,可以在“部署流水线—流水线管理”中创建对应的CD流水线将持续集成后产生的应用版本自动部署到对应的环境中去。此外,对于部署到正式环境中的代码,可以在流水线中添加一个人工卡点任务,只有通过人工审核后,才能执行后续的自动部署任务。9.1.2

CI/CD的工作流程与使用场景CI/CD的工作流程持续集成(CI),是软件开发周期的一种实践,把代码仓库(GitLab或者GitHub)、构建工具(如Jenkins)和测试工具(如SonarQube)集成在一起,频繁地将代码合并到主干然后自动进行构建和测试。简单来说,持续集成就是一个监控并控制系统中代码变化的工具,当发生变化时可以自动编译、测试以及执行后续的自定义动作。持续集成的工作流程如图所示。9.1.2

CI/CD的工作流程与使用场景CI/CD的工作流程开发人员先把代码放到GitHub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论