初识K8S

文章目录

    • 引言
    • 什么是容器
    • K8S是什么
    • 如何部署
    • 一些基础概念
      • Pod和容器
      • 负载控制器
        • ReplicaSet
        • Deployment
        • DaemonSet
        • StatefulSet
        • Job
        • CronJob
      • 服务发现
        • namespace
        • Service
        • Ingress
      • 存储
        • 资源存储
          • ConfigMap
          • Secret
        • 卷存储
          • Volume
          • Persistent Volume
          • Persistent Volume Claim
    • 总结

引言

第一次听到这个名字是在两年前,当时到处都是k8s的一些文章,当时听到之后没有太大的一个概念,因为公司项目比较旧,很多时候部署都是直接将项目跑在tomcat上,而且最开始的时候,几乎都是有状态的服务,无法使用负载提升性能,最多就是做一个主备。我负责的项目随着功能不断更新迭代,用户量的增加,开始将一些服务改造成无状态,负载模式改成轮询,之后增加多台机器分摊用户访问压力。慢慢的,info级别的日志从开始的单台服务器几百兆,到现在四五台服务器每台十多个G,维护的工作量越来越多,生产环境排查问题的压力也越来越大,更新迭代生产环境发布每次都会把我熬一个不省人事…

什么是容器

认识K8S的基础是要认识一个容器的概念,当然目前有很多的容器技术,这里我用docker做介绍。开始的时候,我们想要在自己电脑上运行其他的环境,一般都是通过虚拟机的方式,去载入一个虚拟的环境,内部可以模拟一个新的windows或者Linux的系统,供我们学习使用。虽然虚拟机可以让我们去做非常多的事情,但是真正我们要的只是运行一个应用的话,那虚拟机就太笨重了。容器化的出现,解决了这个问题

Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 --wiki

Docker是可以做到让我们自己去打包一个最小化的一个应用容器运行环境,打包之后,可以在任意装了docker的环境中运行,非常的轻量,便携。而K8S,简单说就是可以把这些容器进行整体管理,编排。

K8S是什么

K8S的作用是用于自动部署,扩展和管理容器化,它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现,全名是kubernetes,因为k和s中间有八个字母,所以就被简称为k8s。

如何部署

一般来说,部署软件大概都是两种方式,一种是二进制文件部署,一种是安装包部署,如果想要整体了解k8s的内部结构,可以使用二进制文件部署。而安装包来说,就是比较简单快捷,适合需要快速搭建。官方提供了几种部署k8s的方式的包管理,包括集群,单机版本的部署。单机版本可以使用Minikube进行部署,集群一般可以使用kubeadm进行部署。使用包管理工具的话,一般是比较简单,我自己在测试环境一般都是用kubeadm部署,按照流程操作即可,如果出错的话,kubeadm也提供了初始化的操作。部署方面我觉的最主要的就是集群模式下网络的一个管理,保证各个节点之间,对应端口之前的通畅。

一些基础概念

下边我会把一些常接触的一些概念,简单介绍一下

Pod和容器

Pod是k8s中,可以被管理的最小节点,也就是说k8s就是通过管理Pod,来管理容器,那其实就可以将Pod理解为容器组,Pod内部可以有一个或者多个容器。因为我们需要知道整体Pod当前的一个运行状态,是否正常,所以出现了Pod生命周期,因为我们需要控制Pod如何才能算是一个正常状态,所以出现了livenessProbe、readinessProbe和startupProbe机制。因为容器之间,有些存在着关联,比如某个容器是基于另外一个容器才能运行,所以出现了Init控制器,而有些则是存在冲突,比如内部多个容器产生端口冲突,所以我们在控制Pod的时候,需要考虑Pod内部无法接受的冲突问题。所有的控制机制,都是为了我们去根据我们自己的要求,控制Pod和内部容器之间的生命周期以及关系。

负载控制器

控制器的作用,就是用来管理Pod,控制Pod的创建,更新,扩容,缩容。让Pod在各种操作下,平滑切换,从而达到我们预期的数量。

ReplicaSet

简称RS,是一个副本控制器,可以用来来控制无状态的Pod的副本数量,它可以确保Pod是按照我们要求的副本数量运行,如果出现Pod的数量没有达到我们的预期,他会自行去创建新的Pod,只到跟我们预期的一致

Deployment

Deployment是一个更高级的管理控制器,他是通过控制ReplicaSet来管理Pod,也就是说,他可以通过操作这个副本控制器来管理Pod,而且在此之上,他还增加了比如滚动更新,回滚等操作,可以更加平滑的控制Pod,一般来说,Deployment和ReplicaSet要一起使用,这样可以发挥Deployment的最大功能

DaemonSet

DaemonSet 也是用来管理Pod数量,但是他有个不同是,他是根据我们的集群节点去管理Pod数量,保证每个节点上都运行一个Pod,哪怕节点是新创建的, 也会在检测到之后,立马去创建一个相同的Pod。

StatefulSet

StatefulSet 是用来管理有状态的Pod,他可以保证Pod的顺序和唯一性,而且加入了一些持久化存储的特性来存储这些Pod的状态,可以保证这些Pod在发生异常或者重启的情况下,依然可以保留之前的状态。比如我们使用的一些中间件,MQ,DB等等,不能说重启之后,就初始化了。

Job

Job就是用来管理一些一次性使用的Pod,完成之后,不再进行启用。一般来说,可以使用Job做一些批量任务。

CronJob

CronJob就是定时执行Job,类似于我们的自动任务,需要每隔多长时间执行一次的Pod

服务发现

我们在操作Pod的时候,起了那么多应用,各个Pod之间的容器,进行了那么多层的包装,而且增加和减少的时候,每个Pod之间的IP不停的变化,他们内部如何进行互相访问,外部如何访问?

namespace

首先说一下这个名称空间,在K8S中,如果不配置名称空间,默认都在default名称空间下,而K8S内部的一些不同的基础设施,都使用了不同的名称空间,名称空间的作用就是隔离,定义在各个名称空间下的不同的组件,是隔离开的,不能进行互通,这个机制可以让我们更加方便的管理自己的不同环境,不同的作用域。

Service

服务发现其实主要说的就是Service,Service可以通过Pod配置的Label,来选择自己的作用范围,可以将所有Pod中,Label是某个KV的所有Pod,统一对他们进行代理,不需要使用ip进行选择。类似于Nginx的代理,我们只需要访问Service,就可以直接访问到某个Pod,或者所有Pod中的同一个无状态服务,达到负载的作用。默认Service代理之后,依然不能对外提供访问,因为不向外公开端口,我们可以将单独一个Service暴露对外端口,让外部进行访问。

Ingress

Service 最多可以做到的是TCP代理,只有强制开启外部端口才能被访问,但是依然是通过ip+端口也就是四层负载,但是Ingress可以直接在Service的基础上打开一个Http通道,实现七层负载,让外部通过http的方式进行访问,也可以设置安全证书。通过可以直接指定Service的名称实现。

存储

我把存储在K8S中分成两种,一种是配置资源存储,一种是卷存储,可以理解成一种是当配置使用,一种是当本地存储使用

资源存储
ConfigMap

ConfigMap可以理解成我们写代码时候的一个全局配置字典,可以指定一些比如环境变量等信息,让Pod进行引用。并且可以实现我们微服务中配置中心的概念,也就是说,我们更新一个配置,那么全部使用这个配置的Pod都会进行更新。而且ConfigMap不止可以只是当参数配置使用,而且可以直接将一整个文件,或者目录,做成一套配置,使用起来更加方便快捷。

Secret

Secret的作用就是存一些敏感信息,k8s会默认使用Base64把你的一些信息加密,而且Secret可以直接存一些容器私有仓库账号密码,如果我们Pod内拉去一些私有镜像,需要执行登录操作,肯定是拉不下来,这样我们可以配置全局的Secret在Pod中拉去镜像的时候指定,会自动先登录,后拉取。

卷存储
Volume

我们知道,docker运行的容器,如果不挂载外部目录的话,内部所有的东西新运行之后,就不再保留了,Volume可以理解为Pod中的存储路径,这个路径可以挂载到Pod内部的容器中,不会因为容器的状态影响挂载之后存储的内容。但是因为这个的作用域是在Pod中,会受到Pod状态的影响,如果这个Pod被删除,那么存储的信息,依然是找不到的。Volume可以做一些缓存路径。

Persistent Volume

简称PV,和Volume不一样的地方就是Persistent Volume指定的不一定是一个虚拟目录,它可以指定非常多类型的资源目录,想存在哪存在哪,而且是持久存储,不会受Pod或者容器或者K8S的状态影响,下面是可以存储的区域

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • FC (Fibre Channel)
  • Flexvolume
  • Flocker
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
  • Portworx Volumes
  • ScaleIO Volumes
  • StorageOS
Persistent Volume Claim

简称PVC,创建一个PVC,k8s默认就会给这个PVC分配一个适合的PV让他进行使用,比如我这个Pod需要10G的存储,现在系统中有三个PV,分别是11G,15G,20G,它会自动的帮我们选择挂载到11G的PV上,让Pod可以合理使用资源。

总结

本片文章简单的介绍了k8s的一些使用过程中比较容易接触到的概念,通过认识,理解这些基础概念,让我们知道k8s的强大之处。还有非常多的一些内部细节以及更加复杂的内部组织结构需要我们通过实践,深究的方式去了解。

你可能感兴趣的:(k8s,docker,k8s,java)