k8s 入门
- 一、Kubernetes 是什么
- 1.“秘密武器”
- 2.优势
- 3.开放与完备
- 二、为什么要用 Kubernetes
- 使用 Kubernetes 有什么好处呢?
- 1.高效性
- 2.全面拥抱微服务架构
- 3.系统随时随地整体“搬迁”到公有云
- 4.超强的横向扩容能力
- 三.从一个简单的例子开始
- 1.3.1 环境准备
- (1 )关闭 CentOS 自带的防火墙服务
- (2)安装 etcd Kubem tes 软件(会自动安装 Docker 软件)
- (3)按顺序启动所有的服务
- 1.3.2 启动MYSQL 服务
- 1.3.3 启动Tomcat 应用
- 1.3.4 通过浏览器访问网页
- 问题和解决办法:
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、Kubernetes 是什么
1.“秘密武器”
首先,它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说,
Kubernetes 是谷歌严格保密十几年的秘密武器—Borg的一个开源版本
2.优势
如果系统设计遵循 Kubernetes 的设计思想,有很多的优势:
不必再费心于负载均衡器的选型和部署实施问题
不必再考虑引入或自己开发一个复杂的服务治理框架
不必再头疼于服务监控和故障处理模块的开发
所以,使用 Kubernetes 的解决方案,精力可以更加集中于业务上,节省至少30%的开发成本,所以运维难度和运维成本大幅度降低。
你想想,作为 SRE ,上班是不是就可以多摸鱼一会儿了,嘿嘿。
3.开放与完备
(1)Kubernetes 是开放平台
不局限于任何语言,没有限定任何接口,无论是python ,Java, GO,C++。都可以映射为 Kubernetes 的 Service ,并且可以通过标准的 TCP 通信协议进行交互。
真的实在太包容和强大了,NB!!!
另外,Kubernetes 对于编程语言,编程框架,中间件都没有侵入性,所以说,现有的系统很容易改造升级并且迁移Kubernetes 平台上。
(2)完备性
Kubernetes 是一个完备的分布式系统支撲平台。
Kubernetes 具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
同时,Kubernetes 提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。
因此,Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
使用 Kubernetes实在巴适的板,就像是一个3D立体式的万达广场,吃喝玩乐全都有,只有你想不到,没有他 Kubernetes 做不到的。太强大了,yyds!!!!!!!!!!!!!!!!!!!!!!!!!!
二、为什么要用 Kubernetes
使用 Kubernetes 有什么好处呢?
1.高效性
首先,最直接的感受就是我们可以“轻装上阵”地开发复杂系统了。以前动不动就需要十几个人而且团队里需要不少技术达人一起分工协作才能设计实现和运维的分布式系统,在采用Kubemetes 解决方案之后,只需 个精悍的小团队就能轻松应对。在这个团队里,一名架构师专注于系统中“服务组件”的提炼,几名开发工程师专注于业务代码的开发, 名系统兼运维工程师负Kubemetes 的部署和运维,从此再也不用“996 ”了,这并不是因为我们少做了什么,而是因为 Kubemetes 己经帮我们做了很多。
2.全面拥抱微服务架构
其次,使用 Kubemetes 就是在全面拥抱微服务架构。微服务架构的核心是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器在这里发挥了重要作用。微服务架构使得每个服务都可以由专门的开发团队来开发,开发者可以自由选择开发技术,这对于大规模团队来说很有价值,另外每个微服务独立开发、升级、扩展,因此系统具备很高的稳定性和快速法代进化能力。谷歌、亚马逊、 eBay Netflix 等众多大型互联网公司都采用了微服务架构,此次谷歌更是将微服务架构的基础设施直接打包到 Kubemetes 解决方案中,让我们有机会直接应用微服务架构解决复杂业务系统的架构问题。
3.系统随时随地整体“搬迁”到公有云
我们的系统可以随时随地整体“搬迁”到公有云上。 Kubemetes 最初的目标就是运行在谷歌自家的公有云 GCE 中,未来会支持更多的公有云及基于 OpenStack 的私有云 同时,Kubemetes 的架构方案中,底层网络的细节完全被屏蔽,基于服务的 Cluster IP 甚至都无须我们改变运行期的配置文件,就能将系统从物理机环境中无缝迁移到公有云中,或者在服务高峰期将部分服务对应的 Pod 副本放入公有云以提升系统的吞吐量,不仅节省了公司的硬件投入,还大大改善了客户体验 。
我们所熟知的铁道部的 123 06 购票系统,在春节高峰期就租用了阿里云进行分流。
4.超强的横向扩容能力
Kubemetes 系统架构具备了超强的横向扩容能力。对于互联网公司来说,用户规模就等价于资产,谁拥有更多的用户,谁就能在竞争中胜出,因此超强的横向扩容能力是互联网业务系统的关键指标之一。
不用修改代码, Kubemetes 集群即可从只包含几个 Node 的小集群平滑扩展到拥有上百个 Node 的大规模集群,我们利用 Kubemetes 提供的工具,甚至可以在线完成集群扩容 只要我们的微服务设计得好,结合硬件或者公有云资源的线性增加,系统就能够承受大 用户并发访问所带来的巨大压力。
三.从一个简单的例子开始
一个运行在 Tomcat 里的 Web App ,如图 1.1 所示, JSP页面通过 JDBC 直接访问 MySQL 数据库井展示数据 为了演示和简化的目的,只要程序正确连接到了数据库上,它就会自动完成对应的 Table 的创建与初始化数据的准备工作 所以,当我们通过浏览器访问此应用时,就会显示 个表格的页面,数据则来自数据库。
此应用需要启动两个容器 Web App 容器 MySQL 容器 并且 Web App 容器需要访问MySQL 容器。
在 Docker 时代,假 我们在一 宿主 上启动了这两个容器 则我 需要把 MySQL 容器的IP 地址通过环境变量方式注入Web App 容器里;同时,需要将 App 容器的 8080 端口 映射到宿 机的 8080 端口,以便能在外部访问 。
1.3.1 环境准备
首先,准备 Kubemetes 的 安装和相关镜像下载 本书建议采用 VirtualBox 或者VMware Workstation 在本机虚拟一个 64位CentOS7 虚拟机 作为学习环境,虚拟机采用 NAT的网络模式以便能够连接外网, 然后 下步骤快速安装 Kuberntes。
(1 )关闭 CentOS 自带的防火墙服务
systemctl disable firewalld
systemctl stop firewalld
(2)安装 etcd Kubem tes 软件(会自动安装 Docker 软件)
yum install - y etcd kubernetes
(3)按顺序启动所有的服务
systemctl start etcd
systemctl start docker
systemctl start kube - apiserver
systemctl start kube-controller- manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
到了这一步,一个单机版的 Kubernetes 集群环境就安装启动完成了。
congratulations!!!
接下来,我 可以在这个单 Kubernetes 集群中上手练习了。
1.3.2 启动MYSQL 服务
首先为 MySQL 服务创建一 RC 定义文件: mysql-rc.yaml 下面给出了该文件的完整内容和解释:
api Version: vl
kind : ReplicationController
metadata:
name : mysql
spec:
replicas : 1
selector :
app: mysql
template :
metadata:
labels :
app : mysql
spec:
containers:
- name: mysql
image: mysql
ports:
- containerPort: 3306
env :
- name: MYSQL ROOT_PASSWORD
value :”123456”
yaml 定义文件中 kind 属性,用来表明此资源对象 的类型,
比如这里的值为“ReplicationController ”,表示这是 RC;
spec 一节中是 RC 的相关属性定义,
比如 spec.selector 是RC Pod 签( Label) 选择器,即监控和管理拥有这些标签的 Pod 实例,确保当前集群上始终有且仅有 replicas Pod 实例在运行,这里我们设置 replicas=1 表示只能运行一个 MySQL Pod 实例。当集群中运行 Pod 小于 replicas 时, RC 会根据 spec. template一 节中定义的 Pod 模板来生成 个新的 Pod 实例, spec. template.metadata.labels 指定了该 Pod 的标签,需要特别注意:这里 labels必 须匹配之前的 spec.selector ,否则此 RC 每次创建了 个无法匹配 Label Pod,
就会不停地尝试创建新的 Pod ,最终陆入“为他人作嫁衣裳”的悲惨世界中,永无翻身之时。
创建好 mysql .yaml 文件以后,为了将它发布到 Kubemetes 集群中,我们在 Master 节点执行命令:
kubectl create -f mysql-rc.yaml
replicationcontroller ”mysql” created
接下来,我们用 kubectl 命令查看刚刚创建的 RC:
kubectl get re
查看 Pod 的创建情况时,可以运行下面的命令:
kubectl get pods
我们看到 个名为 mysql-xxxxx Pod 实例,这是 Kubernetes 根据 mysql 这个 RC 的定义自动创建的 Pod 。由于 Pod 调度和创建需要花费一定的时间,比如需要一定的时间来确定调度到哪个节点上,以及下载 Pod 里容器的镜像需要一段时间,所以一开始我们看到 Pod 的状态将显示为 Pending 。当 Pod 成功创建完成以后,状态最终会被更新为 Running。
我们通过 docker ps 指令查看正在运行的容器,发现提供 MySQL 服务的 Pod 容器己经创建并正常运行了,此外,你会发现MySQL Pod 对应的容器还多创建了 个来自谷歌的 pause 容器,这就是 Pod 的“根容器”。
docker ps I grep mysql
72ca992535b4 mysql
” docker-entrypoint .sh” 12 minutes ago Up 12 minutes
k8s_mysql . 86dc506e_mysql-c95jc_default_5lld6705 5051 lle6-a9d8-000c29ed42cl_9f89d0b4
76cl790aad27 gcr . io/google_containers/pause-amd64:3.0
” / pause ” 12 minutes ago Up 12 minutes
k8s_POD.16b20365 mysql-c95jc_default_5lld6705-5051-lle6-a9d8-000c29ed42cl_28520 aba
最后,我们创建一个与之关联的 Kubemetes Service MySQL 的定义文件(文件名为mysql-svc.yaml ),完整的内容和解释如下
apiVersion: vl
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
#表明是 Kubernetes Service
Service 的全局唯 名称
Service 提供服务的端口号
selector: # Service 对应的 Pod 拥有这里定义的标签
app: mysql
其中, metadata.name Service 的服务名( ServiceName): port 属性则定义了 Service 的虚端口: spec.selector 确定了哪些 Pod 副本(实例)对应到本服务。类似地,我们通过 kubectl create 命令创建 Service 对象。
运行 kubectl 命令,创建 service:
# kubectl create -f mysql-svc . yaml
service ” mysql ” created
运行 kubectl 命令,可以查看到刚刚创建的 service:
# kubectl get svc
注意到 MySQL 服务被分配了一个值为 169.169.253.143 Cluster 地址,这是 个虚地址,随后, Kubemetes 集群中其他新创建的 Pod 就可以通过 Service Cluster IP+端口 3306 来连接和访问它了。
在通常情况下, Cluster IP 是在 Service 创建后由 Kubemetes 系统自动分配的, Pod 无法预先知道某个 Service Cluster IP 地址,因此需要 个服务发现机制来找到这个服务。为此,最初时 Kubemetes 巧妙地使用了 Linux 环境变量( Environment Vari ab le )来解决这个问题,后面会详细说明其机制。现在我们只需知道,根据 Service 的唯一名字,容器可以从环境变量中获取到 Service 对应的 Cluster IP 地址和端口,从而发起 TCP IP 连接请求了。
1.3.3 启动Tomcat 应用
上面我 定义和启动了 MySQL 服务,接下来我们采用同样的步骤, Tomcat 应用的启动过程。首先,创建对应的 RC 文件 myweb-rc. yaml ,内容如下:
apiVersion: vl
kind : ReplicationController
metadata:
name : myweb
spec:
replicas: 2
selector :
app : myweb
template:
metadata:
labels :
app : myweb
spec:
containers:
- name : myweb
image : kubeguide/tomcat-app : v l
ports :
“ containerPort : 8080
注意 Tomcat 容器内, 应用将使用环境变量 MYSQL_SERVICE_ HOST 的值连接 MySQL服务。更安全可靠的用法是使用服务的名称“ mysql ”,详见本章 Service 的概念和 2.4 节的说明。
运行下面的命令,完成 RC 的创建和验证工作:
#kubectl create -f myweb-rc.yaml
replicationco troller myweb created
kubectl get pods
最后,创建对应的 Service 。以下是完整的yaml 定义文件 myweb-svc. yam!):
apiVersion : vl
kind : Service
metadata :
name : myweb
spec :
type: NodeP rt
ports :
- port : 8080
nodePort: 30001
selector
app: myweb
type=N odePort 和 nodePort=30001 的两个属性 表明此 rvic 开启了 Nod Port 方式的外网模式,在 Kubernetes 集群之外,比如在本机的浏览器里 可以通过 30001 这个端口访问 myweb (对应 8080 虚端口上)。
运行 kubectl create 命令
kubectl create - f myweb-svc . yaml
You have exposed your service on an external port on all nodes in your
cluster . If you want to expose this service to the external internet , you may
need to set up firewall rules for the service port ( s) (tcp: 30001) to serve traffic.
See http : //releases . k8s . io/release-1 . 3/docs/user-guide/services-firewalls.md
for re details .
service ” myweb ” created
我们可以看到上面有提示信息 意思是需要 30001 这个端口在防火墙上打开 以便外部的访问
能穿过防火墙。
运行 kubectl 令,查看 Service:
kubectl get services
做到这里,我们的 Kubemetes 例子搭建完了, 在下一节中我们验证结果。
1.3.4 通过浏览器访问网页
经过上面的几个步骤,我们终于成功实现了 Kubernetes 上第 子的部署搭建工作。现
在一起来 ,在你 本上 开浏览器 ,输入 http://虚拟机 IP:30001/demo/。
比如 拟机 192.168.18.131( 可以通过 #ip a 命令进行查询),在浏览器里输入地址:http://192.168.18.131 :30001/demo/后,
看到了 1.2 网页界面,那么恭喜你 之前的努力没有白费,顺利闯关成功!!!
问题和解决办法:
如果 看不到这个网页,那么可能有几个原因:比如防火墙的问题,无法访问 30001 端口,或者因为你是通过代理上网的,浏览器错把虚拟机的 地址当成远程地址了。 可以在虚拟机上直接运行 curl 192.168.18.131:30001 来验证此端口是否能被访问,
如果还是不能访问,那么这肯定不是机器的问题·.....
接下来可以 试单击“Add … "按钮添加 条记录并提交,如图 1.3 所示,提交以后,数据就被写入 MySQL 数据库中了。
至此,我们终于完成了 Kubemetes 上的 Tomcat 例子,这个例子并不是很复杂。
Kubemetes 真的是YYDS!!!
总结
1.我们也看到,相对于传统的分布式应用的部署方式,在 Kubemetes 之上我们仅仅通过 些很容易理解的配置文件和相关的简单命令就完成了对整个集群的部署,这让我们惊诧于 Kubemetes 的创新和强大。
2.下一节,我们将开始对 Kubemetes 中的基本概念和术语进行全面学习,在这之前,读者可
以继续研究下这个例子里的 些拓展内容,如下所述。