Kubernetes学习笔记

K8S笔记

建立service步骤

  1. 建立rc副本文件,并create,实时监控pods并控制pods;
  2. 建立svc定义文件,创建service对象,动态分配Cluster IP;
  3. (服务rc未找到可以当前可用)解决办法:手动生成api令牌openssl genrsa -out /tmp/serviceaccount.ket 2048在/etc/kubernetes/apiserver修改KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key"在/etc/kubernetes/controller-manager修改KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/tmp/serviceaccount.key"重启kube-apiserver和kube-controller-manager

kubernetes结构

  • Master集群控制节点,API Server(集群控制入口)、Controller Manager(资源控制中心)、Scheduler(资源调度)、etcd(资源对象数据存储);
  • Node工作负载节点(Docker容器)(宕机任务自动转移),kubelet(Pod对应容器的创建、启停,与Master协作实现集群管理,动态自行注册、定时汇报情报)、kube-proxy(实现service通信与负载均衡机制)、Docker引擎(本机容器创建与管理);
  • Pod根容器Pause容器,包含一个或多个用户业务容器,业务容器共享Pause容器IP、共享Volume,简化密切关联的业务容器之间的通信与文件共享,拥有唯一Pod IP,Pods间可直接TCP/IP通信,普通Pod注册在etcd供master调度,静态Pod存放在Node具体文件不允许调度,Pod内某一个服务的对外通信地址Endpoint(Pod IP + 容器port),Pod Volume被各个容器挂载在自己的Volume上,Event事件记录(事件产生、重现时间、重复次数、发起者、类型、导致原因,Pod与Node都有),Pod设置资源配额(CPU(core 1/1000~m)与Memory(内存字节数))(使用Requests最小申请量和limit最大允许量设定);
  • Lable标签,k-v键值对,附加到各种资源对象上(Node、Pod、Service、RC),常用类型(版本、环境、架构、分区、质量管控),可通过Lable Selector查询筛选资源对象(kube-controller通过RC上的Lable Selector筛选监控的Pod数量、kube-proxy通过Service上的Lable Selector建立Service到Pod的请求转发路由表、kube-scheduler对Node的定向调度);
  • Replication Controller副本控制器,包括(Pod期待的副本数、筛选目标Pod的Lable Selector、Pod副本数小于预期数量时创建新Pod 的模板),controller manager得到RC通知定期巡检目标Pod(实现用户集群应用的高可用),Replica Sets支持基于集合的Lable Selector,改变RC内Pod模板的镜像版本实现滚动升级;
  • Deployment,更好解决Pod的编排问题,内部引用Replica Sets实现目的,可回滚、在Replica Sets基础上增加扩展、升级等新功能;
  • Horizontal Pod Autoscaler(Pod横向自动扩容),通过追踪分析RC控制的所有目标Pod的负载变化情况确定针对性调整目标Pod的副本数;
  • StatefulSet(RC、Deployment的特殊变种),每个Pod都有稳定唯一的网络标识、Pod启停顺序受控、采用稳定的持久化存储卷;
  • Service核心资源对象,kube-proxy作为软件负载均衡器负责把对Service的请求转发到后端的某个Pod实例上;
  • Volume存储卷,Kubernetes的Volume定义在Pod上,被一个Pod的多个容器挂载到不同具体的文件目录下,支持多种类型的文件系统:emptyDir(初始内容为空,多容器共享目录,作为临时空间)、hostPath(宿主机的高速文件系统)(日志文件需要永久保存、容器内部应用需要直接访问Docker的文件系统)、公有云存储、NFS网络文件系统等
  • PV(Persistent Volume),网络存储不属于任何Node但可以在每个Node访问,独立于Pod定义,使用定义PVC对象申请PV对象,状态(Available、Bound、Released、Failed);
  • Namespace命名空间,实现多租户的资源隔离,形成逻辑上的分组;
  • Annotation注解,使用k-v键值对定义,为用户任意定义的附加信息便于外部工具进行查找,包括(build、release、Docker镜像等信息、日志库、监控库、分析库等资源库、程序调试工具信息、团队联系信息)

掌握内容

资源清单:掌握资源清单的语法、编写Pod、掌握Pod的生命周期
Pod控制器:掌握各种控制器的特点以及使用定义方式
服务分类:有状态服务、无状态服务
服务发现:掌握SVC远原理及其构建方式
存储:掌握多种存储类型的特点、在不同环境中选择合适的存储方案
调度器:掌握调度器原理、根据要求把Pod定义到想要的节点运行
安全:集群的认证、鉴权、访问控制原理及其流程
HELM:掌握HELM原理、HELM模版自定义、HELM部署常用插件
运维:修改Kubeadm达到延长证书可用期限、构建高可用的Kubernetes集群

组件说明

APIserver:服务访问统一入口
CrontrollerManager:维持副本期望数目
Scheduler:介绍任务、选择合适节点分配任务
etcd:持久化存储K8S集群信息
Kubelet:直接和容器引擎交互实现容器生命周期管理
Kube-proxy:写入规则至IPTABLES、IPVS实现服务映射访问
COREDNS:为集群中SVC创建域名IP对应关系解析
DASHBOARD:给K8S集群提供一个B/S结构访问体系
FEDETATION:跨集群中心多K8S统一管理功能
PROMETHEUS:K8S集群的监控
ELK:K8S集群日志统一分析接入平台

网络通讯

各Pod之间的通讯:同一个Pod内部使用localhost、不同之间的Pod将Pod IP和Node IP关联通过Flannel网桥、同一台机器的不同Pod使用Docker网桥转发请求
ETCD Flannel提供说明:存储管理Flannel可分配的IP地址段资源、监控ETCD中每个Pod的实际地址建立维护Pod节点路由表
Pod至Service的网络:为ipables维护转发(LVS负载均衡器维护转发)
Pod到外网:转发数据包到宿主机的网卡,宿主机网卡路由选择,iptables执行Masquerade源IP转换为宿主网卡IP,向外网发送请求
外网访问Pod:service node port

资源清单

K8S中的资源

集群资源分类

名称空间级别

工作负载型:Pod、RS、Deployment、StatefulSet、DaemonSet、Job、CronJob
服务发现以及负载均衡型:Service、Ingress
配置与存储型:Volume、CSI
特殊类型存储:ConfigMap、Secret、DownwardAPI

集群级别

Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding

元数据型

HPA、PodTemplate、LimitRange

常用字段

apiVersion String、kind String、metadata Object(name、namespace)、Spec Object(containers[](name、image、imagePullPoicy、command[]、args[]、workingDir、volume、port[](name、containerPort、hostPort、protocol)、env(name、value)、resource)、nodeSelector、imagePullSecrets、hostNetwork)

容器生命周期

Init容器

总是运行到成功为止,每个Init必须在下一个Init容器启动之前完成。
具有与应用容器分离的单独镜像,它们包含并运行实用工具,包含使用工具和定制化代码安装,使用Linux Namespace(具有Secret访问权限),在应用容器启动之前运行完成。
按顺序在网络和数据卷初始化之后启动,在下一个容器启动之前退出,更改Init容器的Image等价于重启Pod。

探针

由kubelet对容器执行的定期诊断,调用容器实现的Handler,三种类型处理处理程序(ExecAction容器内执行指定命令、TCPSocketAction对指定端口容器的IP地址进行TCP检查、HTTPGetAction对执行端口和容器IP地址执行HTTPGet请求)
livenessProbe:指示容器是否在运行,存活探测
readinessProbe:指示容器是否准备好服务请求

Start Stop

lifecycle:postStart preStop

Pod phase状态

Pending挂起、Running运行中、Succeeded成功、Failed失败、Unknown未知

资源控制器

Pod(自主式Pod、控制器管理Pod)

RC和RS

RS相较于RC支持Selector标签,命令式create。

Deployment

声明式apply,包含RS,支持滚动升级、回滚、扩容缩容、暂停继续Deloyment。

DaemonSet

确保Node运行一个Pod的副本,例子(日志、监控代理)。

Job

批处理任务,仅执行一次的任务,保证批处理任务的一个或多个Pod成功结束。

CronJob

基于时间,给定时间点运行一次,周期性在给定时间点运行

StatefulSet

保证部署和scale的顺序,稳定化持久存储(基于PVC),稳定网络标识(Headless Service),有序部署有序扩展(init C),有序收缩有序删除。

Horizon Pod Autoscaling

Pod水平自动缩放,提升集群整体资源利用率

Service

通过Lable Selector选择一组Pod(微服务),轮询访问。
提供四层负载均衡能力。

SVC类型

  • ClusterIP:默认类型,自动分配仅Cluster内部可以访问的虚拟IP
  • NodePort:在ClusterIp基础上为Service在每台机器上绑定一个端口
  • LoadBalancer:在NodePort基础上,借助cloud provider创建外部负载均衡器,将请求转发到NodePort
  • ExternalName:将集群外部的服务引入到集群内部直接使用

组件责任

APIserver:监听服务和端点
kube-proxy:监控的工具,写入iptables规则,重定位代理端口
iptables:客户端访问Pod节点

代理模式的分类

userspace代理模式

必须经过kube-proxy进行网络通信

iptables代理模式

不需要经过kube-proxy,直接经过iptables通信

ipvs代理模式

kube-proxy监控kubenetes的Service对象和Endpoints,调用netlink接口相应创建ipvs规则并定期同步。

Ingress

外部HTTPS的访问媒介,使用nginx进行中介。

存储

configMap

configMap API提供向容器中注入配置信息的机制,用来保存单个属性、整个配置文件或者JSON二进制大对象。
创建方式:目录创建、使用文件创建、使用字面值创建。
热更新特性,configMap更新后滚动更新Pod。
更新configMap后,使用该configMap挂载的Env不会更新,Volume中的数据需要一段时间后才会更新。

Secret

Secret解决了密码、token、密钥等敏感数据的配置问题,不需要把敏感数据暴露到镜像或者Pod Spec中,Secret以Volume或者环境变量方式使用。
类型:Service Acount(访问Kubernetes API)、Opaque(base64编码格式)、kubernetes.io(存储私有仓库的认证信息)

volume

共享文件、存储持久。

  • emptyDir:暂存空间(例如用于基于磁盘的合并排序)、用作长时间计算奔溃恢复时的检查点、Web服务器容器提取数据时保存内容管理器容器提取的文件
  • hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中,运行需要访问docker内部的容器、在容器中运行cAdvisor,每个节点上的文件都不同,具有相同配置的Pod在不同节点的行为会有所不同,kubernetes按照计划添加资源感知调度无法考虑hostPath使用的资源,在底层主机创建的文件或目录只能由root写入,需要在特权容器中以root身份运行进程或修改主机上的文件权限以便写入hostPath卷

Persistent Volume

  • PV:持久卷,由管理员设置的存储,是群集的一部分,是集群中的资源,是Volume之类的卷插件,具有独立于使用PV的Pod的生命周期。
  • PVC:是用户存储的请求,PVC消耗PV资源。
  • 静态PV:带有可供群集用户使用的实际存储的细节,存在于kubernetes API中用于消费。
  • 动态PV:云存储动态申请资源,技术不成熟。
  • 绑定:Master中的控制环路监视新的PVC,寻找匹配的PV,将它们绑定在一起,是一对一的映射。
  • 持久化卷声明的保护:启用PVC保护alpha功能,PVC延迟于Pod进行删除。
  • PV访问模式:可以以资源提供者支持的任何方式挂载到主机上(单个节点读写、多个节点只读、多个节点读写)
  • 回收策略:手动回收(保留)、基本擦除(回收)、关联的存储资产(删除)
  • 状态:可用(未被声明绑定)、已绑定(已被声明绑定)、已释放(声明被删除,资源未被重新声明)、失败(自动回收失败)
  • StatefulSet:使用Headless服务控制Pod域名、需要手动删除PVC来删除PV、启停顺序(有序部署、有序删除、有序扩展)、使用场景(稳定的持久化存储、稳定的网络标识符(域名)、有序部署、有序收缩)

集群调度

调度说明

Scheduler作为调度器,将定义的Pod分配到集群的节点上,作为单独程序运行,一直监听API server获取NodeName为空的Pod,对每个Pod创建一个binding表明分配的节点。

  • 公平:保证每个节点都能被分配资源
  • 资源高效利用:集群所有资源最大化被利用
  • 效率:调度性能好,尽快对大批量Pod完成调度工作
  • 灵活:允许用户根据自己的需求控制调度的逻辑

调度过程

过滤掉不满足条件的节点(predicate),对节点按照优先级排序(priority),选择优先级最高的节点
predicate算法:剩余资源是否满足、节点名称是否匹配、节点使用port和pod申请port是否冲突、指定lable是否匹配、已经挂载的volume和pod指定的volume不冲突(除只读外)
无合适节点,Pod一直处于pending状态。优先级由键值对表示(优先级名称:权重)。

调度亲和性

软策略和硬策略

  • 节点亲和性(lable包含关系、比较范围关系、是否存在)
  • Pod亲和性(与制定的Pod是否在同一拓扑域)Pod之间关系

污点和容忍

Taint污点使得Node排斥一类特定的Pod,Toleration容忍存在于Pod之上则说明可以被调度到有相应Taint的节点。

Taint

kubectl taint设置污点

  • NoScheduler不会将该Pod调度到有Taint的Node
  • PreferNoScheduler尽量避免将Pod调度到有Taint的Node
  • NoExecute同NoScheduler,但会驱逐pod

Tolerations

容忍Taint的存在,不排斥调度到该Node上,key、value、effect与Taint保持一致,tolerationSecond描述Pod需要被驱逐时可以继续保留运行的时间。

固定节点

强制匹配,跳过Scheduler调度,根据节点名称选择、根据标签选择

安全

机制说明

安全机制围绕保护API Server设计。认证->鉴权->准入控制。

认证

  • HTTP token方式认证:通过一个token识别合法用户,存储在API Server能访问到的文件中,客户端发起API调用请求时,需要在HTTP Header里加入Token。
  • HTTP Base认证:用户名+密码使用Base64算法编码放在HTTP Request的Heather Authorization域中发送给服务端,服务端进行解码。
  • HTTPS证书认证:基于CA根证书签名的客户端身份认证方式。双向HTTPS私钥认证,使用集群内部的CA架构。

HTTPS认证内容

两种类型:Kubernetes组件对API Server的访问(kubectl、Controller Manager、Scheduler、kubelet、kube-proxy)、Kubernetes管理的Pod对容器的访问。
安全性说明:Master上的组件使用本地非安全端口地址访问API Server、其余节点组件使用HTTPS双向认证。
证书签发:手动签发(通过k8s集群的根CA签发HTTPS证书)、自动签发(kubelet首次访问API Server使用token做认证,认证通过后Controller Manager为kubelet生成证书,之后访问采用证书认证)

  • kubeconfig:包含集群参数(CA证书、API Server地址),客户端参数(生成的证书和私钥),集群context信息(集群名称、用户名)。Kubernetes组件启动时指定不同的kubeconfig文件切换到不同的集群。
  • ServiceAccount:Pod中容器访问API Server,包含Token(使用APIServer私钥签名的Json web token,用于访问时服务端认证)、ca.crt(根证书,验证APIServer发送的证书)、namespace(标识作用域名空间),使用Secret保存。
    kubectl和kube-proxy手动签发,kubelet自动签发

鉴权

认证确认通信双方可信,鉴权确定请求方的资源权限

  • ABAC:基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  • Webbook:调用外部REST服务对用户进行授权
  • RBAC:基于角色的访问控制(对集群中资源和非资源均拥有完整的覆盖、整个RBAC完全由几个API对象完成,同其他API对象可以用kubectl或API进行操作、可以在运行时进行调整无需重启APIServer),API资源对象(Role、ClusterRole、RoleBinding、ClusterRoleBinding)均可通过kubectl与API操作。

RBAC内容

  • Role and ClusterRole:权限只能累加,Role可以定义在一个namespace中,跨namespace可以创建ClusterRole。ClusterRole是集群级别,可以用于(集群级别资源控制、非资源型endpoints访问、所有命名空间资源控制)
  • binding:RoleBinding包含一组权限列表subjects(不同形式的待授予权限资源类型users、groups、service accounts),适用于某个命名空间内授权,ClusterRolebinding适用于集群范围内授权。

准入控制

API Server的插件集合,通过添加不同的插件实现额外的准入控制规则。

Helm

包管理工具,安装服务,通过打包的方式支持版本管理和控制,很大程度简化了Kubernetes应用的部署和管理。
本质是K8S的应用管理(Deployment、Service等)可配置,能动态生成,通过动态生成yaml资源清单文件,然后调用kubectl自动执行K8S资源部署。
是部署环境的流程封装。chart(创建一个应用的信息集合,包括各种Kubernetes对象的配置模版、参数定义、依赖关系、文档说明等,是应用部署的自包含逻辑单元,类别apt、yum软件安装包)、release(是chart的运行实例,代表了一个正在运行的应用,chart被安装到Kubernetes集群后生成一个release,可以多次安装到同一个集群,chart每次安装都是一个release)
包含两个组件(Helm客户端和Tiller服务器),通过gRPC协议交互,Helm客户端负责chart和release的创建和管理以及和Tiller的交互。Tiller服务器运行在Kubernetes集群中,它会处理Helm客户端的请求,与Kubernetes API Server进行交互。

构建高可用k8s集群

使用virtual IP代理,API server结合Nginx形成负载均衡分发器,反向代理API Server,集群自动配置高可用ETCD,scheduler和controller manager休眠机制(一个工作、其余休眠),kubelet和proxy不做高可用维护。

你可能感兴趣的:(kubernetes,docker)