网站首页 > 技术文章 正文
1.前言:
继上一篇介绍《DevOps全生命周期常用工具,你真的都会用吗?》后,一直考虑第2篇文章的主题是什么?思来想去,冥思苦想,自己从事的这个专业领域的经过,觉得有必要讲一下容器及其容器编排,因为DevOps、容器、微服务成为云原生三驾马车,其中容器又是快速“构建”DevOps和微服务不可或缺的重要组件。
2.什么是K8S:
容器在此就不再多赘述,重点介绍下目前应用比较广泛的容器编排(容器集群)技术——Kubernetes(简称K8S)。
K8S是Google开源的容器集群管理系统,是一个功能强大的容器编排系统,是一个全新的基于容器技术的分布式架构领先方案。为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。也就是说,您可以将运行Linux容器的多组主机聚集在一起,由 K8S 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云、私有云或混合云部署主机。因此,对于要求快速扩展的云原生应用而言,Kubernetes 是理想的托管平台。
3.使用K8S的好处和坏处:
优势 | 劣势 | 备注 |
快速按需部署(快速响应) | 系统复杂性提高,可能运维难度 | 一旦掌握K8S,那劣势就不复存在了[呲牙] |
自助资源调度(运维简化) | ||
系统高可用(可靠性) | ||
动态伸缩(资源合理利用) | ||
...... |
4.K8S架构:
K8S采用的是常见的主从架构(master-slave),Master和Slave均为工作节点(Work Node),K8S官方通常把Slave节点直接叫节点(Node)。
- Master:
Master负责Kubernetes集群的控制和管理,是整个Kubernetes的控制中心。Master通常至少都需要占据单独一台服务器,生产环境建议部署三台以实现高可用。Master中包含了三种重要的服务,分别是:Kube-ApiServer、Kube-Scheduler、Kube-Controller-Manager。
ApiServer:Kube-ApiServer提供HTTP/HTTPS RESTful API。Kube-ApiServer是整个kubernetes集群的中枢神经,是整个集群增删改查的唯一入口。Kube-ApiServer串联了其他组件之间的数据交互。Kube-ApiServer提供集群管理的授权、访问控制、发现、认证等等功能。Kube-ApiServer是Etcd唯一的代理。Kube-ApiServer部署在master节点上。生产环境中master节点通常会做成高可用。
Scheduler:Kube-Scheduler是一种调度器。Kube-Scheduler会收集每个Node资源的详细信息及运行情况,包括CPU、内存等。Kube-Scheduler会收集每个Node上运行什么服务。Kube-Scheduler有自己的算法,在调度前会进行分析,然后会安排Pod到具体的Node节点上。
Controller Manager:Kube-Controller-Manager包括了很多的Controller,它可以对Pod进行副本管理。Kube-Controller-Manager是处理kubernetes集群中常规任务的后台线程,它也是一个守护进程。Kube-Controller-Manager通过Kube-ApiServer监视kubernetes集群的共享状态,确保整个集群处于预期的工作状态。Kube-Controller-Manager是kubernetes高可用的保证。
- Node:
Worker Node也叫Node,顾名思义,就是工作节点。我们Kubernetes的程序应用就会部署在这里。Node主要就是为Pod提供一个运行的环境,以及可以对Pod进行操作的空间。
Node受Master的管理。Node主要由Kubelet、Container Runtime、Kube-proxy组件构成。
Kubelet:每个Node上都有Kubelet,Kubelet就像是Node的客户端。Kubelet会监听和维护Pod的生命周期,当Master上的Scheduler确定了某个Node后,就会把Pod的配置信息发送给这个Node的kubelet,kubelet就会根据这些配置信息自动创建和运行容器。
Container Runtime:每个Node上都有Container Runtime。Container Runtime负责下载image并运行容器,它提供一个容器运行环境。Kubernetes的Container Runtime支持的容器有很多,最常见的就是Docker(传言K8S新版本可以支持其他容器技术)。
Kube-proxy:kube-proxy就是一个代理,它可以转发Service的请求到Pod。kube-proxy可以实现一个内部Pod的负载均衡。
- Etcd:Etcd是一个存储组件,就像是Kubernetes集群的数据库,会存储整个kubernetes集群状态。比如各个Node的信息和状态等。Etcd作为一个节点是相对独立的,只有Kube-ApiServer才能和Etcd进行通讯,Etcd会为Kube-ApiServer的操作记录持久化。Etcd不光可以存储,还可以监听,Etcd的键值发生变化会通知Kube-ApiServer,由Kube-ApiServer去通知客户端。因为Etcd的重要性,生产环境中Etcd最好部署多台,实现高可用。
5.创建Pod过程:
- kubectl将yaml文件转换为json,提交给apiserver,apiserver接收到pod创建请求后,不会去直接创建pod,而是将刚才的json信息写入etcd数据库。
- scheduler通过list watch机制监听apiserver发现了创建新Pod的事件,根据Pod属性调度到Node上,同时给Pod打标签指明调度到具体哪个节点,apiserver拿到调度结果并写入到etcd中。
- kubelet从apiserver获取到有个创建新Pod的事件由scheduler分配给自己,则调用node中的docker api,创建container。
- Docker根据kubelet需求创建容器并把容器的状态汇报给kubelet,kubelet将Pod状态更新到apiserver,apiserver将状态信息写到etcd中。
6.K8S中名词解释:
Pod:
在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建,计划的最小单元.
一个Pod(就像一群鲸鱼,或者一个豌豆夹)相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。
Label:
一个Label是一个key=value的键值对,其中key与vaue由用户自己指定。Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
Service:
service可以理解为一个微服务,是kubernetes 通过标签选择的方式来匹配一组pod,然后提供对外访问的一种机制,Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供4层负载均衡能力【只能基于ip地址和端口进行转发】,而没有7层功能【不能通过主机名及域名的方案去进行负载均衡】
Service在K8s中有以下四种类型
·Clusterlp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP【service创建一个仅集群内部可访问的ip,集群内部其他的pod可以通过该服务访问到其监控下的pod】
·NodePort:在ClusterlP基础上为Service在每台机器上绑定一个端口,这样就可以通过:NodePort来访问该服务【在service及各个node节点上开启端口,外部的应用程序或客户端访问node的端口将会转发到service的端口,而service将会依据负载均衡随机将请求转发到某一个pod的端口上。一般暴露服务常用的类型】
·LoadBalancer(常用):在NodePort的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到:NodePort【在NodePort基础之上,即各个节点前加入了负载均衡器实现了真正的高可用,一般云供应商提供的k8s集群就是这种】
·ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns 才支持【当我们的集群服务需要访问k8s之外的集群时,可以选择这种类型,然后把外部服务的IP及端口写入到k8s服务中来,k8s的代理将会帮助我们访问到外部的集群服务】
Node:
Node是Pod真正运行的主机,可以物理机,也可以是虚拟机。为了管理Pod,每个Node节点上至少要运行container runtime(比如docker或者rkt)、kubelet和kube-proxy服务。
Namespace:
大多数情况下用于实现多租户的资源隔离,namespace通过将集群内部的资源对象分配到不同的namespace中,形成逻辑上分组的不同项目、小组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
PV和PVC:
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。PVC可以请求特定的PV大小和访问模式(例如,可以一次读/写或多次只读)。
7.K8S常用命令:
#创建:kubectl create -f test.yaml
#删除:kubectl delete -f test.yaml
#查看命名空间:kubectl get namespace
#查看node节点:kubectl get node
#查看node节点及标签:kubectl get node --show-labels
#node打标签:kubectl label node node_name key=value
#查看pod,service:kubectl get pod,svc -o wide -n namespace
#查看node使用情况:kubectl describe node node_name
#查看pod详情:kubectl describe pod pod_name -n namespace
#查看pod日志:kubectl logs tail=10 -f pod_name -n namespace
#进入pod:kubectl exec -it pod_name bash -n namespace
#容器和宿主机传文件:kubectl cp 文件名 pod_id:容器内目录 -n namespace
猜你喜欢
- 2024-10-12 Kong 优雅实现微服务网关鉴权,登录场景落地实战篇
- 2024-10-12 k8s安装与使用入门(k8s安装步骤)
- 2024-10-12 应用无损上下线(应用无损上下线怎么关闭)
- 2024-10-12 另一个Kubernetes(k8s)指南(kubernetesk8s怎么使用)
- 2024-10-12 Kubernetes 安全专家(CKS)必过心得
- 2024-10-12 深入理解K8S网络原理上(k8s网络解决方案)
- 2024-10-12 一次客户需求引发的K8S网络探究(基于客户需求)
- 2024-10-12 今天讲讲k8s的pod控制器及无状态和有状态
- 2024-10-12 k8s如何滚动升级应用(k8s升级组件方法)
- 2024-10-12 k8s基础知识之service类型(k8s的service类型)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)