我的Mall电商实战项目一直使用的是Docker容器化部署,有很多朋友建议搞个Kubernetes部署。最近正好在学习Kubernetes,准备更新一波!今天我们先来学习下Kubernetes的核心概念和基本使用,希望对大家有所帮助!
Kubernetes简介
Kubernetes(简称K8S,K和S之间有8个字母)是用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes源自Google15年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
Kubernetes具有如下特性:
服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。
存储编排:自动挂载所选存储系统,包括本地存储。
Secret和配置管理:部署更新Secrets和应用程序的配置时不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。
批量执行:除了服务之外,Kubernetes还可以管理你的批处理和CI工作负载,在期望时替换掉失效的容器。
水平扩缩:使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。
自动化上线和回滚:Kubernetes会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。
自动装箱:根据资源需求和其他约束自动放置容器,同时避免影响可用性。
自我修复:重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器。
Minikube简介Minikube是一种轻量级的Kubernetes实现,可在本地计算机上创建VM并部署仅包含一个节点的简单集群,Minikube可用于Linux、MacOS和Windows系统。MinikubeCLI提供了用于引导集群工作的多种操作,包括启动、停止、查看状态和删除。
Kubernetes核心概念NodeKubernetes集群是指Kubernetes协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。
一个Kubernetes集群包含两种类型的资源:
Master:负责管理整个集群。协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
Node:用于托管正在运行的应用。可以是一个虚拟机或者物理机,它在Kubernetes集群中充当工作机器的角色,每个Node都有Kubelet,它管理Node而且是Node与Master通信的代理,Node还具有用于处理容器操作的工具,例如Docker或rkt。

Deployment负责创建和更新应用程序的实例。创建Deployment后,KubernetesMaster将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障维护问题。
可以使用Kubernetes命令行界面Kubectl创建和管理Deployment。Kubectl使用KubernetesAPI与集群进行交互。

Pod相当于逻辑主机的概念,负责托管应用实例。包括一个或多个应用程序容器(如Docker),以及这些容器的一些共享资源(共享存储、网络、运行信息等)。

Service是一个抽象层,它定义了一组Pod的逻辑集,并为这些Pod支持外部流量暴露、负载平衡和服务发现。
尽管每个Pod都有一个唯一的IP地址,但是如果没有Service,这些IP不会暴露在群集外部。Service允许您的应用程序接收流量。Service也可以用在ServiceSpec标记type的方式暴露,type类型如下:
ClusterIP(默认):在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问。
NodePort:使用NAT在集群中每个选定Node的相同端口上公开Service。使用NodeIP:NodePort从集群外部访问Service。是ClusterIP的超集。
LoadBalancer:在当前云中创建一个外部负载均衡器(如果支持的话),并为Service分配一个固定的外部IP。是NodePort的超集。
ExternalName:通过返回带有该名称的CNAME记录,使用任意名称(由spec中的externalName指定)公开Service。不使用代理。

安装yum-utils:
yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2
为yum源添加docker仓库位置:
yum-config-manager--add-repo
安装Docker:
yuminstalldocker-ce
启动Docker:
systemctlstartdockerMinikube安装
首先我们需要下载Minikube的二进制安装包并安装:
curl-LO
然后使用如下命令启动Minikube:
minikubestart
如果你使用的是root用户的话会无法启动并提示如下信息,那是因为Minikube不允许使用root权限启动,需要创建一个非root账号再启动;
**Automaticallyselectedthedockerdriver*The"docker"drivershouldnotbeusedwithrootprivileges.*IfyouarerunningminikubewithinaVM,considerusing--driver=none:*"docker"drivershouldnotbeusedwithrootprivileges.
这里创建了一个属于docker用户组的macro用户,并切换到该用户;
设置用户密码passwdmacro查找kubectl命令的位置find/-namekubectl直接使用kubectl命令kubectlversion
查看集群详细信息:
kubectlcluster-info
Kubernetescontrolplaneisrunningat'kubectlcluster-infodump'.
查看集群中的所有Node,可以发现Minikube创建了一个单节点的简单集群:
kubectlgetnodes
NAMESTATUSROLESAGEVERSIONminikubeReadycontrol-plane,部署应用
指定好应用镜像并创建一个Deployment,这里创建一个Nginx应用:
kubectlcreatedeploymentkubernetes-nginx--image=nginx:1.10
创建一个Deployment时K8S会产生如下操作:
选择一个合适的Node来部署这个应用;
将该应用部署到Node上;
当应用异常关闭或删除时重新部署应用。
查看所有Deployment:
kubectlgetdeployments
NAMEREADYUP-TO-DATEAVAILABLEAGEkubernetes-nginx1/11121h
我们可以通过kubectlproxy命令创建一个代理,这样就可以通过暴露出来的接口直接访问K8S的API了,这里调用了查询K8S版本的接口;
[macro@linux-localroot]nbsp;:8001[root@linux-local~]切换到root用户su-重启防火墙firewall-cmd--reload
通过如下地址即可访问Dashboard:
查看K8S集群中的资源状态信息:

通过yaml脚本创建K8S资源:

查看K8S中所有Pod的状态信息,通过更多按钮可以查看容器日志和执行内部命令。

总结
当我们的应用需要部署在多个物理机上时,传统的做法是一个个物理机器去部署。如果我们使用了K8S的话,就可以把这些物理机认为是一个集群,只需通过K8S把应用部署到集群即可,无需关心物理机的部署细节。同时K8S提供了水平扩容、自动装箱、自动修复等功能,大大减少了应用集群化部署的工作量。





