Kubernetes最简实践

简介: 本文讲的是Kubernetes最简实践【编者的话】最近一段时间,为了解决我们应用的部署问题,花了些时间将应用(就是我们人人都爱的先知)改造成Docker镜像,从此一整页的部署指南就变成指定一些参数启动镜像几个字,Docker真是一个神奇的大箱子。
本文讲的是Kubernetes最简实践【编者的话】最近一段时间,为了解决我们应用的部署问题,花了些时间将应用(就是我们人人都爱的先知)改造成Docker镜像,从此一整页的部署指南就变成 指定一些参数启动镜像 几个字,Docker真是一个神奇的大箱子。

【深圳站|3天烧脑式Kubernetes训练营】培训内容包括:Kubernetes概述、架构、日志和监控,部署、自动驾驶、服务发现、网络方案等核心机制分析,进阶篇——Kubernetes调度工作原理、资源管理及源码分析等。

不了解Docker的同学可以参见《 Docker入门简介 》。

应用容器化之后, 在测试环境中自然是很方便,但是要把容器应用在生产环境中, 容器本身还是不够的,在实例数量逐渐增长时,需要一个管理系统,基于某种莫名的信仰(Google啊,Golang之类的那种信仰),我们选择了Kubernetes作为我们的容器管理系统。

有了Docker之后,一套复杂的系统也可以变成像一个单一的应用程序一样非常方便地到处运行,而Kubernetes可以解决的问题范围就广多了,本文会从一些常见的角度出发,讲讲Kubernetes给我们带来了什么。

Kubernetes解决的一些问题

总的来说,Kubernetes解决了一些容器管理的事情,包括但是不限于以下列举的情况。

服务部署

服务部署是最基本的容器管理功能,依靠容易编写的yaml或者json,创建服务变得很方便,也容易被复用。

一个服务就是一个可读的json(PS:为啥不是yaml,因为yaml对空格要求太严格了,不喜欢,~_~ PPS:并不是不喜欢Python的意思),多个组件都可以用一个json表示,灵活性很高,配合Docker镜像服务器和简单的文件服务器,服务部署变成一件轻松的事情。
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
selector:
app: nginx
template:
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

网络连通

使用Flannel来解决网络问题只是一种方式,并不是唯一的方式。

与一些其他方案相比,Flannel最大的特点是对业务的简洁,在使用Flannel之后,不同主机的不同镜像之间可以通过IP直接通信,非常方便。

同时,为了对这些IP进行管理,Kubernetes的DNS模块还对Pod名字,Service名字做了IP映射,业务上使用起来非常方便。

问题是性能会不太好,毕竟在宿主机上cURL一个远端的IP,需要经过Route规则、iptables、Flannel虚拟网卡、封包、传包、宿主机网卡、Flannel虚拟网卡、解包、Route规则,Docker虚拟网卡才能进到目的地,不过究竟有多差还没有测试。

很方便就是了。

资源管理

kubelet可以采集宿主机的资源并汇报给Kubernetes,使得Kubernetes可以拿到集群中的资源情况,同时借助于Docker的资源限制Kubernetes实现了从用户层到部署层到应用层多个层级的资源限制,非常方便。

在进行服务部署时,Kubernetes也能根据各个节点自身的资源情况完成分配,省去了很多运维上的事情。

服务的高可用

Kubernetes内置rs(复制集)的概念,在rs中的实例数量指定后,Kubernetes会尽力保证实例的数量,如果出现节点挂掉或者容器挂掉的情况,rs会使用重启或者选择的节点启动新服务的方式,保证正常实例的数量。

因为etcd本身可以做成集群,Kubernetes的master节点也做了加锁操作,自身的高可用可以通过配置多个主节点加一个LB比较方便地实现。

一个配置良好的Kubernetes集群从管理服务到应用服务都避免了单点的存在,实现了服务的高可用。

版本管理

借助rs(复制集)的概念,Kubernetes可以在不停止业务的情况下对应用进行滚动升级和回滚,非常好用。

监控报警

严格来说,这并不是Kubernetes自带的功能,只是有些比较好用的方案可以直接用在Kubernetes上。

Kubernetes自带的Dashboard可以用来查看非图形的系统状况(自带的图形化展示只是一个demo性质的东西),简单,也足够可用,但是在需要图形化展示系统状况的时候,需要一个额外的组件去完成。

Heapster + InfluxDB + Grafana使用起来比较傻瓜,即装即用,但是由于Heapster没有插件机制,我们如果要监控Pod内的业务指标,就不得不去关心数据的存储格式,自己采集数据写到DB中,并不是特别美。

而open-falcon自带的插件机制会编写自定义数据采集比较友好,open-falcon自带的展示页面比较难用,所以用open-falcon +插件+ Grafana成为我们监控报警的方案,可以比较好的满足需求,开发量也不会太大。
01.png

Kubernetes与云

主要有两点:磁盘和LB(负载均衡器)

在私有部署中,磁盘是不可信设备,需要做好随时挂掉的准备,而在云环境中,磁盘本身做了高可用,是可信设备,在AWS上,Kubernetes支持磁盘的自动挂载,这意味着如果在A节点挂载了一块磁盘启动实例,如果A节点挂掉,实例在B节点自动重新启动,那之前挂载的磁盘也会跟随实例走,实现有状态服务的自动恢复,超级棒的特性(希望国内的厂商也能向Kubernetes提自己的Patch实现类似的功能,自有分支并不是一个太好的主意)。

LB可以直接跟虚拟IP绑定实现服务暴露,也很好用,就是服务多了麻烦了点,需要有一些映射关系的管理,所以我们没有用LB直接绑定虚拟IP,而是用的Ingress的那套东西,LB直接绑定所有的Ingress,之后用子域名进行服务划分。

小坑

虽然最后的结果还可以,但是过程并不是一帆风顺的,有些地方也挺折腾。

服务暴露的问题

Kubernetes为每个服务分配了一个虚拟IP,虚拟IP后端可以挂载多个实例,相当于一个逻辑LB,因为IP是虚拟的,只能靠iptables规则在集群内部可用,没法对外暴露服务。

为了实现服务的对外暴露,可以使用端口映射或者集群内代理两种方式实现。

端口映射就是将虚拟IP和端口与宿主机的某个端口进行绑定,再绑定个云服务商提供的LB,就能对外服务了,好处是简单粗暴,不好处是端口管理会成为一件很头疼的事情。

集群内代理使用一个统一的端口,依靠某种规则将请求转发到集群内部,由于规则必然是语义上的规则,所以这种代理只能是应用层代理而不能是传输层代理,好处是端口统一,不好处是应用场景受限。

这次说的是官方推荐的集群内代理实现方式,是使用Nginx+PATH的方式暴露服务,在实际使用时,发现在绝大多数情况下,PATH作为区分手段,从功能上并没有办法完成服务暴露。

假设我们有两个服务,x和y,分别使用/x和/y进行访问,规则如下:
location: /x
upstream: x_backend
location: /y
upstream: y_backend

x_backend是一个http服务,并试图加载自身目录下的m.js文件,这时候就很尴尬了。

对x_backend的请求,/x必须携带,否则对m.js的访问会在代理层失去路由,而附带/x路径之后,对m.js的访问就变成了/x/m.js,这时候x_backend就不得不感知/x这个目录的存在,这表明基于PATH的路由划分对业务的逻辑造成侵入,因此从原理上,官方给出的这套方案是完全不可行的。

所以,在使用集群内代理时,最好使用基于泛域名解析的子域名区分服务的方式,在请求转发时,我们使用了OpenResty的DNS模块完成名字到IP的映射,使用Balancer模块完成请求转发,逻辑清晰、代码简单、性能良好,比监控服务变更之后重写Nginx配置再reload的方式简洁很多,有需求的同学可以参考实现。

防火墙的问题

如果没有耐心一条条看防火墙规则,需要在使用Flannel之前清空防火墙,规则设置为默认放过,之后再启动Flannel服务。

启动服务之后,就不要再去看防火墙规则了。

启动kube-proxy之后,也不要再去看那些NAT转发规则了。

按下回车,默默祈求那成千上万条规则能够正常工作,阿门!

需要主从的场景

Kubernetes自身比较难以解决需要主从模式的服务(突然感觉Redis 3.0的p2p模式有多么好用),需要在服务本身进行配置,不能算缺点,在使用的时候需要注意下就是。

那些快速更新的特性

Kubernetes真的更新太快了,很多特性(比如rc)在还没完善的时候就被干掉了,相关的文档也总是落后于最新代码。

但是更新快并不总是坏事,比如我们做监控会用到PID空间共享这些功能,在Docker支持之后,很快Kubernetes就更新了相关代码,对使用者还是友好的。

小结

总的来说,Kubernetes是一个远算不上成熟的,但是很诱人的容器管理系统,在某种程度上,他可以满足不少实际场景的需求,我们选择了他应用在生产环境中,也希望更多的人去使用和完善他(毕竟拉下水的人越多,系统完善的可能性就越大)。

原文链接:Kubernetes最简实践(作者:肖贝贝)

原文发布时间为:2017-05-14

本文作者:肖贝贝

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Kubernetes最简实践

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。
15 4
|
26天前
|
Kubernetes 网络协议 应用服务中间件
K8S二进制部署实践-1.15.5
K8S二进制部署实践-1.15.5
34 0
|
5月前
|
Kubernetes 安全 API
Kubernetes 多租户实践
Kubernetes 多租户实践
67 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
5月前
|
运维 Kubernetes 大数据
利用 Kubernetes 降本增效?EasyMR 基于 Kubernetes 部署的探索实践
Kubernetes 是市面上最受欢迎的集群管理解决方案之一,本文将介绍 EasyMR 作为一款提供一站式可视化组件安装部署与可观测运维管理能力的大数据计算引擎产品,是如何基于 Kubernetes 部署进行实践探索的。
46 0
|
3月前
|
Web App开发 Kubernetes 数据可视化
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
51 0
|
11天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
16 4
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0
|
5月前
|
资源调度 分布式计算 Kubernetes
Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享
Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
101 0

推荐镜像

更多