优秀的编程知识分享平台

网站首页 > 技术文章 正文

K8S入门,看这一篇就够了(k8s从入门到实践)

nanyue 2024-10-12 05:43:20 技术文章 32 ℃

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

最近发表
标签列表