admin管理员组

文章数量:1033254

从零拆解

K8s 基础

K8s现在在各家公司的普及度已经很高,网上介绍它的资料也有很多,那什么是K8s呢?它的本名叫Kubernetes(单词太长,后面还是用 K8s 代替 )是一个基于容器技术的分布式架构方案。

它具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和线上扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。

总结一句话:是一套结合了容器编排和集群调度管理的大规模分布式系统解决方案。

在K8s 中会把各种资源抽象成对象--简而言之就是面向对象,大到集群的节点(Node)、小到配置项 (ConfigMap) 都是对象,常用的有以下对象。

Pod是K8s 里的最小调度单元,Pod里面则是容器(一个Pod里可以有多个容器,但只有一个主容器,其他都是辅助它的)。

控制器则是管理 Pod 用的,对于我们来说常用的控制器只有Deployment,它能够控制Pod的滚动更新。

Deployment 是一个复合型的控制器,它包装了一个叫做 ReplicaSet -- 副本集的控制器。ReplicaSet 管理正在运行的Pod数量,Deployment 在其之上实现 Pod 滚动更新,对Pod的运行状况进行健康检查以及回滚更新的能力。他们三者之间的关系可以用下面这张图表示。

这里我就不再过多介绍K8s的一些基础知识啦,如果你对这些内容有兴趣,可以阅读以下我之前写过的一些K8s的文章,里面还引用了很多我学K8s时记录的一些比较基础的内容,推荐大家仔细阅读一下:

  • Docker 和 K8s 的恩怨纠葛
  • K8s 长什么样?一文道清它的整体架构
  • K8s也面向对象?学会这三要素,用K8s就跟编程一样
  • 程序解Bug最常用的K8s命令,外加使用窍门

另外还有就是K8s的操作都是通过kubectl 把指令提交给集群的,这里汇总了一些比较常用的kubectl命令

  • kubectl apply -f xxx.yaml 让K8s 创建在集群里按配置文件创建/更新资源对象
  • kubectl get pod | deploy | svc | ingress 查看集群中的pod、Deployment、Service、Ingress 资源的状态
  • kubectl describe pod | deploy | svc | ingress {$objectName} 查看具体资源对象当前的详细信息
  • kubectl delete pod | deploy | svc | ingress {$objectName} 删除指定对象

Go Mall 项目部署到 K8s

接下来我们演示一下怎么把我们专栏的项目部署到K8s上,首先说明一点,因为我们项目依赖的MySQL和Redis都是在本地电脑上安装的,把项目部署到容器后就没办法再用本地电脑上的MySQL和Redis了,所以在演示项目的K8s部署和运行时还需要把MySQL在Redis都部署到K8s上,这样他们才能在集群内部通信。

所以我们首先把项目中 application.test.yaml 的数据库和Redis的连接配置做一个更改:

代码语言:javascript代码运行次数:0运行复制
app:
......
database:
master:
    type:mysql
    #通过k8s service name连接, 在k8s集群内的管理 mysql pod的service名是mysql
    dsn:root:superpass@tcp(mysql:3306)/go_mall?charset=utf8&parseTime=True&loc=Asia%2FShanghai
    maxopen:100
    maxidle:10
    maxlifetime:300000000000
redis:
addr:redis:6379#通过k8s service name连接, 在k8s集群内的管理 redis pod的service名是redis
password:123456
pool_size: 

这也就意味着我们把项目部署到K8s时,还需要给它指定ENV环境变量为test,这样才能应用上这个配置文件。

接下来我们就看一下go-mall项目的 Deployment 文件的定义

代码语言:javascript代码运行次数:0运行复制
apiVersion: apps/v1
kind:Deployment
metadata:
name:go-mall
spec:
replicas:2
selector:
    matchLabels:
      app:go-mall-app
template:
    metadata:
      labels:
        app:go-mall-app
    spec:
      containers:
        -name:go-mall-container
          image:go-mall:v202501111557
          env:
            -name:ENV
              value:test
          resources:
            limits:
              memory:"200Mi"
              cpu:"50m"
          ports:
            -containerPort:8080
          volumeMounts:
            -name:app-log
              mountPath:/home/applog
      volumes:
        -name:app-log
          hostPath:
            path:/tmp/applog
            type:DirectoryOrCreate

Deployment中template下的配置是关于Pod的定义,其中容器镜像指定的是 go-mall:v202501111557,我们每次发版本部署的时候都会给这个镜像版本,然后再提交给K8s集群让他们负责滚动更新。

env选项中我们指定了ENV=test的环境变量,此外我们还把容器中的日志文件目录/home/applog 挂载到了电脑上的/tmp/applog目录。

把项目部署到K8s上去后,如果不做任何操作它只能在K8s的集群内部访问,如果想要在集群外部能访问就需要用Service把它们暴露出来。

代码语言:javascript代码运行次数:0运行复制
apiVersion: v1
kind:Service
metadata:
name:go-mall-svc
spec:
type:NodePort
selector:
    app:go-mall-app
ports:
    -name:http
      protocol:TCP
      nodePort:32080
      port:8080
      targetPort:8080

这个Service服务管理标签为 app: go-mall-app 的Pod,并把它们通过端口32080暴露到集群外部。

好了关于项目的K8s配置介绍的差不多了,但是我们现在还不能把它们提交给K8s,需要先把依赖的MySQL和Redis部署上去。这里我给大家准备好了运行整个项目需要的全套K8s配置,点下面的链接即可下载:.zip

需订阅专栏后联系我开通项目权限才能访问

下载解压后,项目的目录如下:

部署到K8s后怎么调试

把我们的项目部署到K8s后,因为在容器中运行,想要调试就没有在本地IDE里那么方便了,这里介绍几个必要的命令帮助大家调试。

首先是kubctl get pods | grep go-mall 来查看现在正运行着go-mall项目的Pod,上面我们讲解过,我们给项目分配了两个复制集,所以这个命令会显示出两个Pod。

如果我们想要要登录到其中一个Pod中,那么需要我们执行以下命令(注意下面的Pod名称 go-mall- 后面是随机的,执行时记得换成自己当时查看到的Pod名称)

代码语言:javascript代码运行次数:0运行复制
kubectl exec -it go-mall-6459549b69-cmwsb -- /bin/sh

假如说我们通过kubectl get pods 查看Pod时发现 go-mall-6459549b69-cmwsb 这个Pod 启动失败了,大概率是项目启动时有问题,那么这个时候需要我们查看Pod当时写到标准输出中的日志,怎么查看呢?用下面这个命令。

代码语言:javascript代码运行次数:0运行复制
kubectl logs go-mall-6459549b69-cmwsb

执行的时候也是记得要换成自己的Pod名哦,不要直接抄过去。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent 删除部署管理集群go容器

从零拆解

K8s 基础

K8s现在在各家公司的普及度已经很高,网上介绍它的资料也有很多,那什么是K8s呢?它的本名叫Kubernetes(单词太长,后面还是用 K8s 代替 )是一个基于容器技术的分布式架构方案。

它具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和线上扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。

总结一句话:是一套结合了容器编排和集群调度管理的大规模分布式系统解决方案。

在K8s 中会把各种资源抽象成对象--简而言之就是面向对象,大到集群的节点(Node)、小到配置项 (ConfigMap) 都是对象,常用的有以下对象。

Pod是K8s 里的最小调度单元,Pod里面则是容器(一个Pod里可以有多个容器,但只有一个主容器,其他都是辅助它的)。

控制器则是管理 Pod 用的,对于我们来说常用的控制器只有Deployment,它能够控制Pod的滚动更新。

Deployment 是一个复合型的控制器,它包装了一个叫做 ReplicaSet -- 副本集的控制器。ReplicaSet 管理正在运行的Pod数量,Deployment 在其之上实现 Pod 滚动更新,对Pod的运行状况进行健康检查以及回滚更新的能力。他们三者之间的关系可以用下面这张图表示。

这里我就不再过多介绍K8s的一些基础知识啦,如果你对这些内容有兴趣,可以阅读以下我之前写过的一些K8s的文章,里面还引用了很多我学K8s时记录的一些比较基础的内容,推荐大家仔细阅读一下:

  • Docker 和 K8s 的恩怨纠葛
  • K8s 长什么样?一文道清它的整体架构
  • K8s也面向对象?学会这三要素,用K8s就跟编程一样
  • 程序解Bug最常用的K8s命令,外加使用窍门

另外还有就是K8s的操作都是通过kubectl 把指令提交给集群的,这里汇总了一些比较常用的kubectl命令

  • kubectl apply -f xxx.yaml 让K8s 创建在集群里按配置文件创建/更新资源对象
  • kubectl get pod | deploy | svc | ingress 查看集群中的pod、Deployment、Service、Ingress 资源的状态
  • kubectl describe pod | deploy | svc | ingress {$objectName} 查看具体资源对象当前的详细信息
  • kubectl delete pod | deploy | svc | ingress {$objectName} 删除指定对象

Go Mall 项目部署到 K8s

接下来我们演示一下怎么把我们专栏的项目部署到K8s上,首先说明一点,因为我们项目依赖的MySQL和Redis都是在本地电脑上安装的,把项目部署到容器后就没办法再用本地电脑上的MySQL和Redis了,所以在演示项目的K8s部署和运行时还需要把MySQL在Redis都部署到K8s上,这样他们才能在集群内部通信。

所以我们首先把项目中 application.test.yaml 的数据库和Redis的连接配置做一个更改:

代码语言:javascript代码运行次数:0运行复制
app:
......
database:
master:
    type:mysql
    #通过k8s service name连接, 在k8s集群内的管理 mysql pod的service名是mysql
    dsn:root:superpass@tcp(mysql:3306)/go_mall?charset=utf8&parseTime=True&loc=Asia%2FShanghai
    maxopen:100
    maxidle:10
    maxlifetime:300000000000
redis:
addr:redis:6379#通过k8s service name连接, 在k8s集群内的管理 redis pod的service名是redis
password:123456
pool_size: 

这也就意味着我们把项目部署到K8s时,还需要给它指定ENV环境变量为test,这样才能应用上这个配置文件。

接下来我们就看一下go-mall项目的 Deployment 文件的定义

代码语言:javascript代码运行次数:0运行复制
apiVersion: apps/v1
kind:Deployment
metadata:
name:go-mall
spec:
replicas:2
selector:
    matchLabels:
      app:go-mall-app
template:
    metadata:
      labels:
        app:go-mall-app
    spec:
      containers:
        -name:go-mall-container
          image:go-mall:v202501111557
          env:
            -name:ENV
              value:test
          resources:
            limits:
              memory:"200Mi"
              cpu:"50m"
          ports:
            -containerPort:8080
          volumeMounts:
            -name:app-log
              mountPath:/home/applog
      volumes:
        -name:app-log
          hostPath:
            path:/tmp/applog
            type:DirectoryOrCreate

Deployment中template下的配置是关于Pod的定义,其中容器镜像指定的是 go-mall:v202501111557,我们每次发版本部署的时候都会给这个镜像版本,然后再提交给K8s集群让他们负责滚动更新。

env选项中我们指定了ENV=test的环境变量,此外我们还把容器中的日志文件目录/home/applog 挂载到了电脑上的/tmp/applog目录。

把项目部署到K8s上去后,如果不做任何操作它只能在K8s的集群内部访问,如果想要在集群外部能访问就需要用Service把它们暴露出来。

代码语言:javascript代码运行次数:0运行复制
apiVersion: v1
kind:Service
metadata:
name:go-mall-svc
spec:
type:NodePort
selector:
    app:go-mall-app
ports:
    -name:http
      protocol:TCP
      nodePort:32080
      port:8080
      targetPort:8080

这个Service服务管理标签为 app: go-mall-app 的Pod,并把它们通过端口32080暴露到集群外部。

好了关于项目的K8s配置介绍的差不多了,但是我们现在还不能把它们提交给K8s,需要先把依赖的MySQL和Redis部署上去。这里我给大家准备好了运行整个项目需要的全套K8s配置,点下面的链接即可下载:.zip

需订阅专栏后联系我开通项目权限才能访问

下载解压后,项目的目录如下:

部署到K8s后怎么调试

把我们的项目部署到K8s后,因为在容器中运行,想要调试就没有在本地IDE里那么方便了,这里介绍几个必要的命令帮助大家调试。

首先是kubctl get pods | grep go-mall 来查看现在正运行着go-mall项目的Pod,上面我们讲解过,我们给项目分配了两个复制集,所以这个命令会显示出两个Pod。

如果我们想要要登录到其中一个Pod中,那么需要我们执行以下命令(注意下面的Pod名称 go-mall- 后面是随机的,执行时记得换成自己当时查看到的Pod名称)

代码语言:javascript代码运行次数:0运行复制
kubectl exec -it go-mall-6459549b69-cmwsb -- /bin/sh

假如说我们通过kubectl get pods 查看Pod时发现 go-mall-6459549b69-cmwsb 这个Pod 启动失败了,大概率是项目启动时有问题,那么这个时候需要我们查看Pod当时写到标准输出中的日志,怎么查看呢?用下面这个命令。

代码语言:javascript代码运行次数:0运行复制
kubectl logs go-mall-6459549b69-cmwsb

执行的时候也是记得要换成自己的Pod名哦,不要直接抄过去。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent 删除部署管理集群go容器

本文标签: 从零拆解