k8s(一)基本认识
k8s简单认识
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
kubernetes 又被称为k8s 是谷歌开源的号称包含了谷歌15年的运维的经验(是google Borg的一个开源版)。目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。简单的说是大规模管理容器的一个工具,支持自动部署,扩缩容等功能是一个分布式的系统支撑平台。
2015年,谷歌联合20多家公司一起建立了CNCF(Cloud Native ComputingFoundation,云原生计算基金会)而k8s是第一个加入CNCF的项目。
官网链接: https://kubernetes.io/
主要的核心功能:
自动装箱
基于容器对应用环境的资源配置自动部署容器
自我修复
容器失败的时候重启,节点有问题的时候会重新进行调度
某一个容器出现了问题,能够自动将容器重启或删除
水平拓展
通过简单的命令,ul 或cpu负载情况,对应用进行扩容或缩容
当遇到服务压力变大或变小的时候,通过简单的命令或配置完成服务的横向拓展,不停机的情况下增加机器或减少机器。
服务发现
内部实现了一套服务和发现机制,能够基于k8s自身实现服务与发现机制
滚动更新
根据应用的变化,对容器运行的应用进行一次性或批量的更新。
可以不停机的进行更新服务
版本回退
根据应用的部署情况,对应用容器运行的应用进行历史版本的回退.
秘钥和配置管理
不需要重新构建镜像的情况下,可以部署和更新秘钥和应用的配置,类似热部署
存储编排
自动实现存储系统挂载和应用,特别对有状态应用实现数据持久化特别重要,存储系统可以来自网络 ,或本地存储 等
批处理
提供一次性服务,定时任务,满足批量数据处理和分析的场景
k8s 核心架构图

Kubernetes中运行的机器中分为一个master 和一些node,称为 master 节点和kube node 节点.
kube master 节点 负责核心的调度,管理和运维,salve节点执行用户的程序
主节点称为 master node 或 head node, 从节点称为work node 或node;
每一个节点都对应着是一台机器,当然一个机器也可以即是 master 节点,又是work 节点,但是一般不推荐;
Api Server
api server 负责接受所有的请求,包括用户通过命令行输入的或web页面输入的。接收到命令后通知其他组件去干活;
scheduler
k8s 的所有的work node的调度器,当执行对应的任务的时候,由scheduler 来选择合适的节点去执行。
controller manager
k8s 的所有的work node 监控器;
controller manager 有需要具体的controller,比如 node controller ,service controller ,volume controller 等。
controller 负责监控和调整在work node 上部署的服务的状态。
etcd
k8s 的配置信息和部署信息等都存储在etcd中
kubelet
每个worknode 上都有一个kubelet ,用来收集worknode 上的相关信息,并定时发送给work node,同时接受来自master node 的指令采取措施,负责所有容器的启动停止保证节点的工作正常。
kube-proxy
网络代理,负责node 在k8s的网络通讯,以及对外部网络流量的负载均衡.
container runtime
安装了容器化所需的软件环境确保容器化程序能够跑起来,比如安装了docker engine 运行环境。
master 的节点主要是管理者和调度,统筹的功能,而其他的工作节点只是接收master发出的命令运行执行容器等操作。
大致的执行流程说明:
我们在master节点执行一条命令要master部署一个nginx应用(kubectl create
deployment nginx –image=nginx)
这条命令首先发到master节点的网关api server,这是matser的唯一入口
api server讲命令请求交给controller mannager进行控制
controller mannager 进行应用部署解析
controller mannager 会生成一次部署信息,并通过api server将信息存入etcd 存储
scheduler调度器通过api server从etcd存储中,拿到要部署的应用,开始调度
看哪个节点有资源适合部署
scheduler把计算出来的调度信息通过api server再放到etcd中
每一个node节点的监控组件kubelet,随时和master保持联系(给api-server发
送请求不断获取最新数据),拿到master节点存储在etcd中的部署信息
假设node2的kubelet拿到部署信息,显示他自己节点要部署某某应用
kubelet就自己run一个应用在当前机器上,并随时给master汇报当前应用的状
态信息
node和master也是通过master的api-server组件联系的
每一个机器上的kube-proxy能知道集群的所有网络,只要node访问别人或者别
人访问node,node上的kube-proxy网络代理自动计算进行流量转发
服务
服务很好理解,比如要启动一个mysql 那么mysql就是一个服务。
对于每个服务对象 都有一个唯一的名字,拥有一个虚拟Ip和端口号。
在真实环境中一个服务一般是有多个的,比如web 服务,假设有10个web服务,会被部署到不同的容器中,而k8s 提供了特定的地址可以访问到其中的一个服务。服务是容器中抽象的最小的单位
pod
相当于逻辑主机,用来托管应用程序。包含一个或多个应用程序容器,以及这些容器的共享资源(存储,网络,共享信息等),一个工作节点上是有多个pod,而一个pod中有多个运行的容器。
其中一个pod 中有一个 Pause 容器,其他容器为业务容器,业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效。

deployment
deployment 负责创建和更新应用程序的实例,创建deployment 后,master 将应用程序实例调度各个节点上。如果对应的实例被删除,那么会将实例替换成另一个节点上的实例。
K8s 和docker的关系
docker 是一个开源的应用容器引擎。主要的功能就是容器化技术。
而k8s是为了解决大规模容器服务管理复杂化问题的,并不仅仅指docker。k8s管理的容器可以是docker 也可以是其他的容器,比如 Docker、Containerd、CRI-O和frakti 。
在k8s创建之初,支持的容器引擎是docker ,而从 1.5版本后,就加入了容器运行时的插件Api,也就是CRI(container Runtime Interface),提供了容器的接口拓展能力,
也使k8s支持更多的容器引擎成为可能。


