基于Golang实现Kubernetes边车模式
本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式,并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go[1]
在这篇文章中,我们会介绍 Sidecar 模式,并创建两个基于 Go 的容器化微服务,然后部署到 Kubernetes 上。
什么是 Sidecar 模式?
Sidecar 模式是一种软件架构设计模式,尤其适用于构建和部署微服务。其主要表现为在主应用容器旁部署附加服务,称为"边车(Sidecar)",在不改变主应用程序功能的情况下增强其功能,这种模式常用于容器化应用程序。
服务
-
Sidecar 认证服务(Go) -
主服务(Go)
主服务
主服务非常简单,只有一个 API 端点,该端点以 HTTP 响应的形式返回 JSON 消息。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
fmt.Println("Api Go!")
r := gin.Default()
r.GET("/ping", ping)
r.Run(":8080")
}
func ping(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}
Dockefile
FROM golang:1.22-alpine as builder
WORKDIR /go/app
COPY . .
RUN go build -v -o app cmd/api/main.go
FROM alpine
COPY --from=builder /go/app/ .
EXPOSE 8080
CMD ["/app"]
运行以下命令编译 Docker 镜像。
docker build -t mertcakmak2/go-container .
Sidecar 服务
Sidecar 服务会将传入的 HTTP 请求转发给主服务。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
fmt.Println("Sidecar Go!")
r := gin.Default()
// Reverse Proxy
r.Any("/*proxyPath", authProxy)
r.Run(":8081")
}
// Simulate Auth
func authProxy(c *gin.Context) {
// Bearer Token Check...
// MAIN CONTAINER URL
remote, err := url.Parse("http://localhost:8080")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.Director = func(req *http.Request) {
req.Header = c.Request.Header
req.Host = remote.Host
req.URL.Scheme = remote.Scheme
req.URL.Host = remote.Host
req.URL.Path = c.Param("proxyPath")
}
proxy.ServeHTTP(c.Writer, c.Request)
}
Dockerfile
FROM golang:1.22-alpine as builder
WORKDIR /go/app
COPY . .
RUN go build -v -o app cmd/sidecar/main.go
FROM alpine
COPY --from=builder /go/app/ .
EXPOSE 8081
CMD ["/app"]
运行以下命令编译 Docker 镜像。
docker build -f Dockerfile.sidecar -t mertcakmak2/go-sidecar .
Kubernetes 部署
-
Kubernetes 部署文件
apiVersion: v1
kind: Service
metadata:
name: go-container-sidecar
spec:
selector:
app: go-container-sidecar
ports:
- protocol: "TCP"
name: main-container-port
port: 8080
targetPort: 8080
- protocol: "TCP"
name: sidecar-container-port
port: 8081
targetPort: 8081
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-container-sidecar
spec:
selector:
matchLabels:
app: go-container-sidecar
replicas: 1
template:
metadata:
labels:
app: go-container-sidecar
spec:
containers:
- name: go-container
image: mertcakmak2/go-container:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
- name: go-sidecar
image: mertcakmak2/go-sidecar:latest
imagePullPolicy: Always
ports:
- containerPort: 8081
创建部署文件,在不同端口上公开两个服务。
主服务 => 8080 Sidecar 服务 => 8081
运行以下命令进行部署。
kubectl apply -f k8s-deployment.yaml
Kubernetes 控制面板
-
包含两个容器的 Pod。
发送 HTTP 请求
-
访问 Minikube 服务
minikube service go-container-sidecar --url
生成了两个 URL,第一个 URL 是主服务,第二个 URL 是 Sidecar 服务。
主服务 => http://127.0.0.1:57496 Sidecar 服务 => http://127.0.0.1:57497
-
用 Curl 命令发送请求。
-
API 返回了 JSON 消息,我们看一下容器日志。
Sidecar 服务将这些传入的 HTTP 请求转发给主服务。
参考资料
Kubernetes Sidecar Container - Best Practices and Examples[2]
Sidecar Container: What is it and How to use it (Examples)[3]
你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
Sidecar Pattern with Kubernetes and Go: https://medium.com/@mertcakmak2/sidecar-pattern-with-kubernetes-and-go-68e0278c5260
[2]Kubernetes Sidecar Container - Best Practices and Examples: https://spacelift.io/blog/kubernetes-sidecar-container
[3]Sidecar Container: What is it and How to use it (Examples): https://kodekloud.com/blog/kubernetes-sidecar-container
本文由 mdnice 多平台发布
相关文章:
基于Golang实现Kubernetes边车模式
本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式,并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go[1] 在这篇文章中,我们会介绍 Sidecar 模式…...
TCP 通信全流程分析:从连接建立到数据传输的深度探索
目录 一、TCP报头 二、三次握手 三、数据传输 四、四次挥手 本文通过一次TCP通信过程的分析来学习TCP协议 一、TCP报头 如图是一份TCP报文的报头,标准报头是20个字节,还可带有选项报头,也就是TCP报头的最小长度是20字节。以下是对报头的各…...
4、提取H264码流中nalu
H264的NALU提取 1、nalu单元 定义nalu的存储单元,ebsp用来存储原始的包含起始码(annexb格式)的原始码流,sodb存储去除防竞争字节后的码流,prefix是3或4字节 nalu_def.h // nalu_def.h #pragma once#include <cs…...
哈佛大学单细胞课程|笔记汇总 (二)
哈佛大学单细胞课程|笔记汇总 (一) (二)Single-cell RNA-seq data - raw data to count matrix 根据所用文库制备方法的不同,RNA序列(也被称为reads或tag)将从转录本((10X Genomic…...
java中抽象类和接口的区别
文章目录 接口和抽象类的区别一、定义的区别1、抽象类2、接口 二、使用场景的区别1、抽象类2、接口 三、使用案例1、抽象类2、接口 接口和抽象类的区别 一、定义的区别 1、抽象类 关键字: abstract 是模棱两可的,似是而非的,无法给出具体明…...
Spring Boot - 在Spring Boot中实现灵活的API版本控制(下)_ 封装场景启动器Starter
文章目录 Pre设计思路ApiVersion 功能特性使用示例配置示例 ProjectStarter Code自定义注解 ApiVersion配置属性类用于管理API版本自动配置基于Spring MVC的API版本控制实现WebMvcRegistrations接口,用于自定义WebMvc的注册逻辑扩展RequestMappingHandlerMapping的类…...
EasyCVR视频转码:T3视频平台不支持GB28181协议,应该如何实现与视频联网平台的对接与视频共享呢?
EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。 T3视频为公网HTTP-FLV或HLS格式的视频流,目前T3平台暂不支持国标GB28181协议,因此也无法直接接…...
Spring统一处理请求响应与异常
在web开发中,规范所有请求响应类型,不管是对前端数据处理,还是后端统一数据解析都是非常重要的。今天我们简单的方式实现如何实现这一效果 实现方式 定义响应类型 public class ResponseResult<T> {private static final String SUC…...
SqlServer公用表表达式 (CTE) WITH common_table_expression
SQL Server 中的公用表表达式(Common Table Expressions,简称 CTE)是一种临时命名的结果集,它在执行查询时存在,并且只在该查询执行期间有效。CTE 类似于一个临时的视图或者一个内嵌的查询,但它提供了更好的…...
常见中间件漏洞
Tomcat CVE-2017-12615 1.打开环境,抓包 2.切换请求头为 PUT,请求体添加木马,并在请求头添加木马文件名 1.jsp,后方需要以 / 分隔 3.连接 后台弱口令部署war包 1.打开环境,进入指点位置,账户密码均为 tomcat 2.在此处上传一句话…...
elasticsearch的学习(二):Java api操作elasticsearch
简介 使用Java api操作elasticsearch 创建maven项目 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…...
docker 部署 ElasticSearch;Kibana
ELasticSearch 创建网络 docker network create es-netES配合Kibana使用时需要组网,使两者运行在同一个网络下 命令 docker run -d \ --name es \ -e "discovery.typesingle-node" \ -v /usr/local/es/data:/usr/share/elasticsearch/data \ -v /usr/…...
k8s使用kustomize来部署应用
k8s使用kustomize来部署应用 本文主要是讲述kustomzie的基本用法。首先,我们说一下部署文件的目录结构。 ./ ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays└── dev├── kustomization.…...
基于开源FFmpeg和SDL2.0的音视频解码播放和存储系统的实现
目录 1、FFMPEG简介 2、SDL简介 3、视频播放器原理 4、FFMPEG多媒体编解码库 4.1、FFMPEG库 4.2、数据类型 4.3、解码 4.3.1、接口函数 4.3.2、解码流程 4.4、存储(推送) 4.4.1、接口函数 4.4.2、存储流程 5、SDL库介绍 5.1、数据结构 5.…...
保姆级教程,一文了解LVS
目录 一.什么是LVS tips: 二.优点(为什么要用LVS?) 三.作用 四.程序组成 五.LVS 负载均衡集群的类型 六.分布式内容 六.一.分布式存储 六.二.分布式计算 六.三.分布式常见应用 tips: 七.LVS 涉及相关的术语 八.LVS 负…...
【STM32】DMA数据转运(存储器到存储器)
本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 开启DMA通道 DMA初始化框架 更改转运次数 DMA应用实例-…...
【Android】通过代码打开输入法
获取焦点 binding.editText.requestFocus()打开键盘 val imm getSystemService(InputMethodManager::class.java) imm.showSoftInput(binding.editText, InputMethodManager.SHOW_IMPLICIT)...
爬虫集群部署:Scrapyd 框架深度解析
🕵️♂️ 爬虫集群部署:Scrapyd 框架深度解析 🛠️ Scrapyd 环境部署 Scrapyd 是一个开源的 Python 爬虫框架,专为分布式爬虫设计。它允许用户在集群中调度和管理爬虫任务,并提供了简洁的 API 进行控制。以下是 Scr…...
pytorch GPU操作事例
>>> import torch >>> if_cuda torch.cuda.is_available() >>> print("if_cuda",if_cuda) if_cuda True >>> gpu_count torch.cuda.device_count() >>> print("gpu_count",gpu_count) gpu_count 8...
linux常见性能监控工具
常用命令top、free 、vmsata、iostat 、sar命令 具体更详细命令可以查看手册,这里只是简述方便找工具 整体性能top,内存看free,磁盘cpu内存历史数据可以vmsata、iostat 、sar、iotop top命令 交互:按P按照CPU排序,按M按照内存…...
e1547:重新定义e621浏览体验的现代化客户端解决方案
e1547:重新定义e621浏览体验的现代化客户端解决方案 【免费下载链接】e1547 A sophisticated e621 browser 项目地址: https://gitcode.com/gh_mirrors/e1/e1547 你是否曾在浏览e621社区时感到界面混乱、功能分散?是否期望一个能够提供个性化内容…...
Infect安全风险评估:了解病毒对Android设备的实际影响
Infect安全风险评估:了解病毒对Android设备的实际影响 【免费下载链接】infect Infect Any Android Device With Virus From Link In Termux 项目地址: https://gitcode.com/gh_mirrors/in/infect 在当今移动设备安全领域,了解恶意软件的实际影响…...
内页SEO优化与网站整体优化的关系是什么_网站内页的图片优化需要注意哪些
内页SEO优化与网站整体优化的关系是什么 在当前竞争激烈的互联网环境中,网站的整体优化和内页SEO优化密不可分。内页SEO优化是提升网站整体排名的关键环节,而网站整体优化则为内页SEO提供了坚实的基础。这两者之间的关系可以从多个方面进行探讨…...
ChatGPT出现前的文本生成:手把手用Python实现n-gram古诗续写工具
从零构建唐诗生成器:用Python揭秘n-gram的文本魔法 记得第一次看到计算机生成古诗时,那种震撼至今难忘——机器竟能模仿李白杜甫的笔触。这背后最基础的技术,就是今天我们要探讨的n-gram模型。不同于现代庞大的神经网络,n-gram用…...
Godot引擎PCK文件解析与资源提取指南:从入门到专家
Godot引擎PCK文件解析与资源提取指南:从入门到专家 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 一、基础认知:PCK文件的数字档案馆架构 Godot引擎的PCK文件(P…...
从JDBC到MyBatis:手把手调试源码,看一个`String`类型的`id`参数如何走完数据库查询与映射的全流程
从JDBC到MyBatis:手把手调试源码,看一个String类型的id参数如何走完数据库查询与映射的全流程 在Java持久层框架的演进历程中,MyBatis凭借其灵活的SQL控制能力和优雅的ORM映射机制,成为众多开发者处理复杂数据库操作的首选工具。…...
终极Cubism.js部署指南:从开发到生产环境的完整实践方案
终极Cubism.js部署指南:从开发到生产环境的完整实践方案 【免费下载链接】cubism Cubism.js: A JavaScript library for time series visualization. 项目地址: https://gitcode.com/gh_mirrors/cu/cubism Cubism.js是一款强大的JavaScript时间序列可视化库&…...
亚洲美女-造相Z-Turbo效果展示:超写实皮肤纹理、毛发细节与光影反射真实感
亚洲美女-造相Z-Turbo效果展示:超写实皮肤纹理、毛发细节与光影反射真实感 本文展示的AI生成内容仅为技术效果演示,所有生成的人物形象均为虚拟创作,不存在真实对应人物。 1. 惊艳效果预览:为什么这个模型值得关注 如果你正在寻找…...
保姆级教程:在Ubuntu 20.04上从零搭建宇树Go1机器狗的ROS仿真环境(含Gazebo避坑)
从零构建宇树Go1机器狗的ROS仿真环境:Ubuntu 20.04全流程指南 当四足机器人从实验室走向消费市场,宇树科技的Go1凭借其灵活动作和开源生态迅速成为开发者新宠。但第一次打开Gazebo看到机器狗瘫倒在地时,多数新手都会陷入手足无措的境地——依…...
如何用TPFanCtrl2解决ThinkPad散热难题:5个智能控制进阶技巧与实战案例
如何用TPFanCtrl2解决ThinkPad散热难题:5个智能控制进阶技巧与实战案例 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 一、重新定义散热控制:T…...
