当前位置: 首页 > news >正文

在CSDN学Golang云原生(Kubernetes Pod无状态部署)

一,静态pod

Kubernetes中的Pod是可以动态创建、销毁的,如果希望Pod只使用静态的IP地址而不是自动生成一个IP地址,那么就需要使用静态Pod。

静态Pod是在kubelet启动时通过指定文件夹路径来加载的。当kubelet检测到这些配置文件变化后,它会创建或删除相应的Pod,这样就可以轻松地部署静态配置的Pod。

以下是一个示例静态pod配置文件:

apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80

将上述内容保存为 nginx.yaml 文件并放置在指定目录下(如 /etc/kubernetes/manifests),然后重启kubelet服务即可部署该静态pod。

二,Deployment部署

在Kubernetes中,Deployment是用于部署应用程序的一种资源对象,它定义了一个可伸缩、自修复的应用程序副本集,并通过控制器对这些副本进行管理和协调。

以下是一个示例Deployment配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3   # 副本数为3个selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginx-containerimage: nginx:latest   # 使用最新版nginx镜像ports:- containerPort: 80   # 对外暴露80端口

上述配置文件指定了名称为 nginx-deployment 的Deployment,要求有3个Pod副本。每个Pod都使用最新版本的 nginx 镜像,并将容器内部端口80映射到外部网络中。

创建Deployment可以使用kubectl命令行工具,如下所示:

kubectl apply -f deployment.yaml   # 根据deployment.yaml文件创建或更新Deployment对象

除了上述静态方式外,还可以通过Helm等工具来快速生成和管理复杂的Kubernetes资源对象。

三,Deployment 升级和回滚

在Kubernetes中,Deployment可以实现应用程序的无宕机升级和回滚操作。下面分别介绍如何进行升级和回滚操作:

  1. 升级Deployment

在更新镜像或修改配置等需求时,我们可以通过执行以下命令来更新Deployment:

kubectl set image deployment/nginx-deployment nginx-container=nginx:1.19   # 将容器镜像更新为1.19版本

该命令会自动触发Deployment的rolling update机制,逐步替换旧Pod副本为新副本。此时可以使用 kubectl rollout status 命令来查看升级进度。

  1. 回滚Deployment

如果出现了意外情况,需要将应用程序回滚到以前的版本,则可以执行以下命令:

kubectl rollout undo deployment/nginx-deployment   # 回滚到上一个版本

也可以指定特定的历史版本进行回滚:

kubectl rollout undo deployment/nginx-deployment --to-revision=3   # 回滚到第3个历史版本

此时,Kubernetes会自动将新Pod副本替换为旧版本,并且保证整个过程中不会有宕机时间(零停机)。

四,Deployment暂停与恢复

在Kubernetes中,Deployment提供了一种暂停和恢复Rollout的机制。当需要对应用程序进行升级或回滚操作时,可以使用该机制来控制Rollout过程的暂停和恢复。

  1. 暂停Rollout

执行以下命令可以暂停当前正在进行的Rollout:

kubectl rollout pause deployment/nginx-deployment   # 暂停nginx-deployment的rolling update

此时,新旧Pod副本都不会继续替换。如果想查看Deployment的状态,可以使用 kubectl rollout status 命令。

  1. 恢复Rollout

执行以下命令可以恢复之前被暂停的Rollout:

kubectl rollout resume deployment/nginx-deployment   # 恢复nginx-deployment的rolling update

此时,Kubernetes会自动将新Pod副本逐步替换为旧版本,并保证整个过程中不会有宕机时间(零停机)。

除了上述方法外,还可以通过修改Deployment的 .spec.paused 字段来实现暂停/恢复Rollout。例如:

  • 将Deployment暂停:
    kubectl patch deployment nginx-deployment -p '{"spec":{"paused":true}}'
  • 将Deployment恢复:
    kubectl patch deployment nginx-deployment -p '{"spec":{"paused":false}}'

以上两种方法等价于调用 kubectl rollout pause/resume 命令。

五,Deployment 手动与自动伸缩

在Kubernetes中,Deployment提供了自动伸缩和手动伸缩两种方式。

  1. 自动伸缩

Deployment可以通过 spec.replicas 字段控制Pod副本的数量,同时还可以使用Horizontal Pod Autoscaler (HPA)实现自动伸缩。HPA会根据CPU利用率等指标调整Pod副本的数量,以保证应用程序的可用性和稳定性。

例如,创建一个基于CPU利用率来自动扩展/收缩nginx-deployment的HPA:

kubectl autoscale deployment nginx-deployment --cpu-percent=80 --min=1 --max=10

该命令会创建一个名为 nginx-deployment 的Horizontal Pod Autoscaler对象,并设置CPU利用率达到80%时自动扩展Pod副本数量至最大值10个(如果当前Pod副本数小于1,则会自动创建一个新的Pod)。

  1. 手动伸缩

除了使用HPA进行自动伸缩外,还可以通过手动修改Deployment的 .spec.replicas 字段来进行手动伸缩。例如:

  • 将Pod副本数量增加到3:
    kubectl scale deployment nginx-deployment --replicas=3
  • 将Pod副本数量减少到1:
    kubectl scale deployment nginx-deployment --replicas=1

以上两种方法等价于直接修改Deployment YAML文件中的 .spec.replicas 字段。

需要注意的是,在使用手动伸缩时,应该保证Pod副本数量不会低于 .spec.minReadySeconds 字段所设置的最小可用时间(默认为0),以确保所有新创建的Pod都已经就绪并且能够接受流量。

六,DaemonSet 部署

DaemonSet 是 Kubernetes 中的一种资源类型,用于在每个节点上运行一个 Pod 副本。这里简单介绍下使用 kubectl 部署 golang DaemonSet 的步骤:

  1. 编写 DaemonSet 的 YAML 文件
apiVersion: apps/v1
kind: DaemonSet
metadata:name: example-golang-daemonset
spec:selector:matchLabels:app: example-golangtemplate:metadata:labels:app: example-golangspec:containers:- name: example-golang-containerimage: your_golang_image_name
  1. 使用 kubectl apply 命令部署 DaemonSet
kubectl apply -f your_daemonset_yaml_file.yaml
  1. 查看 DaemonSet 是否部署成功
kubectl get ds example-golang-daemonset

以上就是一个简单的 golang DaemonSet 部署的步骤,可以根据实际需求修改 YAML 文件中的配置信息。

七,Job 批处理

在Kubernetes中,Job是一种用于批处理作业的控制器。一个Job对象会创建一个或多个Pod副本实例来运行指定的容器镜像,并保证这些Pod副本实例能够成功完成任务。

以下是一个简单的golang Job批处理示例:

  1. 编写golang程序

编写一个简单的golang程序 main.go,例如:

package mainimport ("fmt"
)func main() {fmt.Println("Hello from Golang Job!")
}
  1. 创建Docker镜像并推送到仓库

使用Dockerfile将golang程序打包为Docker镜像,并将其推送到镜像仓库中,例如:

FROM golang:1.15-alpine AS build-envRUN apk --no-cache add ca-certificates git && \mkdir /appADD . /app/
WORKDIR /app
RUN go build -o app .FROM alpine:3.12
COPY --from=build-env /app/app /usr/local/bin/app
CMD ["app"]

执行以下命令构建并推送Docker镜像:

$ docker build -t your-repo/golang-job:v1 .
$ docker push your-repo/golang-job:v1
  1. 创建Job YAML文件

创建一个名为 golang-job.yaml 的YAML文件,用于定义Job对象:

apiVersion: batch/v1
kind: Job
metadata:name: golang-job
spec:template:spec:containers:- name: app-containerimage: your-repo/golang-job:v1restartPolicy: NeverbackoffLimit: 3

其中, backoffLimit 字段表示在任务失败时尝试重新运行的次数。

  1. 部署Job

执行以下命令创建并部署Job:

$ kubectl apply -f golang-job.yaml

该命令会在Kubernetes集群中创建一个名为 golang-job 的Job对象,并自动运行一个Pod副本实例。可以使用以下命令查看Job的状态:

$ kubectl get jobs.batch golang-jobNAME         COMPLETIONS   DURATION   AGE
golang-job   1/1           5s        18s

其中, COMPLETIONS 字段表示已经成功完成的任务数, DURATION 字段表示任务完成所用的时间。

  1. 查看日志

可以使用以下命令查看Pod的日志输出:

$ kubectl logs -l job-name=golang-jobHello from Golang Job!

如果任务失败,则可以使用以下命令查看Pod的详细信息和错误日志:

$ kubectl describe pod -l job-name=golang-job...
Events:Type     Reason            Age                From               Message----     ------            ----               ----               -------Normal   Scheduled         <unknown>          default-scheduler  Successfully assigned default/golang-job-6pwlj to node-1.example.comNormal   SuccessfulCreate  <unknown>          kubelet, node-1    Created container app-containerNormal   Started           <unknown>          kubelet, node-1    Started container app-containerWarning  BackoffLimitExceeded  <unknown>       kubelet, node-1    Job has reached the specified backoff limit
...

如果 backoffLimit 字段设置得太小,可能会导致Job在失败后无法重新运行。因此,在实际使用中应该根据任务的复杂程度和容器镜像的稳定性等因素来调整该字段的值。

八,Crontab 定时任务

在Go语言中,我们可以使用第三方库 github.com/robfig/cron 来实现Crontab定时任务。

以下是一个简单的示例:

  1. 安装依赖

首先,需要安装 github.com/robfig/cron 库。可以执行以下命令安装:

$ go get github.com/robfig/cron
  1. 编写代码

创建一个名为 main.go 的文件,并编写以下代码:

package mainimport ("fmt""time""github.com/robfig/cron"
)func main() {c := cron.New()c.AddFunc("0 */5 * * * *", func() {fmt.Println("Run task at", time.Now().Format("2006-01-02 15:04:05"))})c.Start()select {}
}

该程序将每隔5分钟执行一次任务,输出当前时间。

  1. 运行程序

执行以下命令运行程序:

$ go run main.go
  1. 测试结果

等待5分钟后,可以看到程序输出如下内容:

Run task at 2022-08-16 10:00:00
Run task at 2022-08-16 10:05:00
Run task at 2022-08-16 10:10:00
...

这表明任务已经按照设定的时间间隔成功执行了。

注意:在生产环境中,应该将定时任务和其他业务逻辑分开部署,并加入健康检查等机制,以确保系统的稳定性和可靠性。

 

相关文章:

在CSDN学Golang云原生(Kubernetes Pod无状态部署)

一&#xff0c;静态pod Kubernetes中的Pod是可以动态创建、销毁的&#xff0c;如果希望Pod只使用静态的IP地址而不是自动生成一个IP地址&#xff0c;那么就需要使用静态Pod。 静态Pod是在kubelet启动时通过指定文件夹路径来加载的。当kubelet检测到这些配置文件变化后&#x…...

@Bean的作用

Bean通常和Configuration注解一起使用 Bean可以用在方法上&#xff0c;方法返回的对象交给spring容器管理&#xff0c;和提供给其他程序组件使用 Bean是一个注解&#xff0c;用于将方法标记为Spring容器中的一个Bean。具体来说&#xff0c;Bean注解可以用于方法上&#xff0c…...

【论文阅读22】Label prompt for multi-label text classification

论文相关 论文标题&#xff1a;Label prompt for multi-label text classification&#xff08;基于提示学习的多标签文本分类&#xff09; 发表时间&#xff1a;2023 领域&#xff1a;多标签文本分类 发表期刊&#xff1a;Applied Intelligence&#xff08;SCI二区&#xff0…...

EasyExcel数据导出功能封装

起因: 最近需要用到excel导出功能,使用EasyExcel可以快速实现导出,又需要优雅的对EasyExcel进行封装,在实现自己的导出功能时又可以制定一定的规则,让其他同事方便使用,最近研究了下网上的常规写法,站在巨人的肩上重新添加了自己的思路,供大家参考,有任何问题请多指教…...

通过web.xml来配置servlet程序

IDEA 2022.3.3 tomcat-9.0.27 Java EE8 JDK-16 配置访问的虚拟路径 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…...

umi 创建的项目中,如何配置多个环境变量

创建env.js 在config.js中配置 在页面中使用 env.js和config.js的目录顺序 package.json中的配置...

Mysql 5.7 连接数爆满 清理连接数

Mysql 5.7 连接数爆满 清理连接数 我在做项目的时候遇到了这个报错&#xff0c;然后搜了半天也没有在网上找到mysql清理连接数的方案&#xff0c;后面还是自己写了一个 打开MySQL命令行或客户端&#xff0c;并使用管理员权限登录到MySQL服务器。 我这里使用的是navicat 输入…...

HTTPS工作原理

先简述一下什么是HTTPS&#xff0c;HTTPS就是在HTTP的基础上增加了SSL/TLS来完成加密传输&#xff0c;以免敏感信息被第三方获取&#xff0c;所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。 一、客户端发起HTTPS请求 这个没什么好说的&#xff0c;就是…...

十大基础算法

一、选择排序 过程简单描述&#xff1a; 首先&#xff0c;找到数组中最小的那个元素&#xff0c;其次&#xff0c;将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;将它与数组的第二…...

Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)

Java---第八章 字符串String字符串的常用方法StringBuilder和StringBuffer常用方法 对比String 和StringBuilder 和 StringBuffer 字符串 String 特性&#xff1a; String 类位于java.lang包中&#xff0c;无需引入&#xff0c;可直接使用String 类是由final修饰的&#xff…...

k8s集群的部署

【1】安装docker systemctl enable docker所有节点均需要安装docker,并且使其开机自启&#xff0c;每个节点均部署镜像加速器 【2】配置k8s的yum文件 [rootk8s1 ~]# cd /etc/yum.repos.d/ [rootk8s1 yum.repos.d]# vim k8s.repo [rootk8s1 yum.repos.d]# cat k8s.repo [k8s…...

设计模式——观察者模式

文章目录 1 概述2 实现3 总结 1 概述 观察者模式可以分为观察者和被观察者&#xff0c;观察者通过注册到一个被观察者中&#xff0c;也可视为订阅&#xff0c;当被观察者的数据发生改变时&#xff0c;会通知到观察者&#xff0c;观察者可以据此做出反应。 可以类比订阅报纸&am…...

在Debian 12 上安装 PHP 5.6, 7.4

环境&#xff1a;Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错&#xff1a; sudo apt-get install libapache2-mod-php7.4 php7.4 php7.4-gd php7.4-opcache php7.4-mbstring php7.4-xml php7.4-json php7.4-zip php7.4-curl php7.4-imap p…...

微服务——统一网关Getway

为什么需要网关&#xff1f; 网关的两种实现: 网关Getway——快速入门 步骤一 网关背身也是一个微服务&#xff0c;需要注册到nacos中去 步骤二 成功运行后 可以通过网关进行请求转发到对应服务。 流程如下&#xff1a; 路由断言工厂 网关路由可以配置的东西有如下。 spri…...

[ELK安装篇]:基于Docker虚拟容器化(主要LogStash)

文章目录 一&#xff1a;前置准备-(参考之前博客)&#xff1a;1.1&#xff1a;准备Elasticsearch和Kibana环境&#xff1a;1.1.1&#xff1a;地址&#xff1a;https://blog.csdn.net/Abraxs/article/details/128517777 二&#xff1a;Docker安装LogStash(数据收集引擎&#xff…...

纪录片《打铁文艺社》:从全美高中生电影节到多项国际赞誉,聚焦城市公共艺术的蜕变之路

7月21日&#xff0c;在全美高中生电影节&#xff08;All American High School Film Festival&#xff0c;AAHSFF&#xff09;公布的入围名单中&#xff0c;一部取材于中国深圳的纪录片《打铁文艺社Datie: The Art Tribe of Tiegang》以其深刻的主题和精良的制作&#xff0c;引…...

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后&#xff0c;将原本的一个广播域逻辑上&#xff0c;拆 分为多个虚拟的广播域。 VLAN配置&#xff1a; 1.创建VLAN VID—VLAN ID------用来区分和…...

新的CoolSiC™槽沟MOSFET技术,用于低栅氧化物应力和高性能

标题&#xff1a;The new CoolSiC™ Trench MOSFET Technology for Low Gate Oxide Stress and High Performance UPS&#xff08;Uninterruptible Power Supply&#xff09;系统也称不间断电源系统&#xff0c;是一种能够提供电力备用的设备&#xff0c;当主电源出现故障或停…...

【开源项目】低代码数据可视化开发平台-Datav

Datav 基本介绍 Datav是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 它的技术栈为&#xff1a;Vue3 TypeScript4 Vite2 ECharts5 Axios Pinia2 在线预览 账号: admin 密码: 123123预…...

【自动话化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…...

快手无水印下载深度解析:从技术原理到商业应用的完整方案

快手无水印下载深度解析&#xff1a;从技术原理到商业应用的完整方案 【免费下载链接】KS-Downloader 快手&#xff08;KuaiShou&#xff09;视频/图片下载工具&#xff1b;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 在短视频内容管理日…...

WRNavigationBar最佳实践:10个实用技巧提升你的iOS开发效率

WRNavigationBar最佳实践&#xff1a;10个实用技巧提升你的iOS开发效率 【免费下载链接】WRNavigationBar 超简单&#xff01;&#xff01;&#xff01; 一行代码设置状态栏、导航栏按钮、标题、颜色、透明度&#xff0c;移动等 WRNavigationBar which allows you to change …...

5分钟掌握B站评论区智能成分检测:免费高效的互动神器

5分钟掌握B站评论区智能成分检测&#xff1a;免费高效的互动神器 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker B站成…...

揭秘100.64.0.0/10:运营商级NAT如何重塑IPv4网络格局

1. 100.64.0.0/10&#xff1a;这个神秘IP段到底是什么&#xff1f; 第一次在路由器后台看到100.64.0.1这个IP时&#xff0c;我整个人都懵了——这既不是常见的192.168局域网地址&#xff0c;也不是公网IP。就像发现自家门牌号突然变成了酒店房间号&#xff0c;这种违和感促使我…...

STM32H7/TC397 PTP移植踩坑全记录:从Announce报文HardFault到Linux主机‘clock jumped’警告

STM32H7/TC397 PTP移植实战&#xff1a;从HardFault到时钟同步的深度排错指南 当我在TC397和STM32H7平台上移植PTP协议栈时&#xff0c;原以为只是简单的代码迁移&#xff0c;却意外开启了一场持续两周的"排错马拉松"。从诡异的HardFault到Linux主机不断报出的clock …...

IM1281B电量计模块避坑指南:从接线到数据解析的全流程实战

IM1281B电量计模块实战全解析&#xff1a;从硬件对接到数据处理的完整解决方案 在智能电表、能耗监测和物联网设备开发中&#xff0c;精确测量电能消耗是核心需求之一。IM1281B作为一款高性价比的单相电能计量模块&#xff0c;以其Modbus通信协议和直接电能脉冲输出功能&#x…...

Phi-4-mini-reasoning部署案例:科研团队构建内部逻辑验证辅助工具链

Phi-4-mini-reasoning部署案例&#xff1a;科研团队构建内部逻辑验证辅助工具链 1. 项目背景与模型介绍 Phi-4-mini-reasoning 是一款专注于推理任务的文本生成模型&#xff0c;特别适合处理数学题、逻辑题、多步分析和简洁结论输出等场景。与通用聊天模型不同&#xff0c;它…...

告别手动刷课!智慧树网课助手让你的学习效率提升50%

告别手动刷课&#xff01;智慧树网课助手让你的学习效率提升50% 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 你是否厌倦了在智慧树平台上频繁点击"下一集"…...

N_m3u8DL-RE:突破流媒体下载限制的全场景解决方案 - 开发者与内容创作者的高效工具

N_m3u8DL-RE&#xff1a;突破流媒体下载限制的全场景解决方案 - 开发者与内容创作者的高效工具 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_…...

OpenClaw技能开发入门:为Qwen3-14b_int4_awq扩展自定义功能

OpenClaw技能开发入门&#xff1a;为Qwen3-14b_int4_awq扩展自定义功能 1. 为什么需要自定义技能&#xff1f; 去年冬天&#xff0c;我花了整整两周时间手动整理公司项目的技术文档。每天重复着复制、粘贴、格式调整的机械操作&#xff0c;直到偶然发现OpenClaw这个开源自动化…...