在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ÿ…...

深入理解C语言中的字符指针初始化与用法
字符指针初始化 - C 语言详解 目录 1. 介绍 2. 字符指针初始化的基础 3. 使用 const 关键字的字符指针初始化 4. C 语言与 C 在字符指针初始化的差异 5. 常见陷阱与最佳实践 6. 进阶概念:指针算术与动态内存分配 7. 字符串函数与字符指针 8. 结论介绍 在 C 语言中…...

es添加索引命令行和浏览器添加索引--图文详解
一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…...

Java 大数字运算之 BigDecimal 类
在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。今天主要讲一下 BigDecimal 类 …...

MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)
文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)MySQL二进制日志(Binary log)二进制日志文件的相关配置二进制日志文件的相关参数的说明二进制日志的格式设置二进制日志的格式 二进制…...

MY.CNF
# [client] port 3306 socket /var/lib/mysql/mysql.sock [mysql] prompt "\umysqldb \R:\m:\s [\d]> " no_auto_rehash loose-skip-binary-as-hex [mysqld] user mysql port 3306 #主从复制或MGR集群中,server_id记得要不同 #另外…...

SpringBoot IOC与AOP(一)
IOC AOP 一、 分层解耦 内聚: 软件中各个功能模块内部的功能联系 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度 软件设计原则:高内聚、低耦合 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到…...

JVM运行时数据区——方法区的垃圾回收
方法区的垃圾回收主要是两部分:运行时常量池中废弃的常量和不在使用的类。 类卸载(将不在使用的类回收)的条件: 该类的所有实例均被回收。 加载该类的类加载器被回收(一般很难满足)。 类对象不再引用,通过反射也获取不到。...

LeetCode213.House-Robber-II<打家劫舍II>
题目: 思路: 在版本一中增加了一个条件 那就是首尾相关联。那么只需要进行两次循环即可。 第一次是循环是偷第一家的 那么循环到n-1 截至 并且保存一个cmp 第二次循环是不偷第一家的 循环到n截至。然后比较cmp 与 dp [n] 的最大值即可。 代码是&#…...

订单系统问题汇总
1、项目启动失败 原因是pom中既配置了mybatis又配置了mybatis-plus 2、idea连接后提示缺少MySQL驱动,直接根据提示安装就好 3、解析请求得到的json为对象时候报错,待解析的对象是泛型对象 String regionsInfo OkHttpRequestUtils.sendGetRequest(new…...

springboot热加载spring-boot-devtools:
springboot热加载 基于idea开发springboot项目使用热加载 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</op…...