1.部署方式
传统部署、虚拟化部署、容器化部署
传统部署:
应用直接部署在物理机上,技术相对简单,不能为应用程序定义资源使用边界,容易发生冲突,很难合理分配资源,造成资源浪费,且应用程序之间容易相互影响,
虚拟化部署:
在一台物理机上运行多个操作系统,每个虚拟机都是独立的环境,一定程度上解决了应用程序冲突的问题,但是在一台物理机上增加了两个操作系统,操作系统本身相对臃肿,浪费部分资源。
容器化部署:
容器内的应用程序所需的硬件资源由容器提供,而不是硬件!每个容器容器有拥有自己独立的文件系统、CPU、内存、进程空间等等。注意一个pod里包含一个或多个容器!
2.容器编排
容器管理问题统称为长期编排,市面上出现一些容器编排根据,Docker SWarm、Mesos、Kubernetes。市场占有率2019年k8s占77%,现今k8s已经一家独大。
3.k8s功能
k8s本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来读节点中的容器进行管理。目的是为了实现资源管理的自动化。
自我修复:一旦某个容器奔溃、能够在1s内迅速启动新的容器。
弹性伸缩:可以根据需要,自动集群中正在运行的容器数量进行调整。
服务发现:服务通过自动发现的形式找到它所依赖的服务。
负载均衡:一个服务启动多个容器,能够自动实现请求的负载均衡。
版本回退:如果发布新版本的程序有问题,可以立即回退到原来的版本。
存储编排:可以根据容器自身需求自动创建存储卷。
4.k8s组件
集群由master和node节点组成,两者由不同的小组件构成。
Master节点:
ApiServe:
资源操作的唯一入口,接受用户输入的命令,提供认证、授权、API注册和发现等机制。
Scheduler:
负责集群资源调度,按照预定的调度策略将Pod调度到相应的node的节点上。
ControllerManager:
负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新。
Node节点:
Kubellet:
负责维护容器的 生命周期,即通过控制docker、创建、更新、销毁容器。
KubeProxy:
负责提供集群内部的服务发现和负载均衡。
Docker:
负责节点上的各种操作,本质上多个pod就是用了docker。
以部署nginx为例子,讲解部署过程中的每一个细节,每一个组件的工作内容。
1.一旦k8s环境启动后,master和node都会将自身的信息存储到etcd数据库中
2.一个nginx的安装请求首先被发送到master的ApiSever组件。
3.ApiSever组件会调用scheduler组件来决定到底应该吧这个组件安装到那个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定算法进行选择,并将选中的结果告诉ApiServe。
4.ApiServe调用controller-manager去调度node节点安装nginx服务。
5.Kubelet接收到指令后,会通知Docker,然后由Docker来启动一个nginx的pod,pod是k8s的最小操作单元,容器必须跑在pod中。
6.至此,一个nginx服务就运行成功了,如果需访问nginx,就需通过kube-proxy产生访问的代理,这样外界用户就可以访问集群中的nginx。
5.重要概念
Master:集群控制节点,每个集群需要至少一个master节点负贡集群的管控
Node:工作负载节点,山master分配容需到这些nodc工作节点上,然后nodc节点上的docker负责容器的运行。
Pod: kubernetes的最小控制单元, 容器都是运行在pod中的,一个个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理。比如启动pod、停止pod、缩pod的数量等等
Service: pod划外服务的统一入口,下面可以维护者同一类的多个pod。
Label:标签,用于对pod进行分美,同类pod会拥有相同的标签。
NameSpace:命名空间,用来隔离pod的运行环境。
6.部署工作详细过程
执行命令:
kubectl run httpd-app --image=httpd --replicas=2
Kubernetes 部署了 deployment httpd-app
,有两个副本 Pod,分别运行在 k8s-node1
和 k8s-node2
。
① kubectl 发送部署请求到 API Server。
② API Server 通知 Controller Manager 创建一个 deployment 资源。
③ Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。
④ k8s-node1 和 k8s-node2 上的 kubectl 在各自的节点上创建并运行 Pod。
补充两点:
1. 应用的配置和当前状态信息保存在 etcd 中,执行 kubectl get pod
时 API Server 会从 etcd 中读取这些数据。
2. flannel 会为每个 Pod 都分配 IP。因为没有创建 service,目前 kube-proxy 还没参与进来。