云原生系列技术(五):Kubernetes 快速上手

上一节我们讲了《DevOps技术》,DevOps保证了微服务更好的落地,微服务通常以容器为载体,而对容器的管理,Kubernetes是最佳选择。下面带你快速玩转Kubernetes。

一、kubernetes是什么

kubernetes是容器集群管理系统,开源的平台,可以实现容器集群的自动化部署、自动扩/缩容、维护等功能。

Kubernetes常简称k8s(是将中间8个字母“ubernete”替换为“8”的缩写)

二、kubernetes的安装

kubernetes的安装现在已经变得越来越简单,网上到处都有安装操作指南。

这里给大家提供一个单机离线安装包:

链接:https://pan.baidu.com/s/167pmpe9m28bYx7EQwhxKog
提取码:su7g

里面的内容如下:
云原生系列技术(五):Kubernetes 快速上手
按照安装指南2分钟就可以部署一个kubernetes环境:

需要注意的是,系统分区时根目录/要多分一些空间(最好占磁盘的90%以上),因为kubernetes会检测磁盘的根目录容量,如果磁盘容量过低,会导致DiskPressure=true以致于节点无法调度

云原生系列技术(五):Kubernetes 快速上手

三、kubernetes的使用

有了kubernetes环境,我们部署一个应用(以nginx为例)体验一下:

1.部署应用

访问kubernetes的dashboard页面,点击右上角的"创建":
云原生系列技术(五):Kubernetes 快速上手
进入创建页面,选择“创建应用“选项卡,填写信息:
云原生系列技术(五):Kubernetes 快速上手

  • 应用名称:必填,随便起个名字。
  • 容器镜像:必填,创建应用所使用的镜像,这里以docker官网的nginx镜像为例。
  • 服务:根据自己应用的用途选择:
    • 无:不创建服务,主要用于孤立应用,不需要被访问。
    • 内部:创建集群范围内的服务,只能在集群范围内通信。无法在集群外访问应用,比如通过浏览器。
    • 外部:创建外部服务,服务可以在集群外被访问,默认支持负载均衡(需使用支持外部负载均衡器的云提供商的服务)。

注:选择了内部或外部服务后,需要填写服务的端口:

  • 端口:集群内通信端口。

  • 目标端口:应用本身暴露的端口,比如nginx应用的端口为80。

填写完信息后点击部署。部署完可以看到以下信息:
云原生系列技术(五):Kubernetes 快速上手
点击刚才创建的服务(ngxin-test),查看外部访问端口:
云原生系列技术(五):Kubernetes 快速上手
然后通过http:{k8s-master-ip}:31174访问nginx应用:

{k8s-master-ip} 替换成你本地kubernetes的master/node节点ip
云原生系列技术(五):Kubernetes 快速上手

2.应用伸缩

当我们的应用访问量增大时,我们可以对应用进行扩充:

部署下面找到我们的应用(nginx-test),点击后面的操作图标,然后选择伸缩:

云原生系列技术(五):Kubernetes 快速上手
在弹出的对话框中填写伸缩后的副本数:
云原生系列技术(五):Kubernetes 快速上手
伸缩完之后,我们在容器组下可以看到应用(nginx-test)有3个副本:
云原生系列技术(五):Kubernetes 快速上手
当我们访问应用的时候,这3个副本会通过负载均衡来分担请求压力。

3.查看应用日志

应用运行过程中出现问题,我们可能会通过日志来寻找原因:

点击某一容器组的“日志”图标,查看日志信息:
云原生系列技术(五):Kubernetes 快速上手
云原生系列技术(五):Kubernetes 快速上手

4.在应用内运行命令

有些问题通过日志不一定能找到原因,有时候我们需要到应用容器里面去运行一些命令来查看问题:

进到某一容器组的详情页面,然后点击右上方的“运行命令“
云原生系列技术(五):Kubernetes 快速上手
然后就可以像在linux下输入命令一样,做任何你想做的:
云原生系列技术(五):Kubernetes 快速上手

5.认识编排

以上内容我们没有通过任何编排就把我们的应用在kubernetes里面玩起来了。

但不懂编排对于后续的维护可能会捉襟见肘,kubernetes里面的所有资源都可以通过编排来声明定义。

5.1 概念介绍

在介绍编排之前,先简单说下涉及到的几个概念:

  • 部署(Deployment):为Pod和ReplicaSet提供声明式更新.同时支持滚动更新,回滚等操作。

  • 副本集(ReplicaSet): 由Depoyment创建,用于确保当前Pod的副本数和用户定义保持一致。

  • 容器组(Pod):kubernetes可调度的最小单元,一个Pod里面可以有多个容器,容器之间共享网络,共享存储。容器里面运行的就是我们的业务应用。

  • 服务(Service):为一组功能相同的Pod提供统一入口,并提供负载均衡。

5.2 编排介绍

编排文件的格式一般有json和yaml两种。

我们用上面介绍的nginx的例子来介绍下编排。通常一个简单的应用有两种资源需要我们编写编排:Deployment和Service.

5.2.1 部署(Deployment)编排

先看下部署(Deployment)的编排:
云原生系列技术(五):Kubernetes 快速上手
在kubernetes中大多数资源都是这样的配置结构:

  • kind: 指定资源的类型,这里为Deployment,表示该资源为部署资源。
  • apiVersion: 指定资源的api版本,示例中使用的是v1beta1版本。
  • metadata: 指定对象的元数据(包括名称、标签信息等)。
  • spec: 指定预期的行为。
  • status: 展示对象当前的状态信息,一般无需修改。

展开metadata信息:
云原生系列技术(五):Kubernetes 快速上手

  • name: 该资源的名称。
  • namespace: 该资源所在命名空间。
  • labels: 资源的标签,可以有多个。用于通过标签选择器进行选取或过滤。
  • annotations: 注释信息,主要用于设置一些附加信息。
  • 其余的信息不用关心,也不用去修改。

展开spec信息,介绍下一些常用的:
云原生系列技术(五):Kubernetes 快速上手

  • spec.replicas:表示预期需要创建3个副本。

  • spec.selector:标签选择器,用于选择副本集。

  • spec.template.metadata: 定义创建副本集的元数据,包括名称和标签。

  • spec.template.spec.containers:定义最终创建出来的容器组(Pod)里面的容器信息,包括容器名称(name),镜像(image),资源限制(resources),镜像拉取策略(imagePullPolicy)等。一个容器组(Pod)里面可以有多个容器。

  • spec.template.spec.restartPolicy:指定容器重启策略。取值范围:Always(默认), OnFailure, Never.

  • spec.strategy.type: 当配置改变时如何更新容器组(Pod):

    • Recreate: 重新创建。
    • RollingUpdate: 滚动更新,默认值
  • spec.strategy.rollingUpdate:当type为RollingUpdate时需指定滚动更新时每次更新Pod数量的策略:

    • maxUnavailable: 更新期间,该应用最大不可用的Pod数或百分比, 默认25%。

    • maxSurge:更新期间,该应用的Pod总数超过预期数或百分比,默认25%。

  • spec.revisionHistoryLimit: 保留允许回滚的历史版本数,默认10.

5.2.2 服务(Service)编排

比起部署(Deployment)的编排,服务(Service)的编排就简单多了:
云原生系列技术(五):Kubernetes 快速上手
服务(Service)资源的编排重点介绍下spec下的配置:

  • ports: 应用所暴露的端口声明:
    • name: 端口名称
    • protocol:协议。
    • port: 集群内访问端口
    • targetPort:容器中端口
    • nodePort:集群节点上的端口
  • selector: 选择器,用于选择要处理请求的Pod。
  • type: 服务的类型,取值如下:
    • ClusterIP: 集群内部服务,服务只能在集群内被访问。
    • NodePort:服务可以在集群外被访问,(集群内也可以访问)。
    • LoadBalancer:服务可以在集群外被访问,且支持负载均衡(需使用支持外部负载均衡器的云提供商的服务)
  • sessionAffinity: session亲和性,取值:
    • ClientIP:根据客户IP来调度。
    • None:无限制,服务随机调度,默认。

对于编排的所有字段信息,官网都是详细的说明,请大家参考:
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/

总结

本文从“零”开始,内容浅显易懂,一步步教大家从安装到使用再到编排,相信大家对kubernetes有了一点认识。下节给大家分享《Kubernetes 架构及核心组件详解》