2.3 Kubernetes的基础知识

通过上一节的学习,我们对Kubernetes有了初步的了解,本节我们来了解Kubernetes的一些必备基础知识。

1.系统运维基础

支撑Kubernetes集群的操作系统是Linux和Windows(Kubernetes 1.14开始支持Windows系统),而且Linux内核版本要在3.8以上(建议3.10以上),因此,会使用Linux非常重要。仅具备初级Linux操作水平还不够,至少要有2~3年的Linux系统运维经验,这样在出现系统层问题的时候才能做好定位和排障。虽然Kubernetes支持多种Linux发行版本,个人建议还是使用CentOS。理论上来说,在服务器领域,CentOS的稳定性会比Ubuntu高很多,毕竟CentOS基于Red Hat,有Red Hat这么强大的开源技术公司做后盾,总比社区背景的Ubuntu可靠些。

没有Linux系统运维经验的人如果想学习Kubernetes会有点困难,建议先加强对Linux的学习。目前网上也有很多Linux的学习视频,学习路线图也很清晰,建议从Linux 7.x版本开始学习。

2.网络运维基础

除了系统层面的维护,我们也需要了解Kubernetes集群网络运维。根据我多年的运维经验,网络层面出现问题的情况一般比系统层面要多一些。另外,Kubernetes的底层是虚拟化技术,包含网络虚拟化。网络本身就很抽象,网络虚拟化就更加抽象了。这里不仅需要我们懂传统的网络知识,同时也需要我们掌握网络虚拟层的连接通信。网络技术能力如果比较弱,不影响Kubernetes入门学习。但是网络虚拟层连接通信在Kubernetes集群维护、网络排障和网络调优环节中是必不可少的,因为Kubernetes的底层网络用了大量的网络虚拟化。如果你想加强学习网络运维,建议按照“传统网络技术→虚拟化技术→网络虚拟化SDN技术”这样的路线逐步深入学习。

网络虚拟化技术的学习周期会比较长,这是云计算运维中一个单独的领域。学习Kubernetes不必非常精通网络虚拟化技术,但是它的基本概念和知识点还是需要掌握的。

3.存储运维基础

Kubernetes集群底层存储也需要用到网络虚拟化技术(排除有些公司直接用商业的集中式存储),这里通常会用到开源的Ceph技术。存储虚拟化运维相对网络虚拟化运维会简单一些,但是它的重要性非常高(毕竟数据无价)。通常Kubernetes集群设计方案会运行在稳定的IaaS层之上,IaaS层会采用OpenStack、VMware vSphere等平台建设。IaaS层本身就会用到成熟的存储和网络虚拟化技术,因此Kubernetes可以直接复用。不过在一家体量不大的公司里,IaaS层也是需要维护的,毕竟PaaS层会受到IaaS层的影响。

学习Kubernetes需要一定的存储运维经验。保证数据的稳定性是对运维人员最基本的要求。

4.安全技术基础

安全这个话题比较大,云时代的来临让信息安全更加受到重视。用户在云平台里大规模使用云主机,如果安全没有保障,运行在云上的应用很容易受到攻击。Kubernetes提供了PaaS层的解决方案,那么如何保证PaaS层的安全呢?这也是个很值得研究的问题。图2-6所示是来自CNCF的一个统计数据,表示用户在使用Kubernetes的时候,哪一技术领域最让用户担心。

图2-6 安全性是Kubernetes面临的最大挑战

很明显,安全问题是用户最为关注的,其次才是网络、存储、监控。安全问题常常是“道高一尺,魔高一丈”,有时候并不是完全靠技术就能解决的,要通过技术+流程+意识+法律等多方面手段配合。另外要注意一点,容器技术本身在安全性上就有一定的问题,它的隔离性一直饱受诟病。不过,最新推出的Kata还有Podman都在尝试解决这些问题。

安全领域是一个方向,它并不影响我们学习Kubernetes,而是像一个套在Kubernetes外层的护盾。但是在日后维护中如果没有安全方面的意识,搭建的平台将有很高的风险。Kubernetes之前也经常被爆出有安全漏洞,这些安全信息我们需要及时了解,然后快速找到有效的补丁进行处理。

5.开发编程基础

前几年自动化运维让各种脚本语言大火,特别是Python语言。作为运维工程师,如果不会一门编程语言,很难有竞争力。当前很多平台本身环境就复杂,重复做的事情很多,整理归纳后进行自动化处理可以在一定程度上减轻运维工程师的工作量。Kubernetes集群的维护也少不了自动化处理,如底层的部署、配置修改、资源管理等。Kubernetes是用Go语言编写的,这门语言具有高并发性能,学习和使用Go语言都很简单。如果要深入了解Kubernetes,源码的阅读是少不了的。

不管是Python语言还是Go语言,会一门开发语言都能帮助我们完成一些手工无法完成的事。Kubernetes本身的一些使用方法、设计模式都具有深刻的运维开发思维,也就是大家常说的DevOps。想要“高大上”地做运维工作,必须具有开发能力!

6.容器技术基础

Kubernetes是容器资源管理平台,它不仅支持Docker,也支持其他的容器技术,比如CoreOS的Rocket,以及最新的Podman。类似地,OpenStack不仅可以管理KVM,也可以管理Xen和VMware。学习OpenStack我们要先了解KVM虚拟化技术,同理,学习Kubernetes必然要学会Docker、Rocket等容器技术。

7.配置管理基础

这里再强调下YAML的学习。Kubernetes里面使用了大量的YAML文件,通过定义YAML文件可以达到配置和管理各种资源的目的。我们前面学过Kubernetes里面有多种控制器,这些控制器就是通过YAML文件操作资源的(比如Pod)。用户在YAML文件里定义各种参数,然后让控制器去运行。

另外,除了YAML的学习,我们也需要掌握一些优秀的配置管理思维。Kubernetes能助力CI/CD,一些版本控制、变更发布都需要有一套完善的标准化体系。面对大型的PaaS资源平台,除了运维能力的要求,一些配置流程的管理工作也需要做到位。运维能力决定了平台的稳定性,配置管理决定的是平台的标准化和流程化。我们经常听说一些过往的大事故是因为自动化配置出错导致的,所以要格外注意。

8.云原生概念

随着容器微服务的发展,经常可以见到云原生(Cloud Native)这个词。Red Hat对云原生是这么定义的:云原生落地依靠云原生应用,云原生应用就是独立的小规模、松散耦合服务的集合,旨在提供被业界认可的业务价值,例如快速融合用户反馈和需求,以实现持续改进。简而言之,通过开发云原生应用,我们可以快速构建新应用,优化现有应用并将这些应用组合在一起,用最快的速度满足用户需求。云原生的结构如图2-7所示。

我们可以把Cloud Native拆开来理解。Cloud就是云计算、上云。Native是“原生方法”。原生方法主要由DevOps、微服务、容器、持续交付4种理论和方法来实现。

图2-7 云原生的结构

图2-7中,CI/CD即持续集成与交付,Micro-services即微服务,Containers即容器,DevOps目前还没有权威的定义,更多强调的是团队协作、加速软件交付。云原生里包含的CI/CD、微服务、容器技术都直接跟Docker和Kubernetes有关系。所以,学好Kubernetes也是为掌握新一代的架构方法打基础。未来用到Kubernetes的地方会越来越多,云原生直接给出了一个IT技术发展的大方向,具有很强的指导意义。

本节介绍学习Kubernetes需要掌握的基础知识,包括系统基础、网络基础、存储基础、安全基础、容器基础等8个方面。读者可以根据对基础知识的掌握程度,有重点地进行学习。