参考:黑马程序员K8S全套教程
知识点概括
- pod:控制器的特点以及使用定义方式
- 服务发现:svc原理以及构建方式
- 存储:多种存储类型的特点
- 调度器: 原理,根据需求把pod定义到想到的节点运行
- 安全:集群的认证 鉴权 访问控制 原理及其流程
- HELM: 类比linux yum,原理
- 运维: 修改Kubeadm(搭建k8s集群的工作) 延长证书可用期限更高,构建高可用的k8s集群
附: 服务分类:有状态服务(DBMS)和无状态服务(APACHE)
组件
- APISERVER:所有服务访问统一入口
- CrontrollerManager:维持副本期望数目
- Scheduler:负责介绍人物,选择合适的节点进行分配任务
- ETCD: 键值对数据库 储存K8S集群所有重要信息(持久化)
- Kubelet: 直接跟容器引擎交互实现容器的生命周期管理
- Kube-proxt:负责写入规则至IPTABLES,IPVS 实现服务映射访问的
- (插件)CoreDNS:为急群众的SVC中创建一个域名IP对应关系解析
- (插件)DASHBOARD:给k8s集群提供B/S结构访问体系
- (插件)INGRESS CONTROLLER:官方只实现4层代理,INGRESS可以实现7层代理
- (插件)FEDETATION:提供一个可以跨集群中文多K8S统一管理功能
- (插件)PROMETHEUS:提供K8S集群的监控能力
- (插件)ELK:提供K8S集群日志统一分析接入平台
知识点详解
资源管理方式
pod相关

注意点:
- pod如果被delete,然后被deployment拉起之后,一般内部的虚拟ip会发生改变
- 访问容器中的程序需要使用的是podIp:containerPort
- 启动时最好加上参数–record,这个命令可以记录历史记录等
label相关

deployment相关

service相关
service的type为ClusterIP的话,只能在k8s的node节点上访问到(内部集群可访问)。为NodePort的话,在外部也可访问。
cluster

NodePort

pod详解
每个pod都会有一个根容器,叫做Pause容器。一般用于①评估整个pod的健康状态。②在根容器上设置ip地址,其他容器通过此ip实现pod内部的网络通信。
pod的资源清单(yaml配置参数详解)
可以直接用kubectl explain pod命令来查看
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,资源类型,例如 Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #Pod所属的命名空间,默认为"default"
labels: #自定义标签列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
pod生命周期

- pod的创建过程
- pod的前置环境测试:在initContainers中写入测试代码,当initContainers中的command执行成功时才会去创建pod
- pod的环境搭建好了之后,需要去进行一些测试,保证环境满足程序运行的条件。一般写在lifecycle.postStart里(有Exec命令,TCPSocket方式,HTTPGet命令)
- 探测:存活性探测(是否正常运行,否时会重启容器)和就绪性探测(是否可接收请求,否时会从负载均衡中摘取)。同样有有Exec命令,TCPSocket方式,HTTPGet命令。
- pod在停止前需要做的操作写在lifecycel.preStop中。
pod的调度

pod控制器

-
Deployment。 一般无状态服务使用Deployment。Deployment会生成rs并且进行管理。Deployment可以做到动态的扩缩容(scale命令),版本回退(rollout)等。 例如: 后端,前端这种无状态服务。
-
StatefulSet 一般有状态服务使用StatefulSet。Kubernetes 中的 StatefulSet 控制器并不维护历史版本,它主要负责管理有状态应用程序的部署和更新,而不是像 Deployment 控制器那样维护版本历史记录。 例如: redis, mysql这种db类型的有状态服务。
-
HPA
使用HPA需要使用到metrics-server启动的server,会在k8s的系统ns下启动。# 通过yaml文件启动 kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
-
DaemonSet 一般用于日志收集
service(4层网络层路由负载)详解
5种模式:ClusterIP(内部),NodePort(外部),HeadLiness(不使用,转而使用自己的内部LB),LoadBalancer(不使用,转而使用自己的外部LB),ExternalName(把外部的服务引用到内部)
kube-proxy可选模式
- userspace模式: 请求转发到kube-proxy中,然后由kube-proxy挑选pod分发请求。稳定,但增加了数据拷贝而性能较低。
- iptables模式: kube-proxy生成iptables规则,然后请求直接通过已经生成了的iptables规则转发到pod上。效率高,但BL策略不灵活,在后端pod不可用时无法重试。
- ipvs模式(常用):必须安装ipvs内核模块才能用,否则降级为iptables。
kube-proxy生成的endpoints
由yaml配置文件根据selector生成的

Ingress(7层应用层负载均衡)详解
类比进行反向代理的nginx,可以进行http代理或者https代理。
https
http的基础上,指定secretName字段就可以了
数据存储
即有状态服务中的数据持久化。
- 简单存储:EmptyDir,HostPath,NFS
- 高级存储:PV,PVC
- 配置存储:ConfigMap,Secret
简单存储
EmptyDir
临时的存储空间,也用于容器间的数据共享。在pod被销毁时,该目录会被永久删除。
HostPath
直接挂载到宿主机的一个实际目录里。在pod被摧毁时,该目录会维持原样。yaml文件中的字段:HostPath
NFS
其实就是HostPath上,把目录挂载到NFS(云存储)上而已。
高级存储(推荐使用)
屏蔽底层存储技术,引入pv和pvc概念直接使用。
pv(集群资源)&pvc(namespace资源)
一般pv是由管理员创建的,创建后等待用户创建pvc来绑定pv使用。
pv的生命周期状态:
- Available(可用):可用,还没跟任何PVC绑定
- Bound(绑定):已被PVC绑定
- Released(已释放):PVC已被删除,但是资源未被集群重新声明
- Failed(失败):PV的自动回收失败
pv于pvc的生命周期图
配置存储
是一种比较特殊的存储卷,主要作用是用来存储配置信息的。
明文密码(ConfigMap)
证书密文密码(Secret)
安全认证相关
认证管理
- HTTP BASE认证
- HTTP Token认证
- HTTPS证书认证
授权管理
- AlwaysDeny:拒绝所有请求,一般用于测试
- AlwaysAllow:运行接收所有请求,相当于集群不需要所有授权流程
- RBAC:基于角色的访问控制
- …
准入控制
各个API,哪个可以设置什么权限可以参考官方文档