apiserver 组件是整个系统的对外接口,供客户端和其它组件调用
scheduler 组件负责对集群内部的资源进行调度,相当于“调度室”
etcd 组件是一个键值对的数据库,K8S运行过程中的元数据存储在这里
controllermanager 组件负责管理控制器,相当于“大总管”
kube-proxy 是 Kubernetes 的核心组件,主要负责为Pod对象提供代理
kube-proxy 是实现 Kubernetes Service 的通信与负载均衡机制的重要组件他通过 iptables 或 LVS 实现了负载均衡
CNI 的全称是 Container Network Interface,CNI 是容器网络的 API 接口。
常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。
etcd 是一个键值对的数据库,k8s 在运行过程中的元数据存储在 etcd 中
基于 etcd k8s 解决了服务发现、分布式锁等问题
- init 初始化容器(可选),在主容器之前运行,主要作用是在主容器启动前的准备工作
- postStart容器启动回调(可选),在主容器启动后立即执行,主要作用是在主容器启动时同步完成其他任务
- livenessProbe
存活探测器(可选),用来确定什么时候要重启容器。例如:服务崩溃、应用死锁、无响 应- readinessProbe
就绪探测器(可选),服务需要满足特定的需求才能对外提供。例如:需要同步数据、或等待相关依赖服务启动。如果不能满足就绪条件,既不杀死应用,也不给它发送请求(通过 Kubernetes Service 的流量)。- preStop 容器终止前回调(可选),在主容器终止前最后执行,主要作用是在主容器终止前完成最后的任 务 main container
- 容器主进程(必选),运行容器的核心服务。
[查看标签 ~]# kubectl get 资源对象 --show-labels
[添加标签 ~]# kubectl label 资源对象 资源对象名称 key=value
[删除标签 ~]# kubectl label 资源对象 资源对象名称 key-
查看 pod 状态: kubectl get Pod Pod名称
查看 pod 信息: kubectl describe Pod Pod名称
查看 pod 日志: kubectl logs Pod名称 -c 容器名称
可以为 Pod 配额的资源有 cpu、memory
可以配置 resource.requests 最小资源需求,也可以配置 resource.limits 最大资源限额
Never 不抢占,对于已经调度完成的容器没有影响,优先调度高优先级的Pod
PreemptLowerPriority 抢占,优先调度高优先级的Pod,如果资源不足,杀死优先级低的,保证高优先级的Pod运行
hostPath 是持久卷,卷的本质是使用本地设备,例如磁盘、分区、目录等。
hostPath 卷里面的数据不会随着 Pod的结束而消失。注意:不同节点上的数据可能表现不一致
PV 指的是持久卷(PersistentVolume),PV 是资源的提供者,根据集群的基础设施变化而变化,由K8s集群管理员配置
PVC 指的是持久卷声明(Persistent VolumeClaim),PVC 是资源的使用者,根据业务服务的需求变化 来配置PV/PVC 的引入使K8s集群具备了存储的逻辑抽象能力
1、ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问,这也是默认的ServiceType
2、NodePort: 通过每个节点上的 IP 和静态端口(NodePort)暴露服务
3、LoadBalancer:使用云提供商的负载均衡器向外部暴露服务(一般需要购买和付费)
4、ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容
1、使用 NodePort 服务,映射端口(四层)
2、使用 ingress 服务(七层)
3、使用 LoadBalancer 依赖云供应商,需要购买和付费
nodePort 工作在4层,通过协议、端口、路由转发实现的对外发布服务,可以发布任何服务
Ingress 工作在7层,可以发布 http、https 服务,可以实现 session 粘滞、地址重写、多虚拟主机等功能
系统服务的账户,主要用途为运行在 kubernetes 中的 Pod 程序提供可鉴别的身份和权限
role 普通角色,受限于名称空间,只能在名称空间内部使用
clusterRole 集群角色,可以在整个集群中使用
roleBinding 普通角色授权,可以使用 role 和 clusterRole 进行授权,该授权只在名称空间内有效
clusterRoleBinding 集群角色授权,只能使用 clusterRole 授权,该授权在整个集群中均有效
- ReplicationController # 多副本控制器,不支持集合,已经被 ReplicaSet 和 Deployment 代替
- ReplicaSet # 多副本控制器,支持集合,一般不直接使用,而是由 Deployment 调用
- Deployment # 该控制器由 ReplicaSet、Pod 组成、支持集群扩容缩容、滚动、更新、回滚、自动维护 Pod 可用性及副本数量等功能
- DaemonSet #该控制器无法自定义副本数量,会在每个硬件节点都创建一个 Pod,会自动随同硬件节点数量自动增减 Pod
- Job #单任务控制器,保证一次任务正确执行完成,执行单一任务后结束
- CronJob # 周期性计划任务,按照时间周期创建Job,保留最后三次的执行结果
- HorizontalPodAutoscaler # 可以在集群中基于CPU利用率度量指标实现水平自动缩放POD的数量
- StatefulSet # 该控制器可以结合 Headless服务、存储卷、DNS 等服务,使用稳定的网络标识、存 储、按顺序扩缩容Pod。
Deployment 创建的 Pod 名称、存储都是随机配置,多个 Pod 副本并发创建,无法通过 service 单独访问 Pod 应用
StatefulSet 使用稳定的网络标识、存储、按顺序扩缩容Pod,可以通过 service 单独访问 Pod 应用
Deployment 可以自定义副本数量,同一个节点可以运行多个 Pod 副本 DaemonSet
无法定义副本数量,副本与硬件节点绑定,每节点运行一个 Pod
Job 是单任务控制器,执行任务成功后就结束了,后续不在执行
CronJob 是周期性计划任务,是按时间周期触发的 Job 任务执行
K8s 是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能
单机部署比较简单,使用 Pod 启动容器即可
主从集群较复杂,需要使用 StatefulSet 先启动 master,然你再启动 slave
分片更加复杂,还需要在 InitContainer 中先划分数据槽位,在加入集群
根据不通的业务场景,设置不通的资源限制
比如:对于单个pod可以使用request配置最小需求,可以使用limit设置最大限额
对于很多pod,可以设置limitrange和resourcequota配置全局资源配额
实际使用时,也需要根据实际业务场景结合实际允许的效果,动态调整资源限制。
使用 Deployment控制器创建 Pod,通过 metrics-server 监控Pod资源使用情况,使用
horizontalpodautoscalers 实现基于资源利用率的自动扩容
如果是k8s的自动化部署:可以使用类似kubeasz第三方工具实现一键部署集群。
如果是k8s中容器的自动化部署:编写资源文件,应用资源文件。
代码上线git,jenkins拉取代码,测试代码,编译代码,发布代码到服务器整个流程的自动化部署,其中
jenkins可以调用很多插件完成测试、编译工作,甚至可以定义pipeline语句,将代码封装到容器,推送
镜像到镜像仓库,然后到k8s中启动容器,部署业务。
华为云使用 ELB
阿里云使用SLB
Flannel是覆盖网络,有封包和解包的过程,对CPU等有一定程度的消耗,只适用于简单网络;calico基
于BGP协议,使用Linux 内核来虚拟出vroute,转发数据,没有封包和解包的过程,对CPU等资源消耗
量会更小。
Calico 可以配置基于k8s的的网络安全策略。
Flannel 不支持网络安全策略
Docker commit手动修改容器,保存镜像
Dockerfile是编写容器脚本文件,读取文件自动构建镜像
容器可以使用外部服务
外部服务使用容器,1 使用端口映射,2 绑定宿主机网络 3,使用路由转发
传统业务使用zabbix,监控主机性能和业务指标,创建触发器、设置报警媒介、创建报警动作
容器监控使用Prometheus,监控容器性能和业务指标,配置altermanager,添加报警规则,报警方式
(邮件、钉钉等)
钉钉:创建一个群聊机器人,可以获取token或id,编写python脚本,zabbix设置报警,调用python脚
本,聊天机器人在群中发布报警消息。
微信报警:创建微信企业账户,编写python代码,zabbix调用报警脚本,在微信群发报警消息。
Secret 配置登录的用户名和密码,Pod中使用 imagePullSecrets 调用即可完成自动登录