就在 Docker 容器技能被炒得热火朝天之时,大家创造,如果想要将 Docker 运用于详细的业务实现,是存在困难的——编排、管理和调度等各个方面,都不随意马虎。于是,人们急迫须要一套管理系统,对 Docker 及容器进行更高等更灵巧的管理。
就在这个时候,K8S 涌现了。
K8S,便是基于容器的集群管理平台,它的全称,是kubernetes。

Kubernetes 是谷歌开源的 Docker 容器集群管理系统,紧张为容器化的做事供应资源调度、扩容、缩容以及支配等功能。
实在从 Kuberbetes 就可以看出了它的用场,这个单词源于古希腊,意思是舵手,Docker的 logo 是一条鲸鱼,那么 Kubernetes 便是鲸鱼赖以生存的地方-海洋的领导者;它出身的韶光有点晚,15 年 7 月份才涌现第一个版本,不过一出生就大受欢迎,很多包括 IBM、红帽、微软等巨子都纷纭参与进来。
下面就带你认识一下 Kubernetes,并用它来实现革命性的hello,world!
Kubernetes一贯被雪藏的前身过去十几年,谷歌一贯有个秘密武器:Borg。Borg 一贯以来都是谷歌内部利用的大规模集群管理系统,Borg 是基于容器技能发展起来的,紧张还是实现资源管理的自动化和在跨多个数据中央的背景下的提高资源的利用率,谷歌一贯视 Borg 为传家宝,哪怕员工离职都不能透露给外界,直到 2015 年谷歌才公开,也便是说 Kubernetes 实在是 Borg 的一个开源版本。
利用Kubernetes?给我一个情由!第一,方便。如果我们的系统设计遵照了 Kubernetes 的设计思想,那么传统系统架构中与业务没有什么关系的底层代码、功能模块之类的我们都可以不用考虑了,我们不用再把精力耗费在负载均衡器的选型和支配履行等问题,也不用考虑引入乃至是自己开拓一个繁芜的做事管理框架,更不用为这些头疼了:做事监控、故障处理等。总之,Kubernetes 便是解放我们的精力的,好让我们更加专注于业务本身来做开拓。
第二,开放。Kubernetes 可以兼容所有的措辞,所有的编程接口也都能兼容,不管你用什么措辞写的都可以映射为 Kubernetes 的 Service 以及通过标准的 TCP 通信协议进行交互,更大好处是,现有的系统也可以改造升级并迁移到 Kubernetes 平台上;
第三,强大。经由十几年的发展,Kubernetes 已经成为了非常完备的分布式系统支撑平台,拥有极其强大的集群管理能力:多层次的安全防护和准入机制、多租户运用支撑能力、透明的做事注册和做事创造机制、内建智能负载均衡器、还能够及时创造故障并自我修复、做事滚动升级和在线扩容能力、可扩展的资源自动调度机制、多粒度的资源配额管理……太多了,不一而足!
IT 我们都知道技能更新换代快得比你换衣服都快,Docker 这个容器化技能的明星已经如此遍及,从单机到集群这已经是个不可逆转的大趋势,云打算也是风起云涌地进行着,Kubernetes 是业界公认的目前为止唯一一个 Docker 分布式系统办理方案。
开始之前你总得知道这些!不过先别焦急,再开始之前你总得先有点知识储备才行,就像学习 Java 的时候也不是上来就写hello,world而是先学一些与或非、数据类型等知识才开始。
在 Kubernetes 中 Service 便是分布式集群架构的核心,一个 Service 具有一下几个关键的特色:
拥有一个位置指定的名字,就犹如数据库中的主键;拥有一个虚拟的 IP 和端口号;拥有供应远程做事的能力并能够映射到供应这种做事的一组容器运用上;目前,Service 都是基于 Socket 通信办法或者是实现了某个详细业务的一个特定 TCP Server 进程来供应做事的,虽然一个 Service 常日都是由多个干系的做事进程来供应做事,而且每个做事进程都有一个独立的 EndPoint(IP + Port)访问点,但是!
但是 Kubernetes 可以让我们通过虚拟 Cluster IP + Service Port 连接到指定的 Service上。
有了 Kubernetes 内建的透明负载均衡和故障规复机制,哪怕后端有再多的做事进程,哪怕有再多的做事进程会由于故障而重新支配到其他的机器,都不会影响到我们对做事的正常调用;
Kubernetes 一旦创建就不会再发生变革,这也意味着,在 Kubernetes 集群中我们再也不用为了 IP 地址的频繁变动而头疼了。
容器的个中一个好处便是拥有强大的隔离功能,以是必须把为 Service 供应做事的这组进程放到容器中进行隔离,Kubernetes 的 Pod 工具便是干这事的,每个做事进程包装到相应的 Pod 中使其成为 Pod 中运行的一个 Container(容器)。
为了建立 Service 和 Pod 之间的关联,Kubernetes 会给每个 Pod 贴身一个 Label(标签),然后给相应的 Service 定义 Label Selector(标签选择器)。
那么,Pod 又是个什么东东?
Pod 运行在 Node(节点)中,这个节点既可以是物理机也可以是公有云或者是私有云中的虚拟机,常日一个节点上运行着几百个 Pod。
每个 Pod 中都运行着一个叫做 Pause 的容器和一些业务容器,为了提高通信和数据交流的效率,这些业务容器共享 Pause 容器的网络栈和 Volume 挂载卷,我们可以利用这个特性把一组密切干系的做事进程放到同一个 Pod 中。
不过,有一点须要把稳:不是每一个 Pod 及其里面扥容器都能“映射”到一个 Service 上,只要那些供应对外或者对内的做事的一组 Pod 才能“映射”成一个做事。
在集群管理方面,Kubernetes 把集群中的机器划分成一个 Master 节点和一群事情节点,前者运行着与集群管理干系的进程,事情节点运行着运用程序。
在 Kubernetes 集群中,扩容的话你只须要给与 Service 关联的 Pod 创建一个 Replication Controller,Replication Controller 文件至少包含以下信息:
目标 Pod 定义;目标 Pod 须要运行的副本数量;要监控的目标 Pod 的标签;创建好 Replication Controller 后。Kubernetes 会通过 Replication Controller 中定义的标签来筛选出对应的Pod实例并实时监控状态和数量,如果实例数量稍少于副本数量则会根据 Replication Controller 中定义的 Pod 模板来创建一个新的 Pod,再把这个 Pod 调度到得当的 Node 上启动运行,直到 Pod 实例数量达到预定目标。
凡事都得从hello,world开始这里hello,world是一个 Web 留言板运用,是个基于 PHP + Redis 的两层分布式架构的 Web 运用,这是留言板的系统支配架构图:
Web留言板的系统支配架构图
三个 Docker 镜像:
redis-master:用于前端 Web 运用进行写留言的操作,个中已经保存了一条“hello,world”。guestbook-redis-slave:用于前端 Web 运用进行读留言的操作,并且和 redis-master 的数据保持同步。guestbook-php-frontend:PHPWeb 做事,在网页上显示留言内容,同时供应一个文本输入框供访问者添加留言。这是 Kubernetes 支配架图:
Kubernetes 支配架图
下面我们一起开始手把手地教大家利用 k8s 搭建一个hello,world运用。把稳,本文利用的是 centos 操作系统。
首先,我们须要开启路由转发功能,如果不实行此步骤容器不能访问外网:
echo1>/proc/sys/net/ipv4/ip_forward
然后,我们在配置 yum 源:
yuminstall-yepel-releaseyumcleanallyumlist
再接着,我们安装 Docker。
yuminstall-ydocker-io
Docker 安装完毕后,我们就开始搭建 Kunernetes 运行环境了。
##关闭防火墙systemctldisablefirewalldsuystemctlstopfirewalld##再安装etcd和Kubernetes软件yuminstall-yetcdyuminstall-ykubernetes
然后修正 Docker 的配置文件 /etc/sysconfig/docker,OPTIONS 修正如下:
OPTIONS='--selinux-enabled=false--insecure-registrygcr.io'
把稳,Docker 镜像源建议采取海内的镜像源。通用的方法便是编辑/etc/docker/daemon.json:
{"registry-mirrors":["http://ovfftd6p.mirror.aliyuncs.com","http://registry.docker-cn.com","http://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],"insecure-registries":["registry.docker-cn.com","docker.mirrors.ustc.edu.cn"],"debug":true,"experimental":true}
然后重启 Docker 的 daemon 即可。
systemctldaemon-reloadsystemctlrestartdocker
再接着修正 Kubernetes 的 apiserver 配置文件 /etc/kubernetes/apiserver:
将 –admission_control 参数中的 ServiceAccount 删除。
然后按照顺序启动所有的做事:
systemctlstartetcdsystemctlstartdockersystemctlstartkube-apiserversystemctlstartkube-controller-managersystemctlstartkube-schedulersystemctlstartkubeletsystemctlstartkube-proxy
检讨上述做事是否都已经启动成功,如果都已经成功则 kubernetes 集议论况就已经安装完毕。
为 Redis-master 做事创建 RC 文件,语法格式为 ymal。
apiVersion:v1kind:ReplicationControllermetadata:name:redis-masterlabels:name:redis-masterspec:replicas:1selector:name:redis-mastertemplate:metadata:labels:name:redis-masterspec:containers:-name:masterimage:kubeguide/redis-masterports:-containerPort:6379
然后在 Master 节点中实行命令:Kubectl create -f<config_file>,并把它发布到 Kubernetes 集群中:
$kubectlcreate-fredis-master-controller.yamlreplicationcontrollers/redis-master
然后再创建与之关联的 Service。service 对应的文件 redis-master-service.yaml,内容如下:
apiVersion:v1kind:Servicemetadata:name:redis-masterlabels:name:redis-masterspec:ports:-port:6379targetPort:6379selector:name:redis-master
创建 redis-master service。
kubectlcreate-fredis-master-service.yaml
接着,再创建 redis-slave 做事,与前者一样,先创建 redis-slave 的 RC 定义文件redis-salve-controller.yaml。
apiVersion:v1kind:ReplicationControllermetadata:name:redis-slavelabels:name:redis-slavespec:replicas:2selector:name:redis-slavetemplate:metadata:labels:name:redis-slavespec:containers:-name:slaveimage:kubeguide/guestbook-redis-slaveenv:-name:GET_HOSTS_FROMvalue:envports:-containerPort:6379
然后创建 redis-salve 对应的 Pod。
kubectlcreate-fredis-salve-controller.yaml
Pod 创建完成后,创建对应的 service。先创建 service 的配置文件redis-salve-service.yaml,内容如下:
apiVersion:v1kind:Servicemetadata:name:redis-slavelabels:name:redis-slavespec:ports:-port:6379selector:name:redis-slave
然后根据配置文件,创建 service。
kubectlcreate-fredis-slave-service.yaml
为了实现 Redis 集群的主从数据同步,redis-slave 须要知道 redis-master 的地址,以是我们须要在 redis-slave 镜像的启动命令/run.sh中添加:
redis-server--slaveof${REDIS_MASTER_SERVICE_HOST}6379
末了,创建 frontend 的 RC 文件frontend-controller.yaml,内容如下:
apiVersion:v1kind:ReplicationControllermetadata:name:frontendlabels:name:frontendspec:replicas:3selector:name:frontendtemplate:metadata:labels:name:frontendspec:containers:-name:frontendimage:kubeguide/guestbook-php-frontendenv:-name:GET_HOSTS_FROMvalue:envports:-containerPort:80
然后在运行kubectl create命令创建 RC:
$kubectlcreate-ffrontend-controller.yamlreplcationcontrollers/frontend
再创建与之关联的 Service,frontend-service.yaml内容如下:
apiVersion:v1kind:Servicemetadata:name:frontendlabels:name:frontendspec:type:NodePortports:-port:80nodePort:30001selector:name:frontend
末了一步,创建 service。
$kubectlcreate-ffrontend-service.yamlservices/frontend
下面就可以打开浏览器输入:http://虚拟机IP:30001 之后就会涌现hello,world,成功了就这这样:
Web留言板界面运行效果图
总结这便是 Kubernetes,实现了hello,world就算是一只脚踏进来了,Kubernetesde 的好处太多了,最直接的好处便是可以轻装上阵开拓繁芜的系统,架构师专注于“做事组件”,剩下的人则卖力业务代码的开拓,而且 Kubernetes 还是实现微做事的利器,微做事实在便是一个巨无霸被拆成一个个小单体的过程,Kubernetes 来做这事无疑是最佳人选!