更新时间:2023-08-02 gmt 08:00

kubernetes-凯发k8国际娱乐官网入口

kubernetes是什么

是一个很容易地部署和管理容器化的应用软件系统,使用kubernetes能够方便对容器进行调度和编排。

对应用开发者而言,可以把kubernetes看成一个集群操作系统。kubernetes提供服务发现、伸缩、负载均衡、自愈甚至选举等功能,让开发者从基础设施相关配置等解脱出来。

kubernetes可以把大量的服务器看做一台巨大的服务器,在一台大服务器上面运行应用程序。无论kubernetes的集群有多少台服务器,在kubernetes上部署应用程序的方法永远一样。

图1 在kubernetes集群上运行应用程序

kubernetes集群架构

kubernetes集群包含master节点(控制节点)和node节点(计算节点/工作节点),应用部署在node节点上,且可以通过配置选择应用部署在某些特定的节点上。

通过云容器引擎服务创建的集群,master节点将由云容器引擎服务托管,您只需创建node节点。

kubernetes集群的架构如下所示:

图2 kubernetes集群架构

master节点

master节点是集群的控制节点,由api server、scheduler、controller manager和etcd四个组件构成。

  • api server:各组件互相通讯的中转站,接受外部请求,并将信息写到etcd中。
  • controller manager:执行集群级功能,例如复制组件,跟踪node节点,处理节点故障等等。
  • scheduler:负责应用调度的组件,根据各种条件(如可用的资源、节点的亲和性等)将容器调度到node上运行。
  • etcd:一个分布式数据存储组件,负责存储集群的配置信息。

在生产环境中,为了保障集群的高可用,通常会部署多个master,如cce的集群高可用模式就是3个master节点。

node节点

node节点是集群的计算节点,即运行容器化应用的节点。

  • kubelet:kubelet主要负责同container runtime打交道,并与api server交互,管理节点上的容器。
  • kube-proxy:应用组件间的访问代理,解决节点上应用的访问问题。
  • container runtime:容器运行时,如docker,最主要的功能是下载镜像和运行容器。

kubernetes的扩展性

kubernetes开放了容器运行时接口(cri)、容器网络接口(cni)和容器存储接口(csi),这些接口让kubernetes的扩展性变得最大化,而kubernetes本身则专注于容器调度。

  • cri(container runtime interface):容器运行时接口,提供计算资源,cri隔离了各个容器引擎之间的差异,而通过统一的接口与各个容器引擎之间进行互动。
  • cni(container network interface):容器网络接口,提供网络资源,通过cni接口,kubernetes可以支持不同网络环境。例如cce就是开发的cni插件支持kubernetes集群运行在vpc网络中。
  • csi(container storage interface):容器存储接口,提供存储资源,通过csi接口,kubernetes可以支持各种类型的存储。例如cce就可以方便的对接块存储(evs)、文件存储(sfs)和对象存储(obs)。

kubernetes中的基本对象

上面介绍kubernetes集群的构成,下面将介绍kubernetes中基本对象及它们之间的一些关系。

图3 kubernetes基本对象
  • pod

    pod是kubernetes创建或部署的最小单位。一个pod封装一个或多个容器(container)、存储资源(volume)、一个独立的网络ip以及管理控制容器运行方式的策略选项。

  • deployment

    deployment是对pod的服务化封装。一个deployment可以包含一个或多个pod,每个pod的角色相同,所以系统会自动为deployment的多个pod分发请求。

  • statefulset

    statefulset是用来管理有状态应用的对象。和deployment相同的是,statefulset管理了基于相同容器定义的一组pod。但和deployment不同的是,statefulset为它们的每个pod维护了一个固定的id。这些pod是基于相同的声明来创建的,但是不能相互替换,无论怎么调度,每个pod都有一个永久不变的id。

  • job

    job是用来控制批处理型任务的对象。批处理业务与长期伺服业务(deployment)的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。job管理的pod根据用户的设置把任务成功完成就自动退出(pod自动删除)。

  • cronjob

    cronjob是基于时间控制的job,类似于linux系统的crontab,在指定的时间周期运行指定的任务。

  • daemonset

    daemonset是这样一种对象(守护进程),它在集群的每个节点上运行一个pod,且保证只有一个pod,这非常适合一些系统层面的应用,例如日志收集、资源监控等,这类应用需要每个节点都运行,且不需要太多实例,一个比较好的例子就是kubernetes的kube-proxy。

  • service

    service是用来解决pod访问问题的。service有一个固定ip地址,service将访问流量转发给pod,而且service可以给这些pod做负载均衡。

  • ingress

    service是基于四层tcp和udp协议转发的,ingress可以基于七层的http和https协议转发,可以通过域名和路径做到更细粒度的划分。

  • configmap

    configmap是一种用于存储应用所需配置信息的资源类型,用于保存配置数据的键值对。通过configmap可以方便的做到配置解耦,使得不同环境有不同的配置。

  • secret

    secret是一种加密存储的资源对象,您可以将认证信息、证书、私钥等保存在secret中,而不需要把这些敏感数据暴露到镜像或者pod定义中,从而更加安全和灵活。

  • persistentvolume(pv)

    pv指持久化数据存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个nfs的挂载目录。

  • persistentvolumeclaim(pvc)

    kubernetes提供pvc专门用于持久化存储的申请,pvc可以让您无需关心底层存储资源如何创建、释放等动作,而只需要申明您需要何种类型的存储资源、多大的存储空间。

搭建kubernetes集群

上有多种搭建kubernetes集群的方法,例如minikube、kubeadm等。

如果不想自行搭建kubernetes集群,可以在cce服务中购买,本文后续内容都将在cce中购买的集群上操作演示。

kubernetes对象的描述

kubernetes中资源可以使用yaml描述(如果您对yaml格式不了解,可以参考),也可以使用json。其内容可以分为如下四个部分:

  • typemeta:对象类型的元信息,声明对象使用哪个api版本,哪个类型的对象。
  • objectmeta:对象的元信息,包括对象名称、使用的标签等。
  • spec:对象的期望状态,例如对象使用什么镜像、有多少副本等。
  • status:对象的实际状态,只能在对象创建后看到,创建对象时无需指定。
图4 yaml描述文件

在kubernetes上运行应用

图4中的内容去除status存为一个名为nginx-deployment.yaml的文件,如下所示:

apiversion: apps/v1
kind: deployment
metadata:
  name:  nginx
  labels:
    app:  nginx
spec:
  selector:
    matchlabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app:  nginx
    spec:
      containers:
      - name:  nginx
        image:  nginx:alpine
        resources:
          requests:
            cpu: 100m
            memory: 200mi
          limits:
            cpu: 100m
            memory: 200mi
      imagepullsecrets:
      - name: default-secret

使用kubectl连接集群后,执行如下命令:

# kubectl create -f nginx-deployment.yaml 
deployment.apps/nginx created

命令执行后,kubernetes集群中会创建3个pod,使用如下命令可以查询到deployment和pod:

# kubectl get deploy
name    ready   up-to-date   available   age
nginx   3/3     3            3           9s
# kubectl get pods
name                     ready   status    restarts   age
nginx-685898579b-qrt4d   1/1     running   0          15s
nginx-685898579b-t9zd2   1/1     running   0          15s
nginx-685898579b-w59jn   1/1     running   0          15s

到此为止,您了解容器和docker、kubernetes集群、kubernetes基本概念,并通过一个示例了解kubectl的最基本使用,本文后续将向您深入介绍kubernetes对象的概念以及使用方法,并介绍对象之间的关系。

分享:
网站地图