k8s-(六)在kubernertes上部署运行项目

Kubernetes如何部署项目

    前面的博客总结了k8s的概念以及集群部署,那么,k8s集群都搭建好了,搭建了集群,最重要的是要干嘛?肯定要部署我们的项目程序,把我们的项目放到k8s上运行。

    在docker的时候,我们通过docker镜像生成容器运行,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运行(不会具体执行该命令)
2. -o yaml 生成yaml格式
3. 最后面的 “> 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部署项目的流程图

在这里插入图片描述

要将正在 k8s-node1 节点上运行的名为 apache-pod 的 pod 扩容到 k8s-node2 节点,并同时在这两个节点上运行 pod,请按照以下步骤操作: 1. 创建一个 deployment,指定 pod 的副本数为 2,并使用 nodeSelector 将这两个 pod 分别调度到 k8s-node1 和 k8s-node2 节点上。可以使用以下 YAML 文件创建 deployment: ``` apiVersion: apps/v1 kind: Deployment metadata: name: apache-pod spec: replicas: 2 selector: matchLabels: app: apache-pod template: metadata: labels: app: apache-pod spec: nodeSelector: kubernetes.io/hostname: k8s-node1 containers: - name: apache-container image: httpd:latest ports: - containerPort: 80 ``` 在这个 YAML 文件中,我们使用 nodeSelector 将第一个 pod 调度到 k8s-node1 节点上,第二个 pod 调度到 k8s-node2 节点上。注意,我们在 template.spec.containers 中指定了容器的镜像和端口号,这里使用的是 httpd 镜像,端口号是 80。 2. 使用 kubectl apply 命令应用这个 YAML 文件: ``` kubectl apply -f deployment.yaml ``` 3. 使用 kubectl get pods 命令检查 pod 状态,确认这两个 pod 都在运行: ``` kubectl get pods -o wide ``` 在输出中,你会看到两个 apache-pod 的副本都在运行,其中一个在 k8s-node1 节点上,另一个在 k8s-node2 节点上。 需要注意的是,使用 nodeSelector 指定 pod 调度到特定节点上可能会降低集群的灵活性,因为这样做会使节点的资源分配不均衡。如果你的集群中有多个节点,最好使用 Kubernetes 的调度器来自动地将 pod 调度到空闲节点上。你可以使用 nodeAffinity 和 podAntiAffinity 等特性来控制 pod 的调度行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值