Kubernetes 介绍和简单使用

介绍

Kubernetes(K8s)按照官方的介绍是

an open-source system for automating deployment, scaling, and management of containerized applications

即一个拥有自动部署、云和管理容器的一个开源应用。

它拥有很多功能,均衡负载、集群管理、容器健康检测、自动停止或回滚容器、安全配置管理等等。

学习使用之前

在学习如何使用 K8s 之前,得先明白 K8s 的几个概念:

Node

Node,节点

A node is a worker machine in Kubernetes,previously known as a minion. A node may be a VM or physical machine, depending on the cluster.

节点是 K8s 中组成集群的单位,它可以是一个物理主机,也可以是一个虚拟主机。在每个节点上会有容器运行服务、kubelet 服务和 kube-proxy 服务。

每个节点都有许多状态和信息,并且因为节点不是由 K8s 自身创建启动的,是由用户自己启动加入的,所以用户对其的配置和控制比较重要,具体见Node 官方文档

Deployment

Deployment,部署对于 K8s 来说是一个任务,在完成一个部署的配置后,提交给 K8s,K8s 的 Deployment controller 会受理该部署,执行相应的部署操作,更新或创建一个部署,按照要求更新或创建对应数量的 Pods。

它是本文的重点,在后文会详细介绍。

Service

Service,服务

An abstract way to expose an application running on a set of Pods as a network service.

简单来说,因为 K8s 为了控制外部访问内部服务,对容器的网络进行控制,为它们单独分配 IP 地址,并且修改路由,使外部无法直接访问集群内部服务,而通过 Service,对外部请求进行管理,针对部署开放端口,使外部访问对应端口才能访问对应服务。

Pod

Pods are the smallest deployable units of computing that can be created and managed in Kubernetes.

Pod 是能过被 K8s 创建和管理的最小单元。

Pod 由一个或一组容器组成,K8s 会为一个 Pod 设置一个 IP 地址和若干个数据卷,属于该 Pod 的所有容器共享这个 IP 和这些数据卷,使该 Pod 内的所有的容器都具有相同网络、存储空间和上下文。

学习

了解了 K8s 的一些基本概念后,就可以开始学习 K8s 的简单使用了,但因为本文只是简单的入门,并不会深入涉及 K8s,所以并不能做到面面俱到,有需要的可以访问官方文档

这里将介绍如何创建一个部署(Deployment),并启动一个服务(Service),使外界可以访问内部运行的应用。

创建一个部署,大部分时候分为下面几步:

构建应用镜像

因为 K8s 最终使用的容器运行服务,例如 Docker,而容器的使用是基于镜像(image)的,所以,需要将应用程序构建成对应容器运行服务的镜像。关于构建相关的内容可以查看对应文档,这里不进行介绍。

描述对象

当完成镜像的构建后,我们可以开始编写部署的配置文件。对于 K8s 可以管理的所有对象都可以使用 K8s API 进行管理。大部分时候,使用.yaml 文件对 K8s 对象进行配置。

下面是一个 Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.7.9
          ports:
            - containerPort: 80

一个描述内必须有下面几项:

  • apiVersion:使用的 K8s API 版本号
  • kind:描述的对象类型(Deployment、Service、Pod 等)
  • metadata:标识该对象数据(name,UID,namespace)

spec则是关于这个对象的具体描述,对应不同的对象类型,有不同的内容的选项,Kubernetes API Reference是官方的 API 文档,可以在这里找需要的配置选项。

DeployemntSpec

这里重点描述下 Deployment 的 Spec 配置,在 1.15 版本关于 Deployment 的 Spec 的字段有 8 个:

字段 描述
minReadySeconds
integer
一个 Pod 被创建成功后到准备好的最小时间,默认为 0
paused
Boolean
描述该部署是否停止
progressDeadlineSeconds
integer
当部署失败后重复执行部署的时间,在这段时间内,K8s 会重复尝试部署,直到时间结束,默认为 600 秒
replicas
integer
启动的 Pod 数量,默认为 1
revisionHistoryLimit
integer
该部署可以被回滚的最大历史记录数,默认为 10
selector
LabelSelector
该部署启动的 Pod 的标签,必须符合模板 Pod 的标签
strategy
DeploymentStrategy
替换已存在的 Pod 的策略
template
PodTemplateSpec
创建 Pod 的 Spec 模板

其他具体可参考DeploymentSpec v1 官方文档

PodTemplateSpec

DeployemntSpec的字段中有一个template,是PodTemplateSpec类型的,它是部署创建 Pod 的模板。PodTemplateSpec v1 有两个字段:

字段 描述
metadata
ObjectMeta
标识该对象数据
spec
PodSpec
模板 Pod 的 Spec 字段

其他具体可参考PodTemplateSpec v1 官方文档

Container

PodSpec是 Pod 的spec字段类型,其中的字段较多,这里只介绍其中的重点字段containers,它属于Container array类型,其他的字段详见PodSpec v1 官方文档

以下 Container 的重点描述字段

字段 描述
args
string array
命令行参数
command
string array
容器启动执行命令
env
EnVar array
容器环境变量
image
string
容器镜像
name
string
容器名称
ports
ContainerPort array
容器对外暴露端口列表

其他具体可参考Container v1 官方文档

例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deplyment
  labels:
    app: app
spec:
  replicas: 4
  selector:
    matchLabels:
      app: app
    template:
      metadata:
        labels:
          app: app
      spec:
        containers:
          - name: app-fe
            image: app-fe:latest
            ports:
              - containerPort: 80
          - name: app-be
            image: app-be:lastest
            env:
              - name: CONFIG
                value: default
              - name: PASSWD
                value: password
            volumeMounts:
              - mountPath: /workdir/data
                name: app-data-volume
        volumes:
          - name: app-data-volume
            hostPath:
              path: /var/data/app

创建

当完成部署的配置后,就可以进行创建部署了。这里就要介绍到一个命令:kubectl

kubectl是管理 K8s 的命令,其命令格式是:

kubectl [command] [TYPE] [NAME] [flags]
  • command:apply, create, describe, delete, get等等
  • TYPE: deployment, pod, service等等
  • NAME:指定特定的对象,对象的唯一标识

在这里假设配置文件为conf.yaml,我们可以执行以下命令执行部署

kubectl apply -f conf.yaml

如果配置文件没有格式错误或发生意外,将会有输出:

deplyment/deplyment-name

为了查看部署情况,我们可以执行以下命令查看:

kubectl get deployment deployment-name

输出:

NAME             READY   UP-TO-DATE   AVAILABLE   AGE
deployment-name   4/4     4            4          0s

后面的 READY、UP-TO-DATE 和 AVAILABLE 字段指代创建的 Pod,如果想获取更多的信息,可执行以下命令:

kubectl describe deployment deployment-name

它将会该部署的具体信息输出

如果希望获取 Pod 的信息,可以通过下面的命令获取:

kubectl get pods

它会列出所有 pod 的名词、状态以及运行时间

自此,部署已经创建完成, 但对于这个应用来说,还没结束。正如之前的介绍,K8s 对外网访问进行了控制,我们需要启动一个服务让外部可以访问应用。

启动服务

我们可以像部署一样,编写一个.yaml 文件对服务进行描述(API 文档)

但我们也可以简单的执行一个命令为我们的部署创建一个服务。

kubectl expose deployment deployment-name --type=NodePort

输出

service/deployment-name exposed

然后执行下面的命令就可以查看开放的端口号了

kubectl get service deployment-name

最后

最后,我们实现了一个应用的部署,并且开放了端口供外部访问。

K8s 的内容有很多,这里只是简单的入门,希望这篇文章可以帮助到一些人。介于笔者的水平也不高,如果文内有什么错误,还请见谅。