当前位置: 首页 > 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…...

身份证OCR识别接口接入实战:Python/Java/PHP/C#四语言代码示例与踩坑指南

#身份证OCR, #OCR接口, #API接入, #Python示例, #Java示例, #PHP示例, #踩坑指南, #石榴智能, #实名认证, #图片识别 身份证OCR识别接口接入实战&#xff1a;Python/Java/PHP/C#四语言代码示例与踩坑指南 作者&#xff1a;石榴智能技术团队 一、前言 身份证OCR识别已经不是什…...

AI智能体到底强在哪?为什么大家开始从“养龙虾”转向“养马”

那么AI智能体的核心能力是什么&#xff1f; 1、理解需求 它能分析你的真实意图&#xff0c;而不是只看表面的文字&#xff0c;比如让它整理这个月的消费情况&#xff0c;它明白之后&#xff0c;会读取账单&#xff0c;做分类统计&#xff0c;生成总结&#xff0c;最后输出图表。…...

如何从零构建智能FOC轮腿机器人:完整开源硬件系统终极指南

如何从零构建智能FOC轮腿机器人&#xff1a;完整开源硬件系统终极指南 【免费下载链接】foc-wheel-legged-robot Open source materials for a novel structured legged robot, including mechanical design, electronic design, algorithm simulation, and software developme…...

智能体所有权与版权:AI Agent Harness Engineering 创造的作品归谁所有?

1. 标题选项 《AI Agent创作版权迷局破解:从Harness工程原理到所有权划分的完整指南》 《智能体作品归谁?AI Agent Harness Engineering场景下的版权规则深度拆解》 《告别权属纠纷:一文搞懂AI Agent生成内容的所有权、版权与收益分配规则》 《Harness工程视角下的AI创作权:…...

Burp Suite证书安装全解:HTTPS抓包失败的根源与跨平台命令行方案

1. 为什么必须亲手安装Burp Suite证书——不是“点一下就完事”的操作很多人第一次在手机或测试设备上配置Burp Suite代理时&#xff0c;会下意识认为&#xff1a;只要把电脑上的Burp监听地址填进Wi-Fi代理设置&#xff0c;再用浏览器访问http://burp&#xff0c;点击那个绿色的…...

基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战

1. 项目概述与核心价值最近几年&#xff0c;我身边越来越多的朋友开始关注家里的空气质量、温湿度这些看不见摸不着&#xff0c;但又实实在在影响生活舒适度和健康的环境指标。从新装修的房子担心甲醛&#xff0c;到有老人小孩的家庭在意PM2.5和二氧化碳浓度&#xff0c;再到南…...

OpenIPC开源固件:5分钟解锁网络摄像头的终极控制权

OpenIPC开源固件&#xff1a;5分钟解锁网络摄像头的终极控制权 【免费下载链接】firmware Alternative IP Camera firmware from an open community 项目地址: https://gitcode.com/gh_mirrors/fir/firmware 还在为网络摄像头的封闭系统而烦恼吗&#xff1f;想要完全掌控…...

用PyTorch复现FactorVAE:一个能同时预测收益和风险的量化模型实战教程

用PyTorch实战FactorVAE&#xff1a;构建收益与风险双预测的量化模型 在量化投资领域&#xff0c;传统线性因子模型正逐渐被非线性机器学习方法所取代。然而金融数据特有的低信噪比特性&#xff0c;使得直接从市场数据中提取有效因子成为一项艰巨挑战。本文将深入探讨如何利用P…...

taotoken用量看板如何帮助团队精细化管理api调用成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken用量看板如何帮助团队精细化管理api调用成本 对于团队管理者而言&#xff0c;将大模型能力集成到产品开发或业务流程中&am…...

【C++】零基础入门 · 第 5 节:函数基础

前面四节我们写的代码都集中在 main 函数里。随着程序变复杂,所有逻辑堆在一起会越来越难维护。函数就是用来解决这个问题的——它把一段代码「打包」起来,取个名字,需要的时候调用就行。 1. 为什么需要函数 假设你需要在程序的不同地方打印一行分隔线: cout << &…...