Kubernetes如何部署项目

在k8s集群搭建好了,接下来很重要就是进行项目程序的部署了,需要把我们的项目放到k8s上运行。

在容器时候,我们通过r像生成容器运行,k8s也一样,把镜像生成容器运行,但是k8s并不直接使用docker容器,而是使用pod,Pod 可以理解是一组容器,是k8s最小的调度单位。在k8s上创建一个pod资源对象来运行我们的项目。

在k8s中,我们不会单独创建一个pod资源对象,而是创建Deployment对象,通过Deployment来管理pod。

注:为什么一般不单独创建Pod对象呢?因为单独创建的pod对象,如果挂掉是不会被k8s感知和重启的,创建Deployment对象可以管理pod对象,如果pod挂掉了,则Deployment对象会再重新拷贝一个pod的副本出来,所以我们需要创建Deployment对象而不是创建Pod对象,如下图描述

在这里插入图片描述

注:
1.我们可以把Deployment看做RC的一次升级
2.Deployment能够保证Pod持续运行,并且在任何时候都有指定数量的Pod副本,在此基础上提供一些高级特性,比如滚动升级和弹性伸缩,以及Pod需要的资源限制
2.单独创建pod,该pod发生故障是不会重新创建

Kubernetes如何创建Deployment对象

上面的铺垫都是描述了我们为什么要创建Deployment,通过创建Deployment对象来管理和创建Pod对象,再通过Pod来创建我们的项目镜像,容器化运行我们的项目程序,那如何创建Deployment呢?

一.上传项目文件的镜像到docker私有仓库

在这里插入图片描述

1)搭建docker私有仓库

docker私有仓库搭建

2)上传项目镜像到docker私有仓库

IDEA推送docker镜像到私服,利用dockerfile-maven-plugin插件在springboot中上传镜像到docker私有仓库

二.YAML的理解

Pod、Deployment、Service的资源通常都是通过Kubernetes REST API提供的JSON或YAML的描述文件来创建的(也可以通过命令直接创建),那么我们创建YAML需要那些属性?刚开始看demo的yaml的属性真的是超级多的,很多名词第一次看很难懂,不过没事,我们只需要理解最基础的部分就可以了,其他的可以以后慢慢熟悉以及根据需要使用

注:即通过创建YAML的描述文件,k8s根据这个YAMl来创建相对应的资源对象

在这里插入图片描述基础的必选参数

# pod的最基础的yaml文件最少需要以下的几个参数
apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同API
kind: Pod  # 对象类型,pod
metadata:  # 元数据
  name: string # POD名称
  namespace: string # 所属的命名空间
spec: # specification of the resource content(资源内容的规范)
  containers: # 容器列表
    - name: string # 容器名称
      image: string # 容器镜像
注:创建一个pod的YAML需要的指定apiVersion版本,kind对象类型、metadata.name对象名称、metadata.namespace对象所属的命令空间,spec.containers.name容器名称,spec.containers.imgae容器镜像,其他对象的yaml类似

创建Deployment的YAML和上面的类似,基本配置参数如下:
在这里插入图片描述

注:

  1. spec.selector.matchLabels是指定标签下的pod被这个创建的Deployment对象管理,通过spec.selector字段来指定这个Deployment管理哪些Pod
  2. spec.replicas=1是指当前Deployment管理的pod的副本数量不能大于也不能少于1
  3. spec.template.metadata.labels是指通过template.metadata.labels字段为即将新建的Pod附加Label。在上面的例子中,通过Deployment新建了的pod它拥有一个键值对为app:countgame和release:canary的Label标签。

三.创建Deployment的YAML描述文件

按照上面的参数配置写一个yaml文件即可,但是如果我们担心写错,可以命令生成一个简单的yaml,然后再根据具体的需要补充即可

kubectl create deployment countgame --image=192.168.137.110:5000/countgame:0.91 --dry-run -o yaml  > deploy.yaml

在这里插入图片描述

注:
1.–dry-run表示测试不在k8s运行(不会具体执行该命令)

  1. -o yaml 生成yaml格式
  2. 最后面的 “> deploy.yaml” 表示将生成yaml内容输出到deploy.yaml文件

直接去掉上面的参数 --dry-run就可以通过命令创建Deployment对象,为什么还要创建yaml的描述文件呢?

因为创建yaml的描述文件可以更方便我们查看和管理更新这些资源对象,打个比方,我们写java代码,yaml文件就好比我们java代码的类,通过yaml创建k8s的资源对象就好比我们通过java类来new一个对象,new出来的对象是在内存里面的。因为上面的yaml没什么参数,所以命令很短,但是如果参数很多,每次更新都要输入长长的命令就很麻烦而且容易出错,所以需要创建yaml文件来管理。

四.创建Deployment对象

kubectl apply -f deploy.yaml

创建了Deployment对象再查看pod

kubectl get pods
注:因为上面的Deploymnent的yaml没有指定命名空间,所以创建的pod在默认的命名空间,这里不需要指定命名空间,如果指定可以再加上 kubectl -n default get pods

在这里插入图片描述这时候把deploy.yaml的spec.replicas改成3,再运行看看
在这里插入图片描述

[root@localhost countgame]# kubectl apply -f deploy.yaml
deployment.apps/countgame configured
[root@localhost countgame]# kubectl get pods
NAME                         READY   STATUS              RESTARTS   AGE
countgame-8694fcf45d-f4q6p   0/1     ContainerCreating   0          3s
countgame-8694fcf45d-jljhw   1/1     Running             0          3s
countgame-8694fcf45d-nx6np   1/1     Running             0          6m31s

可以看到countgame的pod由一个变成了3个

五.查看pod有没有运行成功

虽然看到了pod的状态为Running,但是我们还是想看一下项目的启动日志,以及测试项目里面的url能否返回信息

使用kubectl logs进入容器看看日志

注: kubectl logs +pod的name

在这里插入图片描述可以看到项目已经正常启动了

查看pod的ip地址

这时候试试项目里面的url看看,这时候怎么访问项目里面的接口呢?
我们通过IP地址+端口访问,项目容器暴露的端口是8082,我们先使用kubectl describe pod pod-name
来查看pod的ip地址,再进入pod的控制台页面进行curl,看看页面能不能通
在这里插入图片描述

可以看到其中一个pod的ip地址是10.122.104.12,如果我们这些pod关联了Service对象的话,可以通过 kubectl describe svc svc-name来查看这三个pod的ip地址,如下:

创建Service在下一篇博客描述,创建Serivice以及暴露Service给外部网络请求

在这里插入图片描述

使用kubectl exec进入容器执行curl

kubectl exec countgame-8694fcf45d-g77kf -- curl -s http://10.122.104.12:8082/countgame/user/toGame

可以看到已经有html内容返回了,项目启动正常
在这里插入图片描述

注:其实这里不使用ip地址,使用localhost也行

六.在k8s部署项目的流程图

在这里插入图片描述

本文二维码
最后修改:2023 年 11 月 01 日
如果觉得我的文章对你有用,请随意赞赏