美文网首页
Kubernetes

Kubernetes

作者: 陈菲TW | 来源:发表于2020-05-08 13:06 被阅读0次

    一、k8s基本介绍

    容器提供应用级的主机抽象;Kubernetes提供应用级的集群抽象。伴随容器化部署,容器实例越来越多,就像鸡蛋太多需要一个篮子来装一样,Kubernetes就是那个篮子。K8s是开源的容器编排系统,使用Go语言编写。类似产品包括AWS的ECS、Mesos。k8s的优势在于开源、社区、插件、模块化。

    单节点部署多个容器可以使用 docker-compose。而针对多节点的部署方案,docker-compose 无能为力,转而介绍今天的角色:kubernetes。kubernetes 底层操作的具体资源是容器(学习者需要优先掌握容器的相关知识)。容器的本质是进程,相当于在操作系统上运行的实例。具体来讲:k8s: 是一个跨主机集群的开源容器调度平台,可以自动化的应用容器的部署、扩展和操作,提供以容器为中心的基础架构。

    整体来说 k8s包含两个部分:Master 节点、 Node 节点。各节点完成不同的任务。就 Master 而言包含,其包含4个部分:1)APIServer: 内部的 web 服务,资源操作的入口;2)Scheduler: 调度器:负责资源的调度,比如把部署的应用部署在哪个节点上;3)Controller manager 负责集群的状态,比如故障诊断、自动扩展等;4)etcd 保存集群的整个信息。

    Node 节点主要包含:1)kubelet : 节点代理,维护容器的生命周期(整个操作过程中,我们都不太会显式的操作 kubelet);2)kube_proxy: 转发代理,负责服务的发现和负载均衡;3)docker: 容器。

    二、k8s集群部署

    1)3个机器(或虚拟机)安装k8s。角色分别是master和worker,主机名分别为k8s-node-1/2/3。安装k8s组件:kubelet、kubeadm、kubectl,配置kubelet的control group,启动kubelet。

    2)创建k8s集群,使用官方提供的kubeadm。在master节点执行kubeadm init。另外还需要创建网络,并且让其他节点执行kubeadm join加入集群。K8S集群默认不会将Pod调度到Master上,也可以额外配置master为工作节点。在master上执行kubectl get nodes查看集群的所有节点。

    3)创建网络,否则用kubectl查看pod的dns状态是阻塞的。

    4)运行kubectl get pods -n kube-system查看所有pod状态,running则正常。

    三、k8s的配置文件

    作为开发者,在集群部署完成之后,想要部署自己的服务,要点在于编写配置文件。然后通过kubectl部署上去。多个配置文件可以写在同一个文件内,使用 --- 分割开。

    3.1 部署一个namespace

    apiVersion表示版本信息;kind表示资源类型,比如Namespace;metadata表死后元信息,一般来定义资源的名称等;spec表示资源规范字段。

    那么如何知道部署的 k8s 支持哪些资源和版本?可以通过以下命令查看。

    // 查看所有支持的资源 >> kubectl api-resources // 查看所有支持的版本 >> kubectl api-versions 

    编写完yaml配置文件后,通过以下命令进行部署。义的 yaml 最终转换成了相应的对象完成资源的增删改查,这就是 api-server 主要的作用,也是 k8s 操作资源的入口。

    apply之后再次查看namespace就可以看到新建出来的k8s-example。除自身刚刚创建的 namespace 之外,集群搭建过程中自动的生成默认的 namespace。namespace 是用来进行隔离的,是一个逻辑概念,真实的集群环境中,可以根据使用场景创建不同的 namespace,用来进行隔离。

    3.2 部署Nginx服务

    比如我们想在上面的namespace隔离环境下部署一个Nginx服务。仍然我们需要编写一个yaml文件,然后用kubelet部署。

    显式的约定了 namespace: k8s-example,即会部署在 k8s-example 隔离环境下,不影响已有服务。spec 约定了部分容器的相关操作,比如镜像,端口。可以查看服务部署情况如下:

    那么如何能够访问到Nginx呢,在k8s中需要给Nginx搭配Service

    显式的指定 namespace: k8s-example;指定了选择器: app: k8s-example-pod;约定了端口映射关系:80:80;约定了类型:NodePort。所以 service 的角色是和 POD 进行绑定关系,POD 本身不提供对外访问的能力,需要借助 service 进行绑定,再对外服务。NodePort的意思是可以使用该节点的 IP 和对应的端口。

    3.3 ReplicaSet

    集群提供高可用服务的一个重要手段是部署多个相同的服务,应用负载均衡的能力,使其对外服务,同时提供自动伸缩的能力。意思是,一般开发者都不会单独的定义一个 POD,也很少单独写资源类型是 POD 的配置文件。转而是另一个概念:ReplicaSet (副本)

    replicat: 2 表示相应的服务有两套;selector: 选择器,将符合条件的 POD 纳入麾下;template: 那些 spec 字段都成为了模版内的内容。

    集群始终根据副本的个数在调控着,比如,你删掉一个,立马给你启动一个,比如你新增一个,立马给你删除一个等。

    3.4 Deployment

    Deployment 称作无状态工作负载,适合在生产环境中使用。其具备 ReplicaSet 的所有能力,且支持事件和状态查看、回滚、版本记录等能力。同样部署 nginx,资源类型是 Deployment 的配置文件如何编写?

    在 Kubernetes 中部署软件可使用 2 个主要策略:1)替换,使用新需求替换全部负载,自然会强制停机。对于快速替换非生产环境的资源,这很有帮助。2)滚动升级,通过监听两个特定配置慢慢地将容器替换成新的:MaxAvailable,设置在部署新版本时可用的工作负载比例(或具体数量),100% 表示“我有 2 个容器,在部署时要保持 2 个存活以服务请求”;MaxSurge——设置在当前存活容器的基础上部署的工作负载比例(或数量),100% 表示“我有 X 个容器,部署另外 X 个容器,然后开始滚动移除旧容器”。

    3.5 配置文件

    编写程序的过程中,不可避免的会使用到配置文件,自己的程序中一般有两种方式:本地配置文件、环境变量。

    两种资源:configMap 、secret 的配置字段几乎一致,区别在于:secret 中的值都需要 bas64转码。

    3.6 其他yaml选项

    1)resource 字段,可以用来表明服务申请和限制 内存和CPU,具体可以用数字来表示,也可以用百分比表示。这种限制有什么用?其中一个比较厉害的功能是动态的调整 POD,比如你设置某种策略,在服务请求压力比较大的时候,多开几个副本,缓解上游请求压力。在系统比较闲的时候,删除几个副本,释放资源。

    四、名词解释

    1)Pod:Kubernetes 的最小可互动单元。Pod代表一个容器组,共同部署在单个节点。开发者在会制造镜像的基础上定义自己 POD 的配置文件。

    2)Service开发者编写的服务,如果需要提供对外访问能力,需要 service 进行绑定,这种绑定关系是自动,具体的如何绑定主要根据的 selector 选择器内定义的字段,是否在某个 POD 内出现且相同,那么进行绑定。否则处于监听状态,等待符合的对象。为什么不直接让 POD 可以直接访问?访问需要绑定 ip 和 端口吧?但是 POD 在集群内是可以随时删除、升级、回滚的。鉴于此不直接提供访问能力,转而通过 service 进行绑定。Service 和 POD 进行绑定,包括访问类型和端口映射关系

    3)节点Node:Node 是机器,是 Kubernetes 用于部署 Pod 的“裸机”(或虚拟机)。Node 为 Kubernetes 提供可用的集群资源用于数据、运行作业、维护工作负载、创建网络路由等。

    4)Label:用于过滤系统中相似资源。任何 Kubernetes 资源都应打上标签以供后续查验。例如,给系统中所有 Worker Pod 打上标签:app=worker,之后即可在 kubectl 或 Kubernetes API 中使用 --selector 字段对其进行选择。

    5)服务发现:作为编排系统,Kubernetes 控制着不同工作负载的众多资源,负责管理 Pod、作业及所有需要通信的物理资源的网络。为此,Kubernetes 使用了 ETCD作为“内部”数据库,Master 通过它来获取所有资源的位置。Kubernetes 还为服务提供了实际的“服务发现”——所有 Pod 使用了一个自定义的 DNS 服务器,通过解析其他服务的名称以获取其 IP 地址和端口。它在 Kubernetes 集群中“开箱即用”,无须进行设置。

    五、k8s的项目配置实例

    相关文章

      网友评论

          本文标题:Kubernetes

          本文链接:https://www.haomeiwen.com/subject/kjceghtx.html