上一节我们讲了《DevOps技术》,DevOps保证了微服务更好的落地,微服务通常以容器为载体,而对容器的管理,Kubernetes是最佳选择。下面带你快速玩转Kubernetes。
一、kubernetes是什么
kubernetes是容器集群管理系统,开源的平台,可以实现容器集群的自动化部署、自动扩/缩容、维护等功能。
Kubernetes常简称k8s(是将中间8个字母“ubernete”替换为“8”的缩写)
二、kubernetes的安装
kubernetes的安装现在已经变得越来越简单,网上到处都有安装操作指南。
这里给大家提供一个单机离线安装包:
链接:https://pan.baidu.com/s/167pmpe9m28bYx7EQwhxKog
提取码:su7g
里面的内容如下:
按照安装指南2分钟就可以部署一个kubernetes环境:
需要注意的是,系统分区时根目录/要多分一些空间(最好占磁盘的90%以上),因为kubernetes会检测磁盘的根目录容量,如果磁盘容量过低,会导致DiskPressure=true以致于节点无法调度
三、kubernetes的使用
有了kubernetes环境,我们部署一个应用(以nginx为例)体验一下:
1.部署应用
访问kubernetes的dashboard页面,点击右上角的"创建":
进入创建页面,选择“创建应用“选项卡,填写信息:
- 应用名称:必填,随便起个名字。
- 容器镜像:必填,创建应用所使用的镜像,这里以docker官网的nginx镜像为例。
- 服务:根据自己应用的用途选择:
- 无:不创建服务,主要用于孤立应用,不需要被访问。
- 内部:创建集群范围内的服务,只能在集群范围内通信。无法在集群外访问应用,比如通过浏览器。
- 外部:创建外部服务,服务可以在集群外被访问,默认支持负载均衡(需使用支持外部负载均衡器的云提供商的服务)。
注:选择了内部或外部服务后,需要填写服务的端口:
端口:集群内通信端口。
目标端口:应用本身暴露的端口,比如nginx应用的端口为80。
填写完信息后点击部署。部署完可以看到以下信息:
点击刚才创建的服务(ngxin-test),查看外部访问端口:
然后通过http:{k8s-master-ip}:31174访问nginx应用:
{k8s-master-ip} 替换成你本地kubernetes的master/node节点ip
2.应用伸缩
当我们的应用访问量增大时,我们可以对应用进行扩充:
在部署下面找到我们的应用(nginx-test),点击后面的操作图标,然后选择伸缩:
在弹出的对话框中填写伸缩后的副本数:
伸缩完之后,我们在容器组下可以看到应用(nginx-test)有3个副本:
当我们访问应用的时候,这3个副本会通过负载均衡来分担请求压力。
3.查看应用日志
应用运行过程中出现问题,我们可能会通过日志来寻找原因:
点击某一容器组的“日志”图标,查看日志信息:
4.在应用内运行命令
有些问题通过日志不一定能找到原因,有时候我们需要到应用容器里面去运行一些命令来查看问题:
进到某一容器组的详情页面,然后点击右上方的“运行命令“
然后就可以像在linux下输入命令一样,做任何你想做的:
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中大多数资源都是这样的配置结构:
- kind: 指定资源的类型,这里为Deployment,表示该资源为部署资源。
- apiVersion: 指定资源的api版本,示例中使用的是v1beta1版本。
- metadata: 指定对象的元数据(包括名称、标签信息等)。
- spec: 指定预期的行为。
- status: 展示对象当前的状态信息,一般无需修改。
展开metadata信息:
- name: 该资源的名称。
- namespace: 该资源所在命名空间。
- labels: 资源的标签,可以有多个。用于通过标签选择器进行选取或过滤。
- annotations: 注释信息,主要用于设置一些附加信息。
- 其余的信息不用关心,也不用去修改。
展开spec信息,介绍下一些常用的:
-
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)的编排就简单多了:
服务(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 架构及核心组件详解》。