摘录自k8s中文社区https://www.kubernetes.org.cn/course

kubernetes 源自希腊文,意为舵手,k与s之间是8个字母,所以也叫k8s,

docker就像一个个的集装箱,容器本身仅提供了托管运行应用的底层逻辑,而容器编排 Orchestration才是真正产生价值所在,

而k8s就是负责运送doker的舵手,负责容器编排

容器编排是指容器应用的自动布局,协同,管理,

主要负责以下任务

Service Discovery

Load Balancing

Secrets/configuration/storage management

Health checks

Auto-[scaling/restart/healing] of containers and nodes

Zero-downtime deploys

谷歌在容器编排领域已经浸淫十几年,在这期间出现过Docker Swarm, Mesos,

都被比下去了

K8S是容器编排领域的领导者

流程图

功能

  1. 基于容器的应用部署、维护和滚动升级
  2. 负载均衡和服务发现
  3. 跨机器和跨地区的集群调度
  4. 自动伸缩
  5. 无状态服务和有状态服务
  6. 广泛的Volume支持
  7. 插件机制保证扩展性

1、pod

  1. 一组紧密关联的容器集合,支持多个容器在一个pod中共享网络和文件系统,克通过进程间的通信和共享文件完成任务,是k8s的调度的基本单位
  2. pod的设计理念是每个pod都有一个唯一ip

特征:

  1. 包含多个共享IPCNetworkUTC namespace的容器,可直接通过localhost通信
  2. 所有Pod内容器都可以访问共享的Volume,可以访问共享数据
  3. 优雅终止:Pod删除的时候先给其内的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然还在运行的进程
  4. 特权容器(通过SecurityContext配置)具有改变系统配置的权限(在网络插件中大量应用)
  5. 支持三种重启策略(restartPolicy),分别是:AlwaysOnFailureNever
  6. 支持三种镜像拉取策略(imagePullPolicy),分别是:AlwaysNeverIfNotPresent
  7. 资源限制,Kubernetes通过CGroup限制容器的CPU以及内存等资源,可以设置request以及limit
  8. 健康检查,提供两种健康检查探针,分别是livenessProberedinessProbe,前者用于探测容器是否存活,如果探测失败,则根据重启策略进行重启操作,后者用于检查容器状态是否正常,如果检查容器状态不正常,则请求不会到达该Pod
  9. Init container在所有容器运行之前执行,常用来初始化配置

容器生命周期钩子函数,用于监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数,支持两种钩子函数:postStart和preStop,前者是在容器启动后执行,后者是在容器停止前执行

2、Namespace

  1. 命名空间)是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组。常见的podservicereplicaSetdeployment等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace

常用namespace操作:

kubectl get namespace, 查询所有namespace

kubectl create namespacens-name,创建namespace

kubectl delete namespacens-name, 删除namespace

删除命名空间时,需注意以下几点:

删除一个namespace会自动删除所有属于该namespace的资源。

default 和 kube-system 命名空间不可删除。

PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。

Events是否属于namespace取决于产生events的对象。

3、Node

Node是Pod真正运行的主机,可以是物理机也可以是虚拟机。Node本质上不是Kubernetes来创建的, Kubernetes只是管理Node上的资源。为了管理Pod,每个Node节点上至少需要运行container runtime(Docker)、kubelet和kube-proxy服务。

常用node操作:

kubectl get nodes,查询所有node

kubectl cordon $nodename, 将node标志为不可调度

kubectl uncordon $nodename, 将node标志为可调度

taint(污点)

  1. 使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。每个污点的组成 key=value:effect

当前taint effect支持如下三个选项:

NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上

PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上

NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去

常用命令如下:

kubectl taint node node0 key1=value1:NoShedule,为node0设置不可调度污点

kubectl taint node node0 key-,将node0上key值为key1的污点移除

kubectl taint node node1 node-role.kubernetes.io/master=:NoSchedule,为kube-master节点设置不可调度污点

kubectl taint node node1 node-role.kubernetes.io/master=PreferNoSchedule,为kube-master节点设置尽量不可调度污点

容忍(Tolerations)

  1. 设置了污点的Node将根据tainteffectNoSchedulePreferNoScheduleNoExecutePod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。

4、Service

  1. Service是对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。

service 有如下四种类型,默认是ClusterIP:

ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP

NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务

LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort

ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名

另外,也可以将已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建 Service 的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。

5、Volume 存储卷

  1. 默认情况下容器的数据是非持久化的,容器消亡以后数据也会跟着丢失,所以Docker提供了Volume机制以便将数据持久化存储。Kubernetes提供了更强大的Volume机制和插件,解决了容器数据持久化以及容器间共享数据的问题。
  2. Kubernetes存储卷的生命周期与Pod绑定
  3. 容器挂掉后Kubelet再次重启容器时,Volume的数据依然还在
  4. Pod删除时,Volume才会清理。数据是否丢失取决于具体的Volume类型,比如emptyDir的数据会丢失,而PV的数据则不会丢

目前Kubernetes主要支持以下Volume类型:

  1. emptyDirPod存在,emptyDir就会存在,容器挂掉不会引起emptyDir目录下的数据丢失,但是pod被删除或者迁移,emptyDir也会被删除
  2. hostPathhostPath允许挂载Node上的文件系统到Pod里面去
  3. NFSNetwork File System):网络文件系统,Kubernetes中通过简单地配置就可以挂载NFSPod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。
  4. glusterfs:同NFS一样是一种网络文件系统,Kubernetes可以将glusterfs挂载到Pod中,并进行永久保存
  5. cephfs:一种分布式网络文件系统,可以挂载到Pod中,并进行永久保存
  6. subpathPod的多个容器使用同一个Volume时,会经常用到
  7. secret:密钥管理,可以将敏感信息进行加密之后保存并挂载到Pod
  8. persistentVolumeClaim:用于将持久化存储(PersistentVolume)挂载到Pod

6、PersistentVolume(PV) 持久化存储卷

  1. PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PersistentVolume (PV)和PersistentVolumeClaim (PVC)提供了方便的持久化卷: PV提供网络存储资源,而PVC请求存储资源并将其挂载到Pod中。

PV的访问模式(accessModes)有三种:

  1. ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个Pod挂载。
  2. ReadOnlyMany(ROX):可以以只读的方式被多个Pod挂载。
  3. ReadWriteMany(RWX):这种存储可以以读写的方式被多个Pod共享。

不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是 访问模式。

PV的回收策略(persistentVolumeReclaimPolicy)也有三种

  1. Retain,不清理保留Volume(需要手动清理)
  2. Recycle,删除数据,即 rm -rf /thevolume/* (只有NFS和HostPath支持)
  3. Delete,删除存储资源

7、Deployment 无状态应用

  1. 一般情况下我们不需要手动创建Pod实例,而是采用更高一层的抽象或定义来管理Pod,针对无状态类型的应用,Kubernetes使用DeloymentController对象与之对应。其典型的应用场景包括:
  2. 定义Deployment来创建PodReplicaSet
  3. 滚动升级和回滚应用
  4. 扩容和缩容
  5. 暂停和继续Deployment

常用的操作命令如下:

  1. kubectl run www image=10.0.0.183:5000/hanker/www:0.0.1 port=8080 生成一个Deployment对象
  2. kubectl get deploymentall-namespaces 查找Deployment
  3. kubectl describe deployment www 查看某个Deployment
  4. kubectl edit deployment www 编辑Deployment定义
  5. kubectl delete deployment www 删除某Deployment
  6. kubectl scale deployment/www replicas=2 扩缩容操作,即修改Deployment下的Pod实例个数
  7. kubectl setimage deployment/nginx-deployment nginx=nginx:1.9.1更新镜像
  8. kubectl rollout undo deployment/nginx-deployment 回滚操作
  9. kubectl rollout status deployment/nginx-deployment 查看回滚进度
  10. kubectl autoscale deployment nginx-deploymentmin=10max=15cpu-percent=80 启用水平伸缩(HPA horizontal pod autoscaling),设置最小、最大实例数量以及目标cpu使用率
  11. kubectl rollout pause deployment/nginx-deployment 暂停更新Deployment
  12. kubectl rollout resume deploy nginx 恢复更新Deployment

更新策略

.spec.strategy 指新的Pod替换旧的Pod的策略,有以下两种类型

RollingUpdate 滚动升级,可以保证应用在升级期间,对外正常提供服务。

Recreate 重建策略,在创建出新的Pod之前会先杀掉所有已存在的Pod。

Deployment和ReplicaSet两者之间的关系

  1. 使用Deployment来创建ReplicaSetReplicaSet在后台创建pod,检查启动状态,看它是成功还是失败。

当执行更新操作时,会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移 动到新的ReplicaSet中

8、StatefulSet 有状态应用

  1. DeploymentsReplicaSets是为无状态服务设计的,那么StatefulSet则是为了有状态服务而设计,其应用场景包括:
  2. 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  3. 稳定的网络标志,即Pod重新调度后其PodNameHostName不变,基于Headless Service(即没有Cluster IPService)来实现
  4. 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作(即从0N-1,在下一个Pod运行之前所有之前的Pod必须都是RunningReady状态),基于init containers来实现

有序收缩,有序删除(即从N-1到0)

支持两种更新策略:

  1. OnDelete:当 .spec.template更新时,并不立即删除旧的Pod,而是等待用户手动删除这些旧Pod后自动创建新Pod。这是默认的更新策略,兼容v1.6版本的行为
  2. RollingUpdate:当 .spec.template 更新时,自动删除旧的Pod并创建新Pod替换。在更新时这些Pod是按逆序的方式进行,依次删除、创建并等待Pod变成Ready状态才进行下一个Pod的更新。

9、DaemonSet 守护进程集

  1. DaemonSet保证在特定或所有Node节点上都运行一个Pod实例,常用来部署一些集群的日志采集、监控或者其他系统管理应用。典型的应用包括:

日志收集,比如fluentd,logstash等

系统监控,比如Prometheus Node Exporter,collectd等

系统程序,比如kube-proxy, kube-dns, glusterd, ceph,ingress-controller等

指定Node节点

DaemonSet会忽略Node的unschedulable状态,有两种方式来指定Pod只运行在指定的Node节点上:

nodeSelector:只调度到匹配指定label的Node上

nodeAffinity:功能更丰富的Node选择器,比如支持集合操作

podAffinity:调度到满足条件的Pod所在的Node上

目前支持两种策略

  1. OnDelete: 默认策略,更新模板后,只有手动删除了旧的Pod后才会创建新的Pod
  2. RollingUpdate: 更新DaemonSet模版后,自动删除旧的Pod并创建新的Pod

10、Ingress

Kubernetes中的负载均衡我们主要用到了以下两种机制:

  1. Service:使用Service提供集群内部的负载均衡,Kube-proxy负责将service请求负载均衡到后端的Pod
  2. Ingress Controller:使用Ingress提供集群外部的负载均衡
  3. ServicePodIP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service所在节点暴露的端口上,然后再由kube-proxy通过边缘路由器将其转发到相关的PodIngress可以给service提供集群外部访问的URL、负载均衡、HTTP路由等,为了配置这些Ingress规则,集群管理员需要部署一个Ingress Controller,它监听Ingressservice的变化,并根据规则配置负载均衡并提供访问入口。

常用的ingress controller:

  1. nginx
  2. traefik
  3. Kong
  4. Openresty

11、Job & CronJob 任务和定时任务

  1. Job负责批量处理短暂的一次性任务 (short lived>CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。

12、HPA(Horizontal Pod Autoscaling) 水平伸缩

  1. Horizontal Pod Autoscaling可以根据CPU、内存使用率或应用自定义metrics自动扩展Pod数量 (支持replication controllerdeploymentreplica set)。

控制管理器默认每隔30s查询metrics的资源使用情况(可以通过 –horizontal-pod-autoscaler-sync-period 修改)

支持三种metrics类型

  1. 预定义metrics(比如PodCPU)以利用率的方式计算
  2. 自定义的Pod metrics,以原始值(raw value)的方式计算
  3. 自定义的object metrics

支持两种metrics查询方式:Heapster和自定义的REST API

支持多metrics

可以通过如下命令创建HPA:kubectl autoscale deployment php-apache–cpu-percent=50–min=1–max=10

13、Service Account

  1. Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的

授权

Service Account为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合RBAC(Role Based Access Control)来为Service Account鉴权,通过定义Role、RoleBinding、ClusterRole、ClusterRoleBinding来对sa进行授权。

14、Secret 密钥

  1. Sercert-密钥解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。有如下三种类型:
  2. Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod /run/secrets/kubernetes.io/serviceaccount 目录中;
  3. Opaque:base64编码格式的Secret,用来存储密码、密钥等;
  4. kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

15、ConfigMap 配置中心

  1. ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMapsecret很类似,但它可以更方便地处理不包含敏感信息的字符串。ConfigMap可以通过三种方式在Pod中使用,三种分别方式为:设置环境变量、设置容器命令行参数以及在Volume中直接挂载文件或目录。

可以使用 kubectl create configmap从文件、目录或者key-value字符串创建等创建 ConfigMap。也可以通过 kubectl create-f value.yaml 创建。

16、Resource Quotas 资源配额

资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。

资源配额有如下类型:

  1. 计算资源,包括cpumemory

cpu, limits.cpu, requests.cpu

memory, limits.memory, requests.memory

存储资源,包括存储资源的总量以及指定storage class的总量

requests.storage:存储资源总量,如500Gi

persistentvolumeclaims:pvc的个数

storageclass.storage.k8s.io/requests.storage

storageclass.storage.k8s.io/persistentvolumeclaims

对象数,即可创建的对象的个数

pods, replicationcontrollers, configmaps, secrets

resourcequotas, persistentvolumeclaims

services, services.loadbalancers, services.nodeports

它的工作原理为:

资源配额应用在Namespace上,并且每个Namespace最多只能有一个 ResourceQuota 对象

开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以 用LimitRange设置默认值)

用户超额后禁止创建新的资源

k8s 基础概念的更多相关文章

  1. Kubernetes 学习2 k8s基础概念

    一.架构描述 1.基本架构 2.pod ,有两类 a.自主式pod 自我管理的,创建之后,任然是需要提交给API Server,API Server接受之后然后由调度器调度到指定的 node节点,由n ...

  2. k8s 基础概念和术语

    Master k8s里的master指的是集群控制节点,每个k8s集群里需要有一个Master节点来负责整个集群的管理和控制,基本k8s所有控制命令都发给它,它负责整个具体的执行过程,后面执行操作基本 ...

  3. K8S基础概念

    一.核心概念 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubernetes的Kubelet.kube ...

  4. zookeeper,及k8s基础概念

    1.描述zookeeper集群中leader,follower,observer几种角色 Zookeeper: 分布式系统:是一个硬件或软件组件分布在网络中的不同的计算机之上,彼此间仅通过消息传递进行 ...

  5. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  6. kubernetes基础概念知多少

    kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...

  7. 【k8s】基础概念 + 工作原理

    工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...

  8. K8s(一)----容器编排工具基础概念

    kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...

  9. Kubernetes(K8s)基础概念 —— 凿壁偷光

    Kubernetes(K8s)基础概念  --  凿壁偷光 K8s是什么:全称 kubernetes  (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...

随机推荐

  1. Spring Security的RBAC数据模型嵌入

    1.简介 ​ 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中,权限与角色相关联,用户通过成 ...

  2. 手写ORM入门篇(一)

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 . ...

  3. 防止用户重复提交表单数据,session方式,js方式

    1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类,在该类中有返回类的对象,生成token的方法 public class TokenUtil { /* *单例设计模式(保 ...

  4. Cascader 级联选择器hover选择效果

    官网例子 <div class="block"> <span class="demonstration">hover 触发子菜单< ...

  5. flask与flask-script的使用

    flask与flask-script的使用 一.安装 pip install Flask-Script 二.简单的使用 # manage.py from flask_script import Man ...

  6. 微服务架构ServiceMesh

    公司用的架构,在此找了资料作为记录复看所用: 什么是Service Mesh? Service Mesh的概念最早是由Buoyant公司的CEO William Morgan在一篇文章里提出,他给出的 ...

  7. Flask 进阶

    OOP 面向对象反射 # __call__方法 # class Foo(object): # def __call__(self, *args, **kwargs): # return "i ...

  8. workermanPHP聊天框架项目windows环境部署实践

    一.官方下载地址: https://www.workerman.net/workerman-chat 二.下载后解压至任意目录,如下图: 三.windows需配置PHP环境变量,如下图: 四.双击st ...

  9. java web添加spring jar 包

    maven依赖: <properties> <spring.version>5.1.7.RELEASE</spring.version> </properti ...

  10. 刷脸支付袭来,WeChat Pay & AliPay争宠,究竟谁能笑到最后?

    移动支付的快速发展,让我们摆脱了对现金的依赖,即使我们出门忘记带现金,那也没关系,我们照样可以通过手机来完成支付.现如今无论是大商场.还是水果摊都支持二维码付款,这也就意味着智慧化的生活正在一步步地向 ...