k8s是什么?
网上对 k8s 含糊不清,以下是我对其的理解,分享给大家
背景介绍:假设公司有一个超大的 web 应用,其中有很多服务,比如 mysql、redis、日志收集服务、web 服务等等,每个服务都可以用一个容器单独运行起来。突然来了泼天的流量,这个应用火了!,大量的用户请求造成了极大的数据库读写压力,原来一个容器可以扛住,现在快扛不住了,有没有一种办法,可以根据请求量多少自动增加容器数量来应对这样的读写压力来避免这样的问题,然后用户量请求下来的时候又恢复到原来的梳理呢?嗯!这时 k8s 就闪亮登场!
k8s 是什么?
全程 Kubernetes,是一个开源的容器编排引擎,用来对容器化应用进行自动部署、扩缩和管理。
更大白话一点,它介于客户端和服务端之间,通过策略,协调和管理多个应用服务(容器),只需要一个 yaml 文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还能让它们挂了自动重启,自动扩缩容。
k8s 怎么管理容器?
那就不得不提 k8s 的内部实现,它包括两个部分,master 节点和 work 节点,每个节点可视为一个物理机,具体而言:
master 节点
用于存储集群的所有数据、常规的 api 请求操作、后台任务调度、pod 的调度。work 节点
用于管理容器给容器提供工作环境。
再为具体一点:
Master 节点(控制台)用于管理容器:
- API Server:处理 REST 操作,提供集群的管理接口。
- etcd:分布式键值存储,用于存储集群的所有数据。
- Controller Manager:负责集群的常规后台任务。
- Scheduler:负责将 Pod 调度到合适的节点上。
Worker 节点用于运行容器:
- Kubelet:负责与 Master 节点通信,管理 Pod 的生命周期。
- Kube-proxy:负责网络代理和负载均衡。
- Container Runtime:如 Docker、containerd,负责运行容器。
k8s 怎么工作?
以前我们的服务会上传到服务器,用户请求经过服务器上的 nginx 转发到我们服务暴露的接口上进行处理,
现在我们会将业务代码先打包成镜像,然后基于它创建容器并统一交给 k8s 进行管理,当用户请求来临,先通过 k8s 对请求进行转发,k8s 会在自己的master节点(控制台)查找到该请求应该访问的哪一个工作节点的哪一个 pod, 然后找到可以处理这个请求的容器,同时 k8s 会根据请求量大小,通过自身预设的规则和算法自动创建 pod 资源和销毁 pod 资源、迁移。
K8s 怎么使用?
先写一个 yaml 文件,这个文件用来告诉 k8s 应该创建和管理哪容器,容器上的文件映射、端口映射、持久化位置、最多可以有多少个副本、可占有的资源等等,这个文件将通过 kubectl 命令行工具执行:kubectl apply -f xx.yaml
,k8s 控制台会暴露接口让 kubectl 对齐操控。
下面的概率会在撰写 yaml 文件时经常接触到,建议熟悉并背诵:
- namespace:虚拟集群,将 k8s 集群的资源分隔
- node:工作节点,通常是一个物理服务器,pod 的载体,一个 pod 只能工作在一个 node
- deployment:管理 Pod 副本的控制器,k8s 会在集群中保持制定数量的 Pod 副本
- service:暴露应用的抽象对象,通过稳定的 IP 地址和 DNS 来访问 pod
- pod:k8s 最小单位,可以有多个容器,共同组成一套服务
k8s 的本质是什么?
用户请求到实际应用的中间层,简化服务的部署运维流程,它可以作为代理对请求进行转发,也可以分布式管理实际应用,使业务更加高可用更好管理,节省复杂的人工管理。