地址
官网:Kubernetes
学习博客:https://blog.stanley.wang
K8s(githup下载地址): https://dl.k8s.io/v1.20.15/kubernetes-server-linux-amd64.tar.gz 点击 Server Binaries 的第一个包
etcd下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
dockerhub(镜像)下载地址: https://hub.docker.com
Helm官方地址: Helm
Ingress官方地址: Installation Guide - NGINX Ingress Controller
Volume(存储卷)官方文档地址:Volume | Kubernetes
K8S的插件配置资源清单:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons
容器监控(Prometheus)githup:https://github.com/prometheus-operator/kube-prometheus
helm命令
##官方文档:https://helm.sh
################helm的目录结构
cd helm-test
tree
.
├── charts #存放依赖文件
├── Chart.yaml #Charts的描述(版本)信息
├── templates #存放用到的模板文件
│ ├── deployment.yaml
│ ├── _helpers.tpl #自定义模板或函数
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #Chart的信息
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml #全局配置文件(设置的一些参数等)
##################常用命令
helm version #查看版本信息
helm list #查看安装的应用程序列表
helm repo add bitnami https://charts.bitnami.com/bitnami #添加官方数据源
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts #添加阿里云数据源
helm repo list #查看数据源列表
helm search repo harbor #查看应用的安装信息
helm pull bitnami/harbor #拉取应用安装包
helm create helm-test #创建一个chart(图表)模板
helm install test --dry-run . #检查模板文件格式,不会创建k8s资源
helm install test --set fullnameOverrid=aaa --dry-run . #修改values.yaml里面的值
helm install helm-test --namespace public-service . #创建操作
helm uninstall helm-test -n public-service #删除操作
helm upgrade helm-test -n public-service #更新操作
helm list -n public-service #查看helm创建的列表
逻辑架构图
概念介绍
Pod:Pod是K8S里能够运行的最小原子单元,由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器, Pause容器:是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享UTS、NET、IPC名称空间,一个Pod运行多个容器,称为边车(SideCar)模式; 状态:Pending:Pod已创建,在Pod内还有容器的镜像没创建,包括正在下载镜像的过程;Runnmg :Pod内的容器都已创建,至少有一个容器处于运行、启动、正在重启状态;Succeeded :Pod 内所有容器均成功执行后退出, 且不会再重启;Failed :Pod 内所有容器均已退出,但至少有 一 个容器为退出失败状态; Unknown :由千某种原因无法获取该 Pod 的状态,可能由于网络通信不畅导致 ;
Pod探针
- LivenessProbe(存活探针):用于判断容器是否存活 ( Running 状态 ),如果 Liveness Probe 探针探测到容器不健康 ,则 kubelet 将“杀掉"该容器,并根据容器的重启策略做相 应的 处理 。 如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success;
- ReadinessProbe(就绪探针):该探针定期触发执行,存在Pod的整个生命周期中,用于判断容器服务是否可用 ( Ready 状态 ),达到 Ready 状 态的 Pod 才可以接收请求;
- StartupProbe(启动探针):该探针是V1.16版本新增的,用于判断容器内应用程序是否已启动
Pod探针检查方式
- ExecAction(执行动作): 在容器内部运行一个命令,如果该命令的返回码为 0, 则表明容器健康;
- TCPSocketAction: 通过容器的IP地址和端口号执行 TCP 检查,如果能够建立 TCP 连接,则表明容器健康 ;
- HTTPGetAction: 通过容器的 IP 地址、端口号及路径调用 HTTP Get 方法,如果响应的状态码大于等于 200且小于400, 则认为容器健康; 该方式使用最多
Pod探针检查配置
- initialDelaySeconds: 5 初始化时间(秒),不建议设置太长时间
- periodSeconds: 60 检测间隔。默认是 10 秒。最小值是 1
- timeoutSeconds: 3 超时时间,默认1秒
- successThreshold: 1 检测到有1次成功则认为服务是`就绪`
- failureThreshold: 5 检测到有5次失败则认为服务是`未就绪`。默认值是 3,最小值是 1
Pod控制器:是Pod启动的一种模板,用来保证在K8S里启动的Pod符合预期运行,常见的控制器有:Deployment(管理部署,无状态建模)、DaemonSet、ReplicaSet(副本集)、StatefulSet(管理状态,有状态的建模)、Job(管理任务,批处理建模)、Cronjob(管理周期计划任务);
Name:是K8S内部中『资源』的一种逻辑概念(功能),name通常定义在元数据里,资源有五种维度:api版本(apiVersoin)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status);
Namespace(名称空间):用来隔离不同的用户,可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pod, service, replication controller(副本控制器) 和 deployment 等都是属于某一个 namespace 的(默认是 default),也就是具备隔离性;而 node, persistent volume(PV)/PVC,StoragrageClass,RBAC,IngressClass,namespace 等资源则不属于任何 namespace,也就是不具备隔离性;
Label(标签):一个标签对应多个资源,多个资源也可以对应一个标签,是多对多关系,标签格式:key=value,注解(annotations);
Service(服务):该服务为Pod提供统一入口,Service通过标签选择器选择后端,配合Replication Controller(副本控制器) 或者 Deployment 来保证后端容器的正常运行,匹配标签的 Pod IP 和端口列表组成 endpoints(连接端点),由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上;
Ingress:为进入集群的请求提供**路由规则**的集合,对外暴露的接口,只能以HTTP和HTTPS提供服务,在V1.19版本以后稳定;
K8S在V1.6版本以后默认使用基于角色的访问控制(RBAC);
流程图
![]()
HPA (Horizontal Pod Autoscaling是自动控制Pod数量的增加和减少):可以根据 CPU 使用率或应用自定义 metrics 自动扩展 Pod 数量;
ConfigMap:是分布式系统中的**『配置中心』**,将启动参数保存到ConfigMap中,文件名作为key,value是整个文件的内容;
CronJob:定时执行计划任务;
DaemonSet:保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用;比如:日志收集:fluentd,logstash 等;系统监控: Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等;系统程序: kube-proxy, kube-dns, glusterd, ceph 等;
Deployment:该控制器是用于部署无状态的服务,为了解决服务编排的问题,支持replicaset的所有功能; 可以管理多个副本的Pod,实现无缝迁移、自动扩容、自动缩容、自动灾难恢复、一键回滚等功能;
StatefulSet(状态集):是为了解决有状态服务的问题,在V1.9版本以后使用;
Job:负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束;
Local Volume(本地数据卷):是一个本地存储设备,比如磁盘、分区或者目录等。不支持自动创建;
Node:是Pod的运行主机,为了管理Pod,每个Node节点上至少要运行Container runtime(容器运行时),K8S只是通过Node Controller检查Node节点是否存在,通过Taints(污点) 和 tolerations(容忍)决定该Node节点是否调度Pod;
Volume(存储卷):将数据持久化存储,Volume(存储卷)的生命周期与Pod绑定,挂载为容器内的目录和文件,有ConfigMap :主要保存应用程序所需的配置文件;Secret :私密;Downward API :可以将 Pod 或 Container 的某些元数据信息(例如 Pod 名称、 Node IP 、 Label 、 Annotation 、容器资源限制等)以文件的形式 挂载到容器内;
PV(Persistent Volume ):持久卷,存储资源;PV生命周期,资源供应分为静态模式 (Static ) 和动态模式 (Dynamic) ,资源供应的结果就是将适合的PV和PVC成功绑定;资源绑定,系统将根据PVC对存储资源的请求(存储空间和访问模式)在已存在的 PV 中选择一个满足 PVC 要求的 PV ,一旦找到,就将该 PV 与用户定义的 PVC 绑定,用户的应用就可以使用这个 PVC 了;资源使用,需要在 Volume 的定义中引用 PVC 类型的存储卷,将 PVC 挂载到容器内的某个路径下进行使用 ;资源回收(Reclaiming) ,回收策略有Retain (保留数据)、 Delete (删除数据)、Recycle (弃用);
PV生命周期流程图
![]()
PVC(Persistent Volume Claim) :主要是涉及存储空间请求、访问模式、PV选择条件和存储类别等信息的设置 ;
PodDisruptionBudget (PDB):用来保证一组 Pod 同时运行的数量,这些 Pod 需要使用 Deployment、ReplicationController(副本控制器)、ReplicaSet 或者 StatefulSet 管理;
PodPreset:用来给指定标签的 Pod 注入额外的信息,如环境变量、存储卷等;
RS(ReplicaSet 副本集):支持集合式的selector,建议通过Deployment 来自动管理 ReplicaSet,支持版本记录、回滚、暂停升级等高级特性, **很少使用**;
RC (Replication Controller 副本控制器):分为两类,Controller Manager 中的和资源对象中的,RC是资源对象中的简称, **很少使用**;
Resource Quotas(资源配额):用来限制用户资源用量的一种机制,资源配额应用在Namespace上,只能有一个Resource Quotas(资源配额)对象,用户超额后禁止创建新的资源;
Pod Security Policies(PSP):是集群级的 Pod 安全策略,自动为集群内的 Pod 和 Volume 设置 Security Context(安全上下文);
Security Context :是限制不可信容器的行为,保护系统和其他容器不受其影响;
Secret(私密):解决了密码、token、密钥等敏感数据的配置问题,Secret中的数据要求以BASE6 4 编码格式存放 ;
Service account(服务账号):通过Secret保存用户身份凭证,凭证信息有CA根证书数据(ca.crt)和签名后的Token信息,当客户端通过API Server访问时,API会自动读取这些身份信息,并将其附加到HTTPS请求中传递给API Server以完成身份认证逻辑;
Event(事件):是一个事件的记录,记录事件的最早产生时间、最后重现时间、重复次数、发起者、类型以及导致此事件的众多信息;
Pod Readiness Gates: 给予了 Pod 之外的组件控制某个 Po d 就绪的能力,通过 Pod Readiness Gates 机制, 用户可以设置自定义的 Pod 可用性探测方式来告诉 Kubemetes 某个 Pod 是否可用,具体使 用方式是用户提供一个外部的控制器 (Controller ) 来设置相应 Pod 的可用性状态 ;**在1.14版本之后**
用户自定义API:用于将扩展 API 的访问请求转发到用户提供的 API Server 上,由它完成对 API请求的处理;API的元素主要由5部分组成:apiVersion 、 kind 、metadata 、spec 、status ;Fabric8 工具包:是访问K8S API客户端的一个工具;
CRD控制器:用于定义用户自定义的资源对象 ,基于客户端库 client-go 实现 Informer 、 ResourceEventHandler 、 Workqueue 等组件具体的功能处理逻辑;
QoS(Quality Of Service)服务质量等级:在K8S中,每个POD都有个QoS标记,通过这个Qos标记来对POD进行服务质量管理,它确定Pod的调度和驱逐优先级。服务质量体现在两个指标上,一个指标是CPU,另一个指标是内存 ;
- 等级类型(从高到低):Guaranteed:需要CPU、内存的Request和Limit的值一样;Burstable:CPU、内存的Request有配置,但值不一样;BestEffort:没有配置Request和Limit;
- K8S的删除策略:先删除服务质量为BestEffort,然后在删除Burstable,最后删除Guaranteed;
PodPreset: 用来给指定标签的Pod注入额外的信息,如环境变量、存储卷、配置容器时间、字符集等;
K8S核心组件
etcd服务(配置存储中心):是键值数据库,主要是存储元数据(集群信息);
主控(master)节点
1)apiserver服务(集群的控制中枢):是资源配额控制的入口,提供认证、授权、访问控制、API注册和 发现机制,负责模块之间的的数据交互,承担通信枢纽功能;
2)controller-manager服务(集群的状态管理器):负责维护集群的状态,通过apiserver实现,比如故障检测、自动扩展、滚蛋更新等,由一些列的控制器组成,控制器有:Deployment Controller(Pod控制器)、Volume Controller(存储卷控制器)、Garbage Controller(垃圾回收控制器)、Job Controller(任务控制器);Node Controller(节点控制器):通过API Server实时获取Node的相关信息,实现管理和监控集群中各个Node的相关控制功能;Resource quta Controller(资源配额控制器):通过Admission Control (准入控制 )来控制的,用LimitRanger 对 :容器级别,CPU和Memory进行限制;和Pod级别,对Pod内所有容器的资源进行限制;用ResourceQuota对Namespace(多租户)级别,包括Pod数量、Replication Contro ller 数量 、 Service 数量、 ResourceQuota 数量、 Secret 数量和可持有的 PV 数量 ;Namespace Controller(名称空间控制器):定时通过 API Server 读取 Names pace的信息经过一系列的判断 并将其保存在 etcd 中;Service Controller(服务控制器)和Endpoint Controller(接入点控制器):Endpoints(接入点集)是Service对应的所有Pod副本的访问地址,Endpoint Controller(接入点控制器)负责监听Servcie和对应的Pod副本的变化;Serv ice Controller 是K8S集群与外部的云平台之间的一个接口控制器;Node Controller(节点控制器)核心工作流程图
Resource quta Controller(资源配额控制器)流程架构图
3)scheduler服务(集群的调度中心):负责接收调度通过预算策略(predict)和优选策略(priorities)将Pod调度到适合的运算节点上,最后存到etcd中,在V1.5版本之后使用Framework调度机制;
工作节点 (node)
1)keublet服务:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;定时将Pod的状态上报给apiserver;以及镜像和容器的清理;
2)kube-proxy服务:负责为 Service 提供 cluster 内部的服务发现和负载均衡;是K8S在每个节点上运行网络的代理,建立pod网络和集群网络的关系(clusterip->podip);调度用Ipvs(IP Virtual Server )模式;负责建立和删除包括调度更新;ipvs:监听Master节点增加删除service以及endpoint的消息,调用Netetlink接口创建相应的ipvs规则,通过ipvs规则,将流量转发到相应的pod上;
iptables:监听Master节点增加删除service以及endpoint的消息,对于每一个service,它都会设置一个iptables规则,将service的cluststerIP代理到后端对应的Pod;
网络模型
网络插件
1)CNI网络插件:主要是实现pod资源能跨宿主机进行通信,通过Plugin(插件)在创建容器时分配网络资源,在容器销毁时删除资源;插件有: Flannel、Calico、Canal、Contiv、OpenContrail、NSX-T、Kube-router
2)服务发现插件:就是服务(应用)之间相互定位的过程,其实就是将服务名(Service Name)与集群网络IP(Cluster IP)绑定;插件有: Calico:是一个符合CNI标准的插件,给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由;
3)服务暴露插件:Ingress资源是用于暴露7层应用到K8S集群外的一种核心资源(http/https),Ingress控制器能够为Ingress资源监听套接字,然后根据Ingress规则配置机制路由调度流量的一个组件; 插件有:Traefik
CoreDNS:用于K8s集群内部Service的解析,可以让pod把Service名称解析成IP地址,然后通过Service的IP地址连接到对应的应用上;
Metrics-server:用来采集集群数据指标;
GUI管理插件:Dashboard
CLI客户端:kubectl
Kubectl命令