搞不明白为什么大家都在学习 k8s
作者 | 小明菜市场
来源 | 小明菜市场(ID:fileGeek)
头图 | CSDN 下载自东方IC
前言
都2020年了,你还不知道kubernetes就真的真的真的out啦。(贩卖焦虑体) 什么是k8s,k8s这个词来自于希腊语,有主管,舵手,船长的意思,我们从图标中能看出来。
在k8s的网站上,描述是这样的
生产级别的容器编排系统
从定义中可以提炼出三个关键字,分别是
生产级别
容器
编排系统
说k8s是生产级别的有如下的几个原因:
k8s 是谷歌的开源系统,基于谷歌的系统设计,并且已经在谷歌系统上平稳运行的很久。
k8s 是CNCF的首个毕业项目。
容器有以下几个特点
可移植性,容器可以被任何类型的***作系统安装使用。
包容性:支持多种类型的软件,这些软件都可以打包在容器内谷歌音乐播放器。
标准格式。
共存,多个容器可以运行在同一个物理机上。
隔离,不同的容器的软件彼此隔离。
最重要的一句话:没有容器就没有微服务。
容器和微服务化后,带来了一些好处,比如:
模块间更加独立,可以独立的部署和发布,加快了发布和更新的速度
隔离的运行环境,可以为不同模块定制不同的运行环境
容器的编排系统可以有效的管理在宿主机上的容器。
管理网络和访问
跟踪容器的状态
增大或缩小服务的规模
实现负载平衡
宿主机无响应后实现容器的重新分配
服务发现
管理容器的存储 等等…
pod中容器之间共享数据,可以使用数据卷。
容器内服务可能进程阻塞无法处理请求,可以设置监控检查的策略
控制器维护者pod副本数量,保证一个pod或一组同类prod数量始终可用
根据设定的指标,自动缩放pod副本数
使用环境变量或DNS插件保证容器中程序发现pod入口访问地址。
一组pod副本分配一个私有的集群ip地址,负载均衡转发请求到后端容器,在集群类其他pod可以通过clusterIP访问应用。
更新服务不中断,一次更新一个pod,而不是同时删除整个服务。
通过文件描述部署服务,使得应用程序部署变得高效。
Node节点组件集成cAdvisor资源收集工具,通过Heapster汇总,并保存到influxDB时序数据库,最后由Grafana展示worldbox。
支持RBAC认证授权机制。
k8s 集群中有管理节点,Master与工作节点,Node两种类型。
管理节点Master主要负责k8s集群管理,集群中各个节点之间信息交互,任务调度,还负责容器,pod, namespaces , pv 等生命周期的管理。
工作节点node主要为容器和pod提供计算资源,pod及其容器全部运行在工作节点上,工作节点通过kubelet服务与管理节点通信以管理容器的生命周期,并与集群其他节点进行通信。
kubernetes api 资源***作的唯一入口,各种组件的协调者,以HTTP API 提供接口服务,并提供相关的认证,授权等机制,
处理集群中常规的后台任务,一个资源对应一个控制器,而ControllerManager负责管理这些控制器,并维护集群的状态。
负责资源的调度,按照预定的策略把pod调度到对应的Node节点上。
kubelet是Master在Node节点上的agent,管理本机运行容器的生命周期,同时也负责Volume和网络的管理。例如创建容器,挂载数据卷,下载secret,获取容器和节点的状态等工作。
在Node节点上实现Pod/serviced网络代理,提供cluster内部的服务发现和四层负载均衡。
真正运行容器的地方
分布式键值对储存系统,用于保存集群状态,比如pod,service等对象信息。
核心层:最核心的功能,对外提供api 应用层,部署无状态应用,等,和路由。管理层:系统度量,自动化,以及RBAC等 接口层:kubectl命令行工具,以及客户端sdk 生态系统:分为外部的日志,监控等,内部的镜像仓库等。
首先,查看所使用的 minikube 版本:
启动 minikube:
minikube 启动之后,会创建一个单节点 Kubernetes 集群。
查看集群版本:
这里有两个版本,client version 指的是 kubectl 命令行工具的版本,而 server version 才是 Kubernetes 的版本。
查看更详细的版本信息:
集群所在主机的 ip 为 172.17.0.77。
注意:这里的 master 指的是 Kubernetes 集群的 master 节点(在 Kubernetes 集群中,节点分为两类,一类是 master 节点,一类是 node 节点)。那怎么看到 node 节点呢?
host01 就是 node 节点,在当前环境中,实际上只有一台主机。这台主机既作为 master 节点,也作为 node 节点。
下面以部署一个 nginx 为例来演示部署应用的过程:
通过 run 命令创建一个名为 first-app 的 deployment,使用的是 docker hub 上最新的 nginx 镜像,并指定了应用端口为 80。deployment 是干嘛的呢?别急,往下看:
查看当前的 deployment:
查看当前的 pod:
查看更详细的 pod 内容:
已经部署好了一个 nginx 应用,那么要怎么去访问呢?这时候就需要用到 service。创建一个 service:
查看创建好的名为 first-app 的 service :
在 PORT(S) 一栏中,除了 80 端口,后面还有一个 30491 端口。这是使用了“NodePort”类型创建 service 分配的端口,通过主机 ip 和这个端口,就可以访问到这个 service 了。可以使用 curl 工具进行访问:
刚刚已经成功访问到 nginx 应用,但有些时候,可能需要多个 nginx 来横向扩展,那么在 Kubernetes 中怎么实现呢?
再查看当前的 pod,可以看到当前已经有了 3 个 first-app 了。
如果觉得 3 个太浪费资源了,想减少 pod 的数量,那么可以使用同样的命令,把 replicas 参数的值改为需要的值就可以了。
最常用的就是更新镜像。之前使用的是 docker hub 上最新的 nginx,现在用 1.10.3 这个比较老的版本来替代最新版本。先查看当前使用的 nginx 版本。这里有一个很简单的方法,访问一个不存在的页面,如下:
当前使用的 nginx 版本是 1.13.9,接下来进行更新***作:
再查看当前 nginx 的版本:
nginx 版本已经成功更新为 1.10.3。三角洲部队7
最后来讲讲删除应用,之前是通过 deployment 来创建应用,所以只需要删除 deployment 就可以删除对应的应用了英雄使命游戏。
再查看一下当前的 pod:
所有的 pod 都已经删除了。