概述:k8s
知识点
Kubernetes 集群包含:
1 * Master
N * Node
Kubernetes 中部署的最小单位是 pod
一个 pod 中可以包含一个或多个 Docker 容器,通常只有一个容器
Master节点:
- API Server:处理API操作,所有组件都会与API Server连接,组件之间不通常不独立连接,可水平扩展的组件
- Scheduler:调度器,完成调度操作,把一个用户提交的放置于合适的节点,可进行热备
- Controller Manager:控制器,对集群、状态的管理,比如自动对容器修复、自动水平扩张,可进行热备,面向用户的 API 服务、负责维护集群状态
- etcd:分布式存储系统,API Server的所需要的元信息都存储在etcd
Node节点:
- Pod:运行一个或者多个容器,真正运行这些pod的组件是kubelet
- Kubelet:通过api server接收pod运行所需的状态,提交到Container runtime组件中,在os真正创建容器需要的环境[监视指派到它所在Node上的Pod,包括创建、修改、监控、删除]
- Container Runtime:
- Storage Plugin:完成存储操作
- Network Plugin:完成网络操作,提供service network搭网组网,真正完成service组网的组件是kube-proxy,是利用ip table能力来组件kube network
- Kube-proxy:为Pod对象提供代理
Kubernets 分层架构
Ecosystem
Interface layer: client libraries and tools
governance layer: automation and policy enforcement
Application layer: deployment and routing
Nucleus: api and execution
(Container runtime, network plugin,volume plugin, image registry, cloud provider, identity provider)
- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
- 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
- 接口层:kubectl命令行工具、客户端SDK以及集群联邦
- 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
kubelet: kubelet负责管理pods和它们上面的容器,images镜像、volumes、etc。
kube-proxy:每一个节点也运行一个简单的网络代理和负载均衡
etcd:所有master的持续状态都存在etcd的一个实例中。这可以很好地存储配置数据
Scheduler:调度器把未调度的pod通过binding api绑定到节点上。调度器是可插拔的,并且我们期待支持多集群的调度,未来甚至希望可以支持用户自定义的调度器。
工作负载 Workload
类型 描述 Deployment 声明了 Pod 的模板和控制 Pod 的运行策略,适用于部署无状态的应用程序。您可以根据业务需求,对 Deployment 中运行的 Pod 的副本数、调度策略、更新策略等进行声明。 StatefulSet 主要用于管理有状态的应用,创建的 Pod 拥有根据规范创建的持久型标识符。Pod 迁移或销毁重启后,标识符仍会保留。在需要持久化存储时,您可以通过标识符对存储卷进行一一对应。如果应用程序不需要持久的标识符,建议您使用 Deployment 部署应用程序。 固定 Pod IP 类型 StatefulSet 腾讯云容器服务提供扩展 StatefulSet 固定 IP 的能力,该类型的 StatefulSet 创建的 Pod 将通过弹性网卡分配真实的私有网络内的 IP 地址。腾讯云容器服务 VPC-CNI 的插件负责 IP 分配,当 Pod 重启或迁移,可实现 IP 地址不变。 DaemonSet 主要用于部署常驻集群内的后台程序,例如节点的日志采集。DaemonSet 保证在所有或部分节点上均运行指定的 Pod。新节点添加到集群内时,也会有自动部署 Pod。节点被移除集群后,Pod 将自动回收。 Job Job 控制器会创建 1 - N 个 Pod,这些 Pod 按照运行规则运行,直至运行结束。 CronJob 根据指定的预定计划周期性地运行一个 Job。 配置项
- ConfigMap:key-value 类型的键值对,通过 ConfigMap 您可以将配置和运行的镜像进行解耦,使得应用程序有更强的移植性。
- Secret:key-value 类型的键值对,用于存储密码、令牌、密钥等敏感信息,降低直接对外暴露的风险。
存储卷
存储卷(Volume)的核心只是一个目录,其中可能包含一些数据,Pod 中的容器可以访问该目录。存储卷的生命周期与 Pod 相同,并且长于该 Pod 下运行的容器,通常会在容器重启时保留数据。
PersistentVolume(PV)
集群内的存储资源。例如,节点是集群的资源。PV 独立于 Pod 的生命周期,根据不同的 StorageClass 类型创建不同类型的 PV。
PersistentVolumeClaim(PVC)
集群内的存储请求。例如,PV 是 Pod 使用节点资源,PVC 则声明使用 PV 资源。当 PV 资源不足时,PVC 也可以动态创建 PV。
- StorageClass
描述存储的类型,集群管理员可以为集群定义不同的存储类别,容器服务当前仅支持私有网络,不支持基础网络。
- Volume
- 声明在Pod中容器可访问的文件目录;
- 可以被挂载在Pod中一个或者多个容器指定路径下;
- Deployment
- 定义一组pod的副本数目、版本等
- 通过控制器(Controller)维持pod的数目:自动恢复失败的pod
- 通过控制器以指定的策略控制版本:滚动升级、重新生成、会滚等
- Service
- 提供访问一个或者多个Pod实例的稳定访问地址(可以避免用户访问具体Pod对应各自的IP address,对于外部用户而言仅了解单个IP address,当某个Pod崩后可自动切换至另一Pod)
- 支持多种访问方式实现
- ClusterIP
- NodePort
- LoadBalancer
- Namespaces
- 一个集群内部的逻辑隔离机制(鉴权、资源额度)
- 每一个资源(比如pod、deployment、service)都属于一个namespace
- 同一个namespace中资源命名唯一
- 不同namespace资源可重名
- API - Label
- 一组key:value
- 可以被selector所查询,比如select color=red
- 资源集合默认表达形式:例如service对应的一组pod
kubelet
:在集群中的每个节点上用来启动 pod 和容器等。kubectl
:用来与集群通信的命令行工具。
docker实践
- 编写Dockerfile
1 | FROM nginx |
- 构建Docker镜像
1 | docker build -t docker-demo:0.1 . |
- 查看Docker镜像
1 | docker image ls |
- 运行Docker镜像
1 | docker run --name docker-demo -d -p 8080:80 docker-demo:0.1 |
- 查看容器运行状态
1 | docker container ps |
- 容器清理
1 | docker container stop docker-demo |
安装 Kubernetes
- kubectl k8s的命令后客户端
- 本地运行k8s环境的minikube
- 给minikube使用的虚拟化引擎xhyve
1 | brew install kubectl |
- minikube的默认虚拟化引擎是virtualbox,xhyve 是一个更轻量、性能更好的替代,安装后需要把所有者改为
root:wheel
,并把 setuid 权限打开
1 | # 如果需要使用xhyve作为虚拟化引擎 |
- 启动 Minikube
1 | minikube start |
如果你在第一次启动 Minikube 时遇到错误或被中断,后面重试仍然失败时,可以尝试运行 minikube delete
把集群删除,重新来过。
- Minikube 启动时会自动配置 kubectl,把它指向 Minikube 提供的 Kubernetes API 服务。可以用下面的命令确认:
1 | kubectl config current-context |