Kubernetes入门必学!!
Posted 水木,年華
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes入门必学!!相关的知识,希望对你有一定的参考价值。
一、Kubernetes简介
既资源管理器,K8S目标是为了让部署容器化应用、管理容器集群资源更加简单高效。
①Kubernetes 是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
②K8S用于容器化应用程序的部署,扩展和管理。
③K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等-一系列功能。
④Kubernetes目标是让部署容器化应用简单高效。
特点:
①轻量级
使用go语言;一种编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小。
一些解释性语言:例如Python/javascript / Perl /Shell,效率较低,占用内存资源较多
②开源
③自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
即对异常状态的容器进行重启或重建(先删除、再创建),目的是保证业务线不中断。
④弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
伸缩:扩容和缩容
弹性:人为只要指定规则,满足条件时,就会自动触发扩容或缩容的操作
⑤自动部署和回滚
KBS采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
⑥服务发现和负载均衡
K8S为多个pod提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
⑦机密和配置管理(secret——》安全/认证加密性的数据)
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在KSS中,方便应用程序使用。
⑧存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储〈如NES、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
⑨批处理
提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景
kubernetes集群架构与组件
一.基本组件
1、Pod(最小的资源单位)
首先,最小组成单元,是一组容器的集合,应用容器跑在pod资源中的
①一个pod会封装多个容器组成一个子节点的运行环境(最小单元)
最小部署单元
②一组容器的集合:基础容器+主应用容器+挂斗/副容器
③一个Pod中的容器共享网络命名空间:psuse基础容器提供的
④Pod生命周期是短暂的
Pod中跑几个容器:至少两个容器,即pause基础容器和主应用容器,也可以是三个(基础容器,主应用容器和f副容器),例如:nginx +logstash(以挂斗的方式)
pod中多个容器之间怎么通讯:localhost
一个node中跑15-40个Pod
2.资源清单:
①资源清单格式(资源清单/配置文件): Yaml
②Pod生命周期
Initc
Pod phase
容器探针—》liveness Probe 、 readnessProbe
Pod hook
重启策略
Pod控制器:掌握各种控制器的特点以及使用定义方式。
服务发现:掌握svc (service)原理及其构建方式(service 的yml)
存储:掌握多种存储类型的特点并且能够在不同环境中选择合适的存储方案
调度器(Scheduler):掌握调度器原理(预选和优选)能够根据要求把Pod定义到想要的节点运行(selector)安全:集群的认证鉴权访问控制原理及其流程
3、Pod控制器(维护Pod状态,期望值)
什么是控制器:对不同的对象及其特性使用不同的方式控制管理,更高级层次对象,部署和管理Pod
控制器说明:
- ReplicaSet 确保预期的Pod副本数量
- Deployment 无状态应用部署
- statefulset 有状态应用部署
- DaemonSet 确保所有Node运行同一个Pod
- Job 一次性任务
- Cronjob 定时任务
4、服务发现(Service同一个访问入口主)
K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问
可以通过service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)
小结: service作为一组Pod
的统一访问出入口(定义一组Pod的访问策略),以RR分流算法进行负载均衡,把Pod中的应用服务暴露出来给客户端访问
service ——》暴露方式是四层的
访问的方式是通过kube-proxy匹配iptables功能进行转发的(四层)
k8s官方默认提供了四层的代理/负载均衡方式,而我们可以借助于官方后续支持的ingres-nginx提供七层转发/负载均衡
对于docker来说,更适合应用无状态服务,而kubernetes,提供了一种解决方案—》多种存储类型
例如:
configmap:(配置管理中心),主要存储配置文件
secret:用户密码、需要加密的文件
volume:基本数据(网页文件)
PV, PVC:动态创建过程
5、存储服务分类:
①无状态服务:LVS
服务不依赖自身的状态,实例的状态数据可以维护在内存中。任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。
②有状态服务:例如数据库(需要持久化)
服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。一个请求只能被某个节点(或者同等状态下的节点)处理。
存储状态数据,实例的拓展需要整个系统参与状态的迁移。
在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。通常存在于分布式架构中。
无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息r
有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等
6、调度器(Scheduler)
K8S会自动完成把一个新的pod调度到对应的节点(预选/优选算法)
对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理,
例如:
指定节点位置创建Pod(指定调度)
将不同的Pod创建在一个节点上(亲和)
将不同的Pod创建在不同的节点上(反亲和)根据自己的需要,对pod进行节点组装等
7.Label :标签,附加到某个资源上,用于关联对象、查询和筛选
例如:创建一个POD 1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:
nginx 2、把pod暴露出去,service,通过yml文件定义 label: nginx
通过同一个label标签,进行关联,组合在一起
8、Namespaces :命名空间,将对象逻辑上隔离
K8S部署时默认两个名称空间即:default,kube-system
生产环境:一般会新建一个namespace,专门放置一些项目/服务使用的pod资源
9、Annotations :注释(描述性信息)
10、集群安全
认证、鉴权、访问控制、原理及流程
从搭建集群,就需要用到加密,CA认证 管理和控制,必须先通过认证/授权,才能进行管理
跑的一些应用如:nginx、squid需要一些访问控制策略
11、HELM(K8s中包的管理工具)
类似linux里面yum
helm安装magodb
helm 模板、自定义
K8S架构
1、master组件
①kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
②kube-controller-manager(控制器管理中心-定义资源类型)
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
③kube-scheduler
根据调度算法(预选/优选的策略)为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
④etcd
分布式键值存储系统(特性:服务自动发现)。用于保存集群状态数据,比如Pod、Service等对象信息
PS:etcd V2版本:数据保存在内存中
v3版本:引入本地volume卷的持久化(可根据磁盘进行恢复),服务发现,分布式(方便扩容,缩容)
etcd是一种定时全量备份+持续增量备份的持久化方式,最后存储在磁盘中
但kubernetes 1.11版本前不支持v3,我用的事K8S 1.15
ETCD一般会做为3副本机制(奇数方式),分布在三台master上(也有的公司单独用服务器部署ETCD )
master:奇数的方式部署(多节点的时候)
⑤AUTH :认证模块
K8S 内部支持使用RBAC认证的方式进行认证
2、node组件
①kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,
比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kubelet —》先和docker引擎进行交互—》docker容器(一组容器跑在Pod中)
②kube-proxy(四层)
在Node节点上实现Pod网络代理,维护网络规则、pod之间通信和四层负载均衡工作。默认会写入规则至iptables ,目前支持IPVS、同时还支持namespaces
对于七层的负载,k8s官方提供了一种解决方案;ingress-nginx
③docker或rocket
容器引擎,运行容器。
整体流程
①使用kubectl命令的时候会先进行验证权限(AUTH)
②通过API-server 对容器云的资源进行操作
以上是关于Kubernetes入门必学!!的主要内容,如果未能解决你的问题,请参考以下文章