在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可以实现应用程序的无宕机升级和回滚操作。下面分别介绍如何进行升级和回滚操作:
- 升级Deployment
在更新镜像或修改配置等需求时,我们可以通过执行以下命令来更新Deployment:
kubectl set image deployment/nginx-deployment nginx-container=nginx:1.19 # 将容器镜像更新为1.19版本
该命令会自动触发Deployment的rolling update机制,逐步替换旧Pod副本为新副本。此时可以使用 kubectl rollout status
命令来查看升级进度。
- 回滚Deployment
如果出现了意外情况,需要将应用程序回滚到以前的版本,则可以执行以下命令:
kubectl rollout undo deployment/nginx-deployment # 回滚到上一个版本
也可以指定特定的历史版本进行回滚:
kubectl rollout undo deployment/nginx-deployment --to-revision=3 # 回滚到第3个历史版本
此时,Kubernetes会自动将新Pod副本替换为旧版本,并且保证整个过程中不会有宕机时间(零停机)。
四,Deployment暂停与恢复
在Kubernetes中,Deployment提供了一种暂停和恢复Rollout的机制。当需要对应用程序进行升级或回滚操作时,可以使用该机制来控制Rollout过程的暂停和恢复。
- 暂停Rollout
执行以下命令可以暂停当前正在进行的Rollout:
kubectl rollout pause deployment/nginx-deployment # 暂停nginx-deployment的rolling update
此时,新旧Pod副本都不会继续替换。如果想查看Deployment的状态,可以使用 kubectl rollout status
命令。
- 恢复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提供了自动伸缩和手动伸缩两种方式。
- 自动伸缩
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)。
- 手动伸缩
除了使用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 的步骤:
- 编写 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
- 使用 kubectl apply 命令部署 DaemonSet
kubectl apply -f your_daemonset_yaml_file.yaml
- 查看 DaemonSet 是否部署成功
kubectl get ds example-golang-daemonset
以上就是一个简单的 golang DaemonSet 部署的步骤,可以根据实际需求修改 YAML 文件中的配置信息。
七,Job 批处理
在Kubernetes中,Job是一种用于批处理作业的控制器。一个Job对象会创建一个或多个Pod副本实例来运行指定的容器镜像,并保证这些Pod副本实例能够成功完成任务。
以下是一个简单的golang Job批处理示例:
- 编写golang程序
编写一个简单的golang程序 main.go
,例如:
package mainimport ("fmt"
)func main() {fmt.Println("Hello from Golang Job!")
}
- 创建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
- 创建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
字段表示在任务失败时尝试重新运行的次数。
- 部署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
字段表示任务完成所用的时间。
- 查看日志
可以使用以下命令查看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定时任务。
以下是一个简单的示例:
- 安装依赖
首先,需要安装 github.com/robfig/cron
库。可以执行以下命令安装:
$ go get github.com/robfig/cron
- 编写代码
创建一个名为 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分钟执行一次任务,输出当前时间。
- 运行程序
执行以下命令运行程序:
$ go run main.go
- 测试结果
等待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无状态部署)
一,静态pod Kubernetes中的Pod是可以动态创建、销毁的,如果希望Pod只使用静态的IP地址而不是自动生成一个IP地址,那么就需要使用静态Pod。 静态Pod是在kubelet启动时通过指定文件夹路径来加载的。当kubelet检测到这些配置文件变化后&#x…...
@Bean的作用
Bean通常和Configuration注解一起使用 Bean可以用在方法上,方法返回的对象交给spring容器管理,和提供给其他程序组件使用 Bean是一个注解,用于将方法标记为Spring容器中的一个Bean。具体来说,Bean注解可以用于方法上,…...

【论文阅读22】Label prompt for multi-label text classification
论文相关 论文标题:Label prompt for multi-label text classification(基于提示学习的多标签文本分类) 发表时间:2023 领域:多标签文本分类 发表期刊:Applied Intelligence(SCI二区࿰…...
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 连接数爆满 清理连接数 我在做项目的时候遇到了这个报错,然后搜了半天也没有在网上找到mysql清理连接数的方案,后面还是自己写了一个 打开MySQL命令行或客户端,并使用管理员权限登录到MySQL服务器。 我这里使用的是navicat 输入…...
HTTPS工作原理
先简述一下什么是HTTPS,HTTPS就是在HTTP的基础上增加了SSL/TLS来完成加密传输,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。 一、客户端发起HTTPS请求 这个没什么好说的,就是…...

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

Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)
Java---第八章 字符串String字符串的常用方法StringBuilder和StringBuffer常用方法 对比String 和StringBuilder 和 StringBuffer 字符串 String 特性: String 类位于java.lang包中,无需引入,可直接使用String 类是由final修饰的ÿ…...
k8s集群的部署
【1】安装docker systemctl enable docker所有节点均需要安装docker,并且使其开机自启,每个节点均部署镜像加速器 【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 概述 观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸&am…...

在Debian 12 上安装 PHP 5.6, 7.4
环境:Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错: 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
为什么需要网关? 网关的两种实现: 网关Getway——快速入门 步骤一 网关背身也是一个微服务,需要注册到nacos中去 步骤二 成功运行后 可以通过网关进行请求转发到对应服务。 流程如下: 路由断言工厂 网关路由可以配置的东西有如下。 spri…...

[ELK安装篇]:基于Docker虚拟容器化(主要LogStash)
文章目录 一:前置准备-(参考之前博客):1.1:准备Elasticsearch和Kibana环境:1.1.1:地址:https://blog.csdn.net/Abraxs/article/details/128517777 二:Docker安装LogStash(数据收集引擎ÿ…...

纪录片《打铁文艺社》:从全美高中生电影节到多项国际赞誉,聚焦城市公共艺术的蜕变之路
7月21日,在全美高中生电影节(All American High School Film Festival,AAHSFF)公布的入围名单中,一部取材于中国深圳的纪录片《打铁文艺社Datie: The Art Tribe of Tiegang》以其深刻的主题和精良的制作,引…...

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

新的CoolSiC™槽沟MOSFET技术,用于低栅氧化物应力和高性能
标题:The new CoolSiC™ Trench MOSFET Technology for Low Gate Oxide Stress and High Performance UPS(Uninterruptible Power Supply)系统也称不间断电源系统,是一种能够提供电力备用的设备,当主电源出现故障或停…...

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

【自动话化运维】Ansible常见模块的运用
目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1.command 模块3.2.shell 模块3.3.cron 模块3.4.user 模块3.5.group 模块3.6.copy 模块3.7.file 模块8ÿ…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...