• 作者:老汪软件技巧
  • 发表时间:2024-11-24 21:03
  • 浏览量:

前言

最近确实很少刷到关于 Kubernetes(K8s) 的内容,也可能是我没关注。要知道,早在几年前,K8s的热度绝对不亚于今天的 AIGC。当然,这并不意味着K8s已经被冷落或弃用,相反,这恰恰说明K8s已经被广泛应用且愈发成熟,这从K8s官网提供的详细文档、教程以及和云的融合就能看得出来。这也使得现在的开发人员和运维人员在学习和使用K8s时难度降低,对于K8s的讨论也不像初期那样热烈。

建立K8s的全局观

关于K8s的基本概念、架构以及原理,官网已经有非常详细的说明,本文就不再赘述,不然显得有些陈词滥调。毕竟对于K8s这种涉及领域广、知识面杂的技术,一上来就想抠细节、要吃透,多少有点盲目。

所以本文还是以K8s的背景开始,尽量言简意赅、通俗易懂地去表明K8s的作用以及产生的影响,建立对K8s的全局观之后再去官网“钻进去,看本质”可能会比较容易理解。

K8s和分布式的关系

说起 K8s,不得不提到 Google,因为 K8s 是 Google 内部系统的开源版本。提到 Google 又会让人想到开启大数据时代的“三驾马车”,而这背后又是分布式思想。所以,一切都离不开分布式。

那 K8s 和分布式有什么关联?

如果对分布式不太了解的,建议看下《花了1个月学大数据,我想说凉不了》,在理解分布式上应该会有点帮助。

分布式讲究“分而治之,协同作战”,这个过程中避免不了和众多计算节点进行RPC通信。如何管理众多节点,就需要一个管理系统统一协调,这些节点对于应用来讲属于计算资源,所以又叫资源管理系统。那 K8s 最早开始就是 Google 内部的集群资源管理系统,只不过在2014年才开源出来。

K8s和容器的关系

现在的 K8s 被称作容器编排系统,它和容器又有什么关系?又是怎么编排的?

容器是什么?

容器是一个包含了应用程序,以及应用程序运行所需要的完整的环境。它跟虚拟机一样,都属于一种虚拟化技术,用来隔离环境和资源,只不过容器更轻量。

因为容器的轻量、启动快,且可以灵活地为应用指定资源额度、充分利用计算机资源,所以在 K8s 中,容器也就成了使用资源的对象。

现在被大众所知,用的最多的容器技术应该就是Docker了。而Docker的出现则是改变了软件的交付形式,从单体到微服务,从人工到自动化。这个话题也有点老生常谈,这里也就不赘述了。

而如何让容器可以充分利用资源、更稳定的在资源中运行就是K8s另一个重要的工作。

说到这里,K8s 的容器编排也就呼之欲出了。

随着移动互联网的快速发展,微服务、Docker技术的盛行,现代应用基本上都是围绕着容器开发和部署运行。并且各行业对软件的交付需求也越来越高,既要快速又要稳定、既要做到自动扩缩容还不能太浪费资源,那 K8s 的容器编排就是处理这些问题的。接下来,通过实战来感受一下K8s的容器编排。

实战 K8s 部署 WEB 应用

以上一期《AI 对话的 WEB 应用》为例,通过K8s来部署需要以下几个步骤:

K8s环境搭建。应用容器化。K8s部署应用。K8s环境搭建

为了降低 Kubernetes 的学习成本,Kubernetes 官方提供了本地学习和开发环境:Minikube。所以本次示例就基于 Mac 安装 Minikube的环境。

你可以前往 minikube 官方 根据文档安装各平台的环境。

这里以 macOS 为例,执行安装命令:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

因为 K8s 的运行需要容器的支持,所以需要在本地安装容器,这里以 Docker 为例(有环境的可忽略此步):

安装成功后,在网络和版本没有问题的情况下,执行minikube start ,K8s环境就可以成功运行。但是由于 minikube 启动时所需要的基础镜像在国内无法访问,通常会出现下面的问题:

Unable to find image 'gcr.io/k8s-minikube/kicbase...

遇到这种问题,不要病急乱投医,它就是网络原因,我们只需要找到国内的镜像源,然后通过 minikube start --help 知道如何指定就可以了。最终的启动命令如下:

minikube start --base-image="registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.45"

当出现类似下图的信息,就说明K8s的环境开始运行了。

紧接着执行 minikube kubectl -- 命令,kubectl 工具也会自动安装完成。例如下图

应用容器化

K8s 启动成功后,就可以将应用容器化了。

以上一期《AI 对话的 WEB 应用》为例,想要将其容器化需要以下几个步骤:

定义 Dockerfile。构建 Docker 镜像。推送镜像至仓库。定义 Dockerfile

在项目根目录下创建 Dockerfile 文件,然后编写涉及到的内容,以本项目为例,Dockerfile 涉及到的内容有:

JDK17的运行环境。应用程序的可执行代码。执行程序的命令。

具体内容如下:

#依赖的基础镜像
FROM openjdk:17
#工作目录
WORKDIR /app
# 复制 jar 到容器中的工作目录
ADD target/aichat.jar /app
#暴露端口
EXPOSE 8080
#容器启动时执行的命令
ENTRYPOINT ["java","-jar","/app/aichat.jar"]

构建镜像

Dockerfile 定义完成后,在所在的目录执行下面的命令即可在本地成功构建应用镜像。

docker build -t aichat:erdan .

此时,如果运行下面的命令,就会启动一个容器,通过浏览器也就能访问应用了。

docker run -d -p 8080:8080 aichat:erdan

推送私有仓库

通常,构建的镜像需要推送至仓库,这样只要有Docker环境以及仓库的凭证,就可以在任意一个节点把镜像拉取下来并运行,这也是自动化部署的一个关键步骤。

开发运维们,肯巴尔斯(K8s)驾到。对于K8s这种涉及领域广、知识面杂的技术,一上来就想抠细节、要吃透,多少有点盲目。本__开发运维们,肯巴尔斯(K8s)驾到。对于K8s这种涉及领域广、知识面杂的技术,一上来就想抠细节、要吃透,多少有点盲目。本

将本地的镜像推送至私有仓库需要执行下面的命令:

docker login --username= [username] <镜像仓库>
docker tag [ImageId] [镜像名称]:[镜像版本号]
docker push  [镜像名称]:[镜像版本号]

下图为成功推送至仓库后的示例

K8s部署应用

最后一步就是用K8s部署应用,完成这一步也就意味着入门K8s了。

只需三步即可完成K8s部署应用:

创建一个访问镜像仓库的凭证。编写应用如何部署的yaml文件,即容器编排。用 kubectl 工具执行yaml文件。

因为需要访问镜像所在的仓库,所以K8s需要一个凭证,下面的示例是创建了一个名为erdan-secret的凭证。

kubectl create secret docker-registry erdan-secret \
  --docker-server=xxx \
  --docker-username=xxx \
  --docker-password=xxx \
  --docker-email=xxx

这个凭证会在定义Deployment时使用到。

下面是对应用如何部署的定义,也是容器编排的关键一步,决定着容器对资源的应用。

apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment
metadata:
  name: aichat-deploy  #Deployment 的名称
  labels:       #标签
    app: aichat  #为该Deployment设置key为app,value为nginx的标签
spec:           #关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #replicas 副本集应该维护几个 Pod 副本
  selector:     #标签选择器,与上面的标签共同作用
    matchLabels: #选择包含标签app:aichat的资源
      app: aichat
  template:     #创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: aichat
    spec:       #期望Pod实现的功能(即在pod中部署)
      imagePullSecrets:
        - name: erdan-secret    # 仓库凭证
      containers:   #生成container,与docker中的container是同一种
        - name: aichat #container的名称
          image: xxx  #使用的镜像
          ports:
            - containerPort: 8080
---
# 创建Pod的Service 80端口指向pod的8080
apiVersion: v1
kind: Service
metadata:
  name: aichat-service
spec:
  type: NodePort
  selector:
    app: aichat
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30007

对于K8s的初学者,文件中 kind: Deployment 的部分,重点关注 containers ,这里是K8s将要拉取的镜像。 kind: Service 的部分,是集群内部访问的端口和外部访问节点的端口。

最后执行 kubuctl apply -f alichar-deploy.yaml ,就会交给K8s去创建资源部署应用。

由于K8s环境是基于minikube构建的,如果想要在外部节点访问部署的应用,通过minikube service aichat-service即可访问。如下图中浏览器的url与上图的对应。

至此,用K8s部署WEB应用就完成了,也恭喜你入门K8s。

总结

K8s的核心本质还是在于对企业利润的考虑,它规避了构建超级计算机的高昂成本,通过分布式的处理实现了高效的资源利用,同时也为软件的交付提供了保障。所以,它不仅仅是一个工具、技术,更是一种值得我们探究的思想和理念。


上一条查看详情 +Linux Shell和Shell脚本详解!
下一条 查看详情 +没有了