为什么要用Kubernetes?

1、前言

  第一次接触Kubernetes是在2016年,再一次浏览博文的时候,那是我第一次听到Kubernetes这个名词,也是第一次认识了k8s这么一个东西。后来在慢慢了解它的时候,被它天生高可用、负载均衡、弹性计算、自动扩容缩容和全自动容灾机制的设计理念吸引,于是自己便踏入了k8s这条不归路,在调研学习的过程中,开始不断填坑、挖坑再填坑,周而复始。

  2017年,公司还在使用裸Docker部署一些无状态的应用,随着越来越多的Docker实例,发生故障时,人工填坑的方式,让我们实在头疼,有时候大半夜正在做着美梦的时候,被一个电话铃喊起来处理着由于宿主机宕机或者网络不可达引起的各类问题。这种惨绝人寰的处理方式更是让我们头疼难忍。虽然后来引用了Swarm和Compose,但随着业务的不断增多,已经越来越来满足不了我们的应用场景,然后就想着把所有Docker应用迁移到Kubernetes中去管理。

  2017年6月30日,k8s发布1.7版本,2017年10月,Docker拥抱Kubernetes,也是我们正式开始使用Kubernetes的开始。但事情并没有我们想象中的那么简单,k8s的设计太多复杂,概念实在是太多,搭建过程更是让人吐血,当时可参考的文章又是少之又少。在经过一个多月的研究与不断回血之后,终于在k8s集群中部署了我们的第一个应用。虽然整个过程中踩了无数坑,遇到了无数个难题,但从始至终没有放弃,最终实现一整套的流程设计,从开发提交代码至Git,到最后成功部署到k8s集群中,彻底释放了双手。遇到集群中的宿主机宕机的时候,不用再去人工去处理,这一切k8s都帮你默默的处理了...

2、Kubernetes带来的变革

  对于开发人员

  由于公司业务多,开发环境、测试环境、预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境是没有日志收集的,在没有用k8s的时候,查看线下测试的日志,需要开发或者测试人员,找到对应的机器,在找到对应的容器,然后才能查看日志,在用了k8s之后,开发和测试可以直接在k8s的dashboard到对应的namespace,即可定位到业务的容器,然后可以直接通过控制台查看到对应的日志,大大降低了操作时间。

  把应用部署到k8s之后,代码的发布、回滚,以及蓝绿发布、金丝雀发布等都变得特别简单,不仅加快了业务代码迭代的速度,而且全程无需人工干预。目前我们使用jenkins、gitrunner进行发版或者回滚等,从开发环境到测试环境,到最后的生产环境,完全遵守一次构建,多集群、多环境部署,通过不同的启动参数、不同的环境变量、不同的配置文件实现区分不同的环境。目前已经实现Python、Java、PHP、NodeJS、Go、.NET Core等多种语言的一键式发版、一键式回滚,大大提高了开发人员的开发效率。

  在使用服务网格后,开发人员在开发应用的过程中,不用再关心代码的网络部分,这些功能都被服务网格实现,让开发人员可以只关心代码逻辑部分,即可实现网络部分的功能,比如:断流、分流、路由、负载均衡、限速和触发故障等功能。

  测试过程中,可能同时多套环境,当然也会需要再创建一套测试环境,之前测试环境的创建,需要找运维或者自行手工搭建。在迁移至k8s集群后,只需要在jenkins上点点鼠标即可在k8s集群上创建一套新的测试环境。

  对于运维人员

  如果你是一名运维人员,可能经常因为一些重复、繁琐的工作感觉厌倦。比如:这个需要一套新的测试环境,那个需要一套新的测试环境,之前可能需要装系统、装依赖环境、开通权限等等。而如今,可以直接用镜像直接部署一套新的测试环境,甚至全程无需自己干预,开发人员通过jenkins或者自动化运维平台即可一键式创建,大大降低了运维成本。

  一开始,公司业务故障,可能是因为基础环境不一致、依赖不一致、端口冲突等等问题,现在实现镜像部署,所有的依赖、基础都是一样的,大大减少了因为这类基础问题引发的故障。也有可能公司业务是由于服务器宕机、网络等问题,造成服务不可用,此类情况均需要运维人员及时去修复,而如今,可能在你收到告警信息的时候,k8s已经帮你恢复了。

  在没有使用k8s时,业务应用的扩容和缩容,都需要人工去处理,从采购服务器、上架、到部署依赖环境,不仅需要大量的人力物力,而且非常容易在中间过程出现问题,又要花费大量的时间去查找问题。成功上架后,还需要在前端反代端添加或该服务器,而如今,可以利用k8s的弹性计算,一键式进行扩容和缩容,不仅大大提高了运维效率,而且还节省了不少的服务器资源,提高了资源利用率。

  对于反代配置方面,比如可能你并不会,或者对nginx的配置规则并不熟悉,一些高级的功能你也不会实现,而如今,利用k8s的ingress即可简单的实现那些负责的逻辑。并且也不会在遇到nginx少加一个斜杠和多加一个斜杠的问题。

  对于负载均衡方面,之前负载均衡可能是Nginx、LVS、HAProxy、F5等,云上可能是云服务商提供的不在均衡机制。每次添加删除节点时,都需要手动去配置前端负载均衡,手动去匹配后端节点,而如今,使用k8s内部的service可以动态发现实现自动管理节点,并且支持自动扩容缩容。之前遇到高峰流量时,经常服务器性能不够,需要临时加服务器面对高峰流量,而如今对于高性能k8s集群,无需管理,自动扩容。

  对于高可用方面,k8s天生的高可用功能,彻底释放了双手,无需再去创建各类高可用工具、检测检查脚本。k8s支持进程级别的健康检查,如发现接口超时或者返回值不正确,会自动处理该问题。

  对于中间件搭建方面,根据定义好的deploy文件,可以实现秒级搭建各类中间件高可用集群,如Redis、RabbitMQ、Zookeeper等,并且大大减少了出错的概率。

  对于应用端口方面,传统行业中,一个服务器可能跑了很多进程,每个进程都有一个端口,需要人为的去配置端口,并且还需要考虑端口冲突的问题,如果有防火墙的话,还需要配置防火墙,在k8s中,端口统一管理,统一配置,每个应用的端口都可设置成一样的,之后通过service进行负载均衡。

  无论是对于开发人员、测试人员还是运维人员,k8s的诞生,不仅减少了工作的复杂性,还减少了各种成本。上述带来的变革只是其中比较小的一部分,更多优点只有用了才能体会到。

3、Kubernetes带来的挑战

  首先是对于k8s的学习本身就是很难的,概念太多,无从入手,可能学习了一个月也无法入门,甚至连集群也搭建不出来,使人望而却步。并且k8s对运维的技术能力要求比较高,已经不仅仅局限于传统运维,有时候你可能要修改业务代码等。并且需要掌握的知识也需要很多,你可能需要掌握公司所有使用到的代码,比如代码是如何进行编译的、如何正确发布、如何修改代码配置文件等,这对于运维人员,也是一种挑战。Kubernetes之所以被叫做k8s,业界有两种说法,通俗的说法是k和s之间有8个字母,另一种比较说法是k8s集群至少需要搭建8遍才能搭建成功。当然,在实际使用时,可能不止8遍。k8s的诞生,把运维从传统转变到了DevOps方向,需要面临的问题会更多,需要面临的新技术也有很多,但是当你掌握到了k8s的核心使用,就会受益终身。

  对于开发人员来说,对开发方式也有一些变化。从k8s的诞生到如火如荼,慢慢的k8s变成了一种标准,开发再进行代码开发时需要遵循Docker和k8s规范,严格遵守一次构建,多次部署原则,所有的配置都通过参数、变量或者k8s配置管理注入。并且对应用,要求是无状态的,因为Docker每次重启都会以最干净的基础启动。无论公司有没有进行业务容器化,遵循Docker和k8s规范都将成为未来的趋势,2019年7月,某公司因为代码不能和k8s兼容,导致一年亏损38亿美元...

4、这是重点

  在这些年踩了无数坑以后,也领悟到了每个技术人员学习k8s的痛点在哪里,首先是k8s概念不清楚就开始放肆的把应用部署到k8s集群中,产生的问题无从入手去解决,其次是k8s集群无论如何也搭建不出来,集群扩容也难以下手,然后是持续集成持续部署方面无从下手等等问题,想要搭建一整套k8s集群不仅仅局限于k8s集群的搭建。还需要对构建、发版、测试、部署流程化,也需要将GitLab、GitRunner、Jenkins、Harbor、Kubernetes等联系起来。这都是每个使用k8s会遇到的问题。

  来一波猝不及防的广告~

  其实上述列出了1234项主要是为了介绍一本即将上市的Kubernetes实战技术书籍,这本书可以带你避免在使用k8s的过程遇到的各类坑。

  

  这本书不仅能帮你快速搭建一整套集群,也会帮你解决在使用过程中遇到的各类问题,对于使用过程中的每个坑,大部分都已经帮你填上,让你少走很多弯路,少掉不少头发,让你能够快速走进k8s的正途。这本书适用于大部分企业,可以快速构建公司的k8s平台,并且容器化各类中间件、业务应用代码,如Java、NodeJS等。同样也介绍了SpringCloud各类组件的容器化。

  本书以实战为主线,深入浅出地介绍了Kubernetes在企业生产中的应用。全书共6章,主要内容包括:第1章讲解Kubernetes的高可用安装,分为kubeadm和二进制安装方式。第2章介绍了Docker和Kubernetes常用的理论基础。第3章主要讲解Kubernetes的常见应用的容器化。第4章主要介绍持续集成和持续部署,包括Jenkins最新的功能Pipeline的使用,从Pipeline的语法到项目实操,传统Java和Spring Cloud应用的容器化以及自动化构建部署。第5章主要讲解了Kubernetes的Nginx Ingress的安装和常用配置。第6章讲解了备受关注的Server Mesh。

原文地址:https://www.cnblogs.com/dukuan/p/11400344.html

时间: 2024-08-30 16:04:55

为什么要用Kubernetes?的相关文章

Kubernetes连接外部数据源

Kubernetes架构下比较核心的问题是数据如何persistance,虽然提供了Persistent volumn的方式,但是对于像数据库之类的产品在kubernetes集群环境中运行和管理还是很有难度的,Kubernetes提供了endpoints这种模式让外部的服务映射成内部的服务,这样比较好的解决了集群对外的连接问题, 如果我们去连接外部的一个oracle数据库,具体的步骤如下: 建立endpoints和service. [[email protected] jdbcservice]#

kubernetes Master部署之Scheduler 以及 HA部署(5)

Kubernetes Scheduler作用是将Controller Manager将要新建的Pod按照特定的调度算法和调度策略绑定到集群中某个合适的Node上,并将绑定信息写入到etcd中. 一.部署Scheduler 下面生成kube-scheduler的kubeconfig文件,操作如下: cd /etc/kubernetes export KUBE_APISERVER="https://192.168.15.200:6443" 配置 cluster kubectl config

Centos7上安装Kubernetes集群部署docker

一.安装前准备 1.操作系统详情 需要三台主机,都最小化安装 centos7.3,并update到最新 cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)  角色主机名IP Master      master192.168.1.14 node1    slave-1192.168.1.15 node2slave-2192.168.1.16 2.在每台主机上关闭firewalld改用iptables 输入以下命令,关闭fire

基于docker、kubernetes部署openstack到atomic系统上

声明: 本人阅读笔记,翻译类文章仅作意译.如有不对之处,请指出. 需要更本源的理解,请自行阅读英文. 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! 基于docker.kubernetes部署openstack到atomic系统上 openstack的服务定义,是不是看起来很简洁? openstack的实际组件构成,是不是看起来很复杂? 所有的openstack

Kubernetes 集群的两种部署过程(daemon部署和容器化部署)以及glusterfs的应用!

ClusterIp:通过VIP来访问, NodePort: 需要自己搭建负载据衡器 LoadBalancer:仅仅用于特定的云提供商 和 Google Container Engine https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/ port:相当于服务端口(对及集群内客户访问) targetPort: 相当于pods端口 nodePort: 宿主机端口(也是服务端口,只不过是对集群外客户访问)

在CENTOS7下安装kubernetes填坑教程(原创)

kubernetes(以下简称"k8s")目前是公认的最先进的容器集群管理工具,在1.0版本发布后,k8s的发展速度更加迅猛,并且得到了容器生态圈厂商的全力支持,这包括coreos.rancher等,诸多提供公有云服务的厂商在提供容器服务时也都基于k8s做二次开发来提供基础设施层的支撑,比如华为.可以说k8s也是Docker进军容器集群管理和服务编排领域最为强劲的竞争对手. 现在的Red Hat centos7的用户,已经可以使用熟悉的yum来直接安装k8s,但是真要安装起来,还是有相

Kubernetes的负载均衡问题(Nginx Ingress)

Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定minion主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是 Service可能有很多个,如果每个都绑定一个node主机端口的话,主机需要开放外围一堆的端口进行服务调用,管理混乱 无法应用很多公司要求的防火墙规则 理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如80,然后根据域名或者服务名向后面的Service ip转发,Nginx很好的解决了这个需求,但问题是如果有新的服务加入,如何去修改

kubernetes Master部署之ControllerManager部署(4)

Controller Manager作为集群内部的管理控制中心,主要负责集群内的资源管理,包括Node.Pod.命名空间.额定资源等.比如当某个Node意外宕机,Controller Manager会及时发现并执行自动化修复. 一.部署k8s Controller Manager 确保controller-manager-key.pem 和 controller-manager.pem存在,我这里在前面的文章中已经创建好相关私钥.执行如下操作: cd /etc/kubernetes export

Kubernetes应用部署策略实践

几个概念: Pod:是Kubernetes最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例.比如一个web站点应用由前端.后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod. node: 是 Kubernetes的worker节点,通常也称作为Minion node.除了运行一些kubernetes的组件以外(kubelet, kube-proxy等),还承担着运行容器服务的重任. ReplicationCont

Kubernetes基本概念

Basic knowledge 第一:docker是一款开源的容器,其实这个技术并不新鲜.早期在linux中就有LXC这样的轻量级的虚拟化系统.Docker其实只是换了一种语言来实现而已.Kubernetes意思是航海的舵手,它是docker的一款具有强大功能的编排+监控+灾备+负载管理系统 第二:kubernetes是基于google十五年的容器使用经验的总结和最佳实践,是google内部使用的borg系统的开源版本.改善了docker中很多的不足,可以说是与docker互补的一项技术. 第三