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

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOV8最强操作教程.

YoloV8详细训练教程. 相信各位都知道yolov8发布了&#xff0c;也是U神大作&#xff0c;而且V8还会出论文喔&#xff01; 2023.1.17 更新 yolov8-grad-cam热力图可视化链接 2023.1.20 更新 YOLOV8改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU 链接 2023.1.30 更新 如果你需要修改或者…

最新Ai创作源码ChatGPT商用运营源码/支持GPT4.0+支持ai绘画+支持Mind思维导图生成

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 支持GPT3模型、GPT4模型Midjourney专业绘画&#xff08;全自定义调参&#xff09;、Midjourney以图生图、Dall-E2绘画Mind思维导图生成应用工作台&#xff08;Prompt&#xff09;AI绘画广场自定…

前端高级面试题-浏览器

1 事件机制 事件触发三阶段 document 往事件触发处传播&#xff0c;遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 document 传播&#xff0c;遇到注册的冒泡事件会触发 事件触发⼀般来说会按照上⾯的顺序进⾏&#xff0c;但是也有特例&#x…

基于Spring包扫描工具和MybatisPlus逆向工程组件的数据表自动同步机制

公司产品产出的项目较多。同步数据库表结构工作很麻烦。一个alter语句要跑到N个客户机上执行脚本。超级费时麻烦。介于此&#xff0c;原有方案是把增量脚本放到一resource包下&#xff0c;项目启动时执行逐行执行一次。但由于模块开发人员较多&#xff0c;总有那么一两个机灵鬼…

高电压放大器ATA-2021B技术指标

随着ATA-2021H高压放大器的升级改版&#xff0c;新品ATA-2021B高电压放大器走进了更多工程师、研究人员的视野。相比于升级之前&#xff0c;ATA-2021B高压放大器拥有了更多更好地优势&#xff0c;可以更好地的帮助研究人员高效完成测试项目。今天Aigtek小编就带大家了解一下关于…

windos 服务器设置指定ip访问指定端口,其他ip不能访问

需求&#xff1a;设置指定ip访问指定端口&#xff0c;其他ip不能访问 一&#xff0c;禁止所有ip访问 需要打开IP安全策略 或者winR 输入secpol.msc 1.先创建一个ip安全策略 2.点击添加&#xff0c;不使用添加向导&#xff0c;建一个安全策略 继续点添加 二&#xff0c;放开需…

苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供…

【chatGpt】关于websocket连接中对未授权的捕捉问题

目录 问题 有效提问 有效的细节提问 问题 一路上&#xff0c;通过简单的error进行判断弹出授权&#xff0c;会有很多乱弹的现象&#xff1a; &#xff08;1&#xff09;链路正常切换会断 &#xff08;2&#xff09;服务器没有启动会连接不上 &#xff08;3&#xff09;没…

Python pygame(GUI编程)模块最完整教程(7)

上一篇文章&#xff1a; Python pygame(GUI编程)模块最完整教程&#xff08;6&#xff09;_Python-ZZY的博客-CSDN博客 总目录&#xff1a; README.md Python-ZZY/Python-Pygame最完整教程 - Gitee.com 21 OpenGL与Pygame 不会OpenGL的读者可以跳过本章节。 21.1 OpenGL简…

CRM系统化整合从N-1做减法实践 | 京东物流技术团队

1 背景 京销易系统已经接入大网、KA以及云仓三个条线商机&#xff0c;每个条线商机规则差异比较大&#xff0c;当前现状是独立实现三套系统分别做支撑。 2 目标 2022年下半年CRM目标是完成9个新条线业务接入&#xff0c;完成销售过程线上化&#xff0c;实现销售规则统一。 …

js版计算比亚迪行驶里程连续12个月计算不超3万公里改进版带echar

<!DOCTYPE html> <html lang"zh-CN" style"height: 100%"> <head> <meta charset"utf-8" /> <title>连续12个月不超3万公里计算LIGUANGHUA</title> <style> .clocks { …

【Kafka】自动提交偏移量和手动提交偏移量的区别

区别 自动提交偏移量&#xff08;Auto Commit Offset&#xff09;和手动提交偏移量&#xff08;Manual Commit Offset&#xff09;是两种不同的消费者偏移量管理方式。 自动提交偏移量&#xff1a; 在自动提交模式下&#xff0c;消费者会定期自动将已消费的消息偏移量提交给…

python二叉树遍历模板

深度遍历 递归版本 # Definition for a binary tree node. class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself.left leftself.right rightclass Solution:# 前序遍历def preorderTraversal(self, root: TreeNode) -> list[int]:if not r…

AI大模型“卷”到了旅游业?

现如今&#xff0c;沉寂许久的旅游行业再度活跃起来&#xff0c;迎来了新的增长。无论是出圈的淄博烧烤&#xff0c;还是火热的大学生“特种兵式旅游”&#xff0c;无一不在印证着人们的出游热情。以此前的端午假期为例&#xff0c;据文化和旅游部数据中心综合测算&#xff0c;…

如何卸载,重新安装MySQL

在Linux系统上面卸载的重新安装MySQL的一般步骤&#xff1a; 1. 卸载MySQL&#xff1a; sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean 上述命令将卸载MySQL服务器、客户端和常用文件&#xff0c;并清…

计算机组成原理问答5

CPU CPU两大核心部件&#xff1a;运算器控制器 运算器的核心&#xff1a;ALU&#xff08;算数逻辑单元&#xff09;&#xff0c;功能&#xff1a;对数据进行加工。基本结构&#xff1a;ALU、暂存寄存器、通用寄存器组、累加寄存器ACC、程序状态寄存器PSW、移位器、计数器。 …

第一次编程测试(分频器)

一&#xff0c;分频器 定义 分频器&#xff08;Divider&#xff09;是一种电子电路或设备&#xff0c;用于将输入信号的频率降低到较低的频率。它常用于数字系统、通信系统和计时应用中。原理 整数分频器使用计数器来实现频率的降低。计数器根据输入信号的边沿触发进行计数&am…

Mybatis学习笔记教程

Mybatis-9.28 环境&#xff1a; JDK1.8Mysql 5.7maven 3.6.1IDEA 回顾&#xff1a; JDBCMysqlJava基础MavenJunit SSM框架&#xff1a;配置文件的。 最好的方式&#xff1a;看官网文档&#xff1b; 1、简介 1.1、什么是Mybatis MyBatis 是一款优秀的持久层框架它支持定制…

[数学建模] 0、关于数学建模的一点看法付费专栏食用说明

文章目录 1、前言2、数学建模学习索引2.1、建模知识点 3、实战建模论文索引3.1、国赛真题索引3.1.1、[数学建模] [2001年国赛模拟] 1. 血管的三维重建3.1.2、[数学建模] [2011年B国赛模拟] 2. 交巡警服务平台的设置与调度3.1.3、[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价 3…

SpringBoot 读取配置文件的4种方式

SpringBoot 读取配置文件的4种方式 1 使用Value注解2 使用ConfigurationProperties注解3 使用Environment4 使用PropertySource注解4.0 new.yml4.1 PropertySource 支持 yml/yaml 文件4.2 使用PropertySource注解 配置文件 server:port: 8080servlet:context-path: /elasticse…