Ubuntu 新人上手 Microk8s 指南
文章目录
- 1. 什么是 Ubuntu 核心
- 2. 什么是 Kubernetes
- 3. 什么是MicroK8s
- 4. 为什么选择 Microk8s on Core
- 5. 安装Ubuntu Core
- 6. Ubuntu Core上安装 MicroK8S
- 7. 启动 Microk8s
- 8. 启用必要的 MicroK8s 插件
- 9. 部署示例容器工作负载
- 10. 检查部署状态并访问您的应用程序
- 11. 管理镜像
- 11.1 拉取
- 查看
- 打标签
看到 Microk8s
官网的插件很全,忍不住要玩一把。体验一下。
- Vcenter 6.7 创建 Ubuntu 22.10 虚拟机 顺带安装 Microk8s
1. 什么是 Ubuntu 核心
Ubuntu Core 是为物联网和嵌入式系统设计和开发的 Ubuntu 操作系统版本。它完全由 snap
包构建,以创建一个安全、健壮、受限和基于事务的操作系统,易于安装、部署和升级。
2. 什么是 Kubernetes
Kubernetes 是容器化应用程序的编排平台。Kubernetes 抽象计算、网络和存储资源,并以可靠和可扩展的方式管理容器生命周期。Kubernetes 采用 DevOps 原则构建,可自动执行操作任务,例如工作负载重新部署和升级,并提供用于精细资源控制的 API。
3. 什么是MicroK8s
MicroK8s 是一个轻量级的 CNCF 认证的 Kubernetes 发行版,适用于云、工作站、边缘和物联网设备。作为一个快照,它在本地运行所有 Kubernetes 服务(即没有虚拟机),它将所有依赖项包含在一个包中,并获得透明的关键任务安全更新。MicroK8s 针对简单性和稳健性进行了优化,因为安装、设置和操作(例如启用监控服务和高可用性集群)要么是自动化的,要么是通过单个命令完成的。
4. 为什么选择 Microk8s on Core
MicroK8s
和 Ubuntu Core
共享可靠性和安全性等优势,具有自我修复、高可用性和自动 OTA 更新等功能。Ubuntu 是云中 Kubernetes 的首选操作系统。结合 Ubuntu Core
和 MicroK8s
,创建流线型的嵌入式 Kubernetes 体验,并优化 IoT 和边缘应用程序的大小和性能。
5. 安装Ubuntu Core
现在您已经拥有方便的 IoT 设备,让我们从安装 Ubuntu Core
开始。
目前有两个指南:
- 在树莓派上安装 Ubuntu Core
- 在 Intel NUC 上安装 Ubuntu Core
请注意,为了运行 MicroK8s,您应该使用 64 位 Ubuntu Core 版本。
如果您设法成功完成了两个指南中任何一个的步骤,您现在应该可以访问您设备上的 Ubuntu Core 终端。
6. Ubuntu Core上安装 MicroK8S
安装
要在 Ubuntu Core
上安装最新版本的 Microk8s,请运行:
snap install microk8s --channel=latest/edge/strict
低于预期输出:
ubuntu@ubuntu:~$ snap install microk8s --channel=latest/edge/strictmicrok8s (edge/strict) v1.22.3 from Canonical✓ installed
安装最多可能需要几分钟,具体取决于您的硬件资源和网络连接。
此安装的 Kubernetes 版本是什么?
MicroK8s 是快速打包的,因此它将自动更新到更新的点版本。
严格限制的 MicroK8s 版本目前在专用的 snap 通道上,与上游 Kubernetes 的最新版本保持一致。
频道由轨道(或系列)和基于 MicroK8s 版本(稳定版、候选版、测试版、边缘版)的预期稳定性级别组成。有关可用版本的更多信息,请运行:
snap info microk8s
7. 启动 Microk8s
Microk8s 安装后默认不启动。要启动 MicroK8s,请运行:
sudo microk8s start
此命令启动所有 Kubernetes 服务,包括控制平面和工作程序。现在,要在安装完成后检查 MicroK8s 节点的状态,您可以使用:
sudo microk8s status --wait-ready
状态应该表明 microk8s 正在运行。
ubuntu@ubuntu:~$ sudo microk8s status
microk8s is running
high-availability: nodatastore master nodes: 127.0.0.1:19001datastore standby nodes: none
addons:enabled:ha-cluster # (core) Configure high availability on the current nodehelm # (core) Helm - the package manager for Kuberneteshelm3 # (core) Helm 3 - the package manager for Kubernetesdisabled:cert-manager # (core) Cloud native certificate managementcommunity # (core) The community addons repositorydashboard # (core) The Kubernetes dashboarddns # (core) CoreDNSgpu # (core) Automatic enablement of Nvidia CUDAhost-access # (core) Allow Pods connecting to Host services smoothlyhostpath-storage # (core) Storage class; allocates storage from host directoryingress # (core) Ingress controller for external accesskube-ovn # (core) An advanced network fabric for Kubernetesmayastor # (core) OpenEBS MayaStormetallb # (core) Loadbalancer for your Kubernetes clustermetrics-server # (core) K8s Metrics Server for API access to service metricsminio # (core) MinIO object storageobservability # (core) A lightweight observability stack for logs, traces and metricsprometheus # (core) Prometheus operator for monitoring and loggingrbac # (core) Role-Based Access Control for authorisationregistry # (core) Private image registry exposed on localhost:32000storage # (core) Alias to hostpath-storage add-on, deprecated
如果是没有魔法上网的环境,这里可能起不来。报错原因:
$ microk8s.kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7db754646d-ml4wq 0/1 Pending 0 7m50s
calico-node-td999 0/1 Init:0/2 0 38s$ microk8s.kubectl get pods -n kube-system calico-node-td999 -oyaml
.......
Failed to create pod sandbox: rpc error: code = DeadlineExceeded desc = failed to get sandbox image "registry.k8s.io/pause:3.7": failed to pull image "registry.k8s.io/pause:3.7": failed to pull and unpack image "registry.k8s.io/pause:3.7": failed to resolve reference "registry.k8s.io/pause:3.7": failed to do request: Head "https://asia-east1-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.7": dial tcp 64.233.189.82:443: i/o timeout
你需要手动拉取。
microk8s.ctr images pull docker.io/ghostwritten/registry.k8s.io.pause:3.7
microk8s.ctr images tag docker.io/ghostwritten/registry.k8s.io.pause:3.7 registry.k8s.io/pause:3.7
8. 启用必要的 MicroK8s 插件
现在您已经启动并运行了 Kubernetes 服务,您应该设置其他服务,例如 Kubernetes 仪表板、CoreDNS 或本地存储,以充分利用您的 Kubernetes。其中许多服务都可以作为 MicroK8s 插件使用,并且可以通过运行 microk8s enable 命令轻松启用:
sudo microk8s enable dns dashboard storage
可以通过运行 microk8s disable 命令随时禁用这些插件:
sudo microk8s disable dns dashboard storage
您可以使用 microk8s status 命令查看可用插件列表和当前启用的插件。
最重要的插件列表
dns
:部署DNS。其他人可能需要此插件,因此我们建议您始终启用它。
dashboard
: 部署 kubernetes 仪表板。storage
:创建默认存储类。此存储类使用指向主机上目录的 hostpath-provisioner。
ingress
:创建入口控制器。gpu
:通过启用 nvidia-docker 运行时和 nvidia-device-plugin-daemonset 将 GPU 暴露给 MicroK8s。要求主机系统上已安装 NVIDIA 驱动程序。istio
:部署核心 Istio 服务。您可以使用 microk8s istioctl 命令来管理您的部署。registry
:部署一个 docker private registry 并在 localhost:32000 上公开它。存储插件将作为此插件的一部分启用。
9. 部署示例容器工作负载
您现在可以使用 microk8s kubectl 来部署您的容器。在此示例中,我们部署了 nodered,这是一种用于将硬件设备连接在一起的编程工具
sudo microk8s kubectl create deployment nodered --image=nodered/node-red
使用 kubectl 检查 pod:
ubuntu@ubuntu:~$ sudo microk8s kubectl get pods
NAME READY STATUS RESTARTS AGE
nodered-7555b955f9-68cl9 0/1 ContainerCreating 0 3s
ubuntu@ubuntu:~$ sudo microk8s kubectl get pods
NAME READY STATUS RESTARTS AGE
nodered-7555b955f9-68cl9 1/1 Running 0 16s
接下来需要使用 kubectl 命令公开部署,以使其可从网络访问:
sudo microk8s kubectl expose deployment nodered --type=NodePort --port=1880 --name=nodered-service
10. 检查部署状态并访问您的应用程序
您可以使用以下命令检查部署状态:
$ sudo microk8s kubectl get services
ubuntu@ubuntu:~$ sudo microk8s kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 81m
nodered-service NodePort 10.152.183.46 <none> 1880:30663/TCP 5s
暴露的端口是随机生成的。在上面的例子中,我们可以看到端口是30663
。
为了访问应用程序的图形界面,您需要打开浏览器并输入以下 URL 方案:http://:<EXPOSED_PORT>
示例:http://192.168.1.222:30663/
11. 管理镜像
11.1 拉取
$ microk8s ctr images pull docker.io/calico/cni:v3.23.5
docker.io/calico/cni:v3.23.5: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:7ca5c455cff6c0d661e33918d95a1133afb450411dbfb7e4369a9ecf5e0212dc: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:9c5055a2b5bc0237ab160aee058135ca9f2a8f3c3eee313747a02edcec482f29: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:1c979d623de9aef043cb4ff489da5636d61c39e30676224af0055240e1816382: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:cc0e45adf05a30a90384ba7024dbabdad9ae0bcd7b5a535c28dede741298fea3: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:51729c6e2acda05a05e203289f5956954814d878f67feb1a03f9941ec5b4008b: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:7430548aa23e56c14da929bbe5e9a2af0f9fd0beca3bd95e8925244058b83748: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:47c5dbbec31222325790ebad8c07d270a63689bd10dc8f54115c65db7c30ad1f: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:8efc3d73e2741a93be09f68c859da466f525b9d0bddb1cd2b2b633f14f232941: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4c98a4f67c5a7b1058111d463051c98b23e46b75fc943fc2535899a73fc0c9f1: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:050b055d5078c5c6ad085d106c232561b0c705aa2173edafd5e7a94a1e908fc5: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 28.7s total: 103.0 (3.6 MiB/s)unpacking linux/amd64 sha256:7ca5c455cff6c0d661e33918d95a1133afb450411dbfb7e4369a9ecf5e0212dc...
done: 11.392952756s
查看
microk8s.ctr image ls
REF TYPE DIGESTSIZE PLATFORMS LABELS
docker.io/calico/cni:v3.23.5 application/vnd.docker.distribution.manifest.list.v2+json sha256:7ca5c455cff6c0d661e33918d95a1133afb450411dbfb7e4369a9ecf5e0212dc 103.0 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
docker.io/calico/kube-controllers:v3.23.5 application/vnd.docker.distribution.manifest.list.v2+json sha256:58cc91c551e9e941a752e205eefed1c8da56f97a51e054b3d341b67bb7bf27eb 51.3 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
docker.io/calico/node:v3.23.5 application/vnd.docker.distribution.manifest.list.v2+json sha256:b7f4f7a0ce463de5d294fdf2bb13f61035ec6e3e5ee05dd61dcc8e79bc29d934 71.6 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
docker.io/ghostwritten/registry.k8s.io.pause:3.7 application/vnd.docker.distribution.manifest.v2+json sha256:445a99db22e9add9bfb15ddb1980861a329e5dff5c88d7eec9cbf08b6b2f4eb1 301.3 KiB linux/amd64 io.cri-containerd.image=managed
registry.k8s.io/pause:3.7 application/vnd.docker.distribution.manifest.v2+json sha256:445a99db22e9add9bfb15ddb1980861a329e5dff5c88d7eec9cbf08b6b2f4eb1 301.3 KiB linux/amd64 io.cri-containerd.image=managed
sha256:1c979d623de9aef043cb4ff489da5636d61c39e30676224af0055240e1816382 application/vnd.docker.distribution.manifest.list.v2+json sha256:7ca5c455cff6c0d661e33918d95a1133afb450411dbfb7e4369a9ecf5e0212dc 103.0 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
sha256:221177c6082a88ea4f6240ab2450d540955ac6f4d5454f0e15751b653ebda165 application/vnd.docker.distribution.manifest.v2+json sha256:445a99db22e9add9bfb15ddb1980861a329e5dff5c88d7eec9cbf08b6b2f4eb1 301.3 KiB linux/amd64 io.cri-containerd.image=managed
sha256:b6e6ee0788f2079219fecb418f573bbaad4c07f6f82b712ccc72684db8cc2deb application/vnd.docker.distribution.manifest.list.v2+json sha256:b7f4f7a0ce463de5d294fdf2bb13f61035ec6e3e5ee05dd61dcc8e79bc29d934 71.6 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
sha256:ea5536b1fa4a86e5ecf0803b7a1118d797f5ef51d2f452acf0b701d64dc6fcd9 application/vnd.docker.distribution.manifest.list.v2+json sha256:58cc91c551e9e941a752e205eefed1c8da56f97a51e054b3d341b67bb7bf27eb 51.3 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le io.cri-containerd.image=managed
打标签
microk8s.ctr images tag docker.io/ghostwritten/registry.k8s.io.pause:3.7 registry.k8s.io/pause:3.7
参考:
- Getting started with MicroK8s on Ubuntu Core
相关文章:

Ubuntu 新人上手 Microk8s 指南
文章目录1. 什么是 Ubuntu 核心2. 什么是 Kubernetes3. 什么是MicroK8s4. 为什么选择 Microk8s on Core5. 安装Ubuntu Core6. Ubuntu Core上安装 MicroK8S7. 启动 Microk8s8. 启用必要的 MicroK8s 插件9. 部署示例容器工作负载10. 检查部署状态并访问您的应用程序11. 管理镜像1…...

初阶C语言——实用调试技巧【详解】
文章目录1. 什么是bug?2. 调试是什么?有多重要?2.1 调试是什么?2.2 调试的基本步骤2.3 Debug和Release的介绍3.学会使用快捷键4.调试的时候查看程序当前信息4.1 查看临时变量的值4.2 查看内存信息4.3 查看调用堆栈4.4 查看汇编信息…...

Android 绘图基础:Canvas画布——自定义View基础(绘制表盘、矩形、圆形、弧、渐变)
Canvas画布,通过它我们可以自定义一个View,设置View的相关效果之类的。感觉用法差不多,重要的是要理解方法中传入的参数的含义,比如float类型的参数,传递的是坐标,已开是没有注意传入的参数时坐标,导致我迷…...
js拷贝数组对象:浅拷贝深拷贝
前言 js拷贝数组对象:浅拷贝&深拷贝,包括:Object.assign、concat、slice、JSON.parse(JSON.stringify()) 场景:弹窗选择组织结构(树形结构),选择后显示相关数据至输入框中(每次选…...

【C++】string类的使用
目录 一、标准库中的string类 二、string类的常用接口 1、string类对象的常见构造 2、string类对象的容量操作 2.1、size 与 length 2.2、capacity 与 reserve 2.3、resize 2.4、总结 3、string类对象的访问及遍历操作 3.1、operator[] 与 at 3.2、begin end 3.3、…...

微服务架构简介
微服务 软件架构是一个包含各种组织的系统组织,这些组件包括 Web服务器, 应用服务器, 数据库,存储, 通讯层), 它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点。 image Conway’s law: Organizations which design systems[...] are constrained…...

【Spring源码】AOP的开端:核心对象创建的准备工作
AOP的核心成员是如何被被加载的?本篇我们主要分析使用xml的逻辑,如果使用注解,增加注解处理类即可(ConfigurationClassPostProcessor)拿之前分析循环的时候举的例子🌰,它的日志切面就是通过xml进…...

新号涨粉22w,搞笑博主再次爆火,小红书近期创作趋势是什么?
2月借势元宵、情人节,小红书平台又涌现出哪些黑马博主?品牌在投放种草方面有何亮眼表现?为洞察小红书平台的内容创作趋势及品牌营销策略,新红推出2月月度榜单,从创作者及品牌两方面入手,解析月榜数据&#…...

【C++】30h速成C++从入门到精通(内存管理、函数/类模板)
C内存分布我们先来看一下下面的一段代码相关问题int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pChar3 "abcd";int* ptr1 (int*)mal…...

自动驾驶决策概况
文章目录1. 第一章行为决策在自动驾驶系统架构中的位置2. 行为决策算法的种类2.1 基于规则的决策算法2.1.1 决策树2.1.2 有限状态机(FSM)2.1.3 基于本体论(Ontologies-based)2.2 基于统计的决策算法2.2.1 贝叶斯网络(B…...

金山轻维表项目进展自动通知
项目经理作为项目全局把控者,经常要和时间“赛跑”。需要实时了解到目前进展如何,跟进人是那些?哪些事项还未完成?项目整体会不会逾期?特别是在一些大型公司中,优秀的项目经理已经学会使用金山轻维表做项目…...

基于上下文分析的 Python 实时 API 推荐
原文来自微信公众号“编程语言Lab”:基于上下文分析的 Python 实时 API 推荐 搜索关注 “编程语言Lab”公众号(HW-PLLab)获取更多技术内容! 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论(加入方式:添加…...
软件测试-接口测试-代码实现接口测试
文章目录 1.request1.1 request介绍1.2 发送get请求1.3 发送set请求1.4 其他请求方式1.5 传递url参数1.6 响应内容解析1.7 cookie1.8 设置session2.集成UnitTest2.1 接口测试框架开发2.2 案例:使用TPShop项目完成对登录功能的接口测试1.request 1.1 request介绍 概念 基于py…...

中村成洋《垃圾回收的算法与实现》PDF 读书笔记
观前提醒 为了能够锻炼自己,我会查阅大量外文不停的修改内容,少部分会提示成中文。 可能有误,请见谅 提示:若是觉得阅读困难,可以看如下内容 脚本之家可获取,若失效可私信浏览器的沙拉查词扩展…...
docker 网络模式
docker 网络模式主要分为四种,可以通过docker network ls 查看 ~$ docker network ls NETWORK ID NAME DRIVER SCOPE a51d97d72f10 bridge br…...

数据库开发(一文概括mysql基本知识)
Mysql 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 关系型数据库(Relational Database Management System:关系数据库管理系统)应用软件之一。mysql在问开发中,几乎必不可少,因为其他的可能是要收费的&#x…...

【JVM】详解Java内存区域和分配
这里写目录标题一、前言二、运行时数据分区2.1程序计数器(PC)2.2 Java虚拟机栈2.3 本地方法栈2.4 Java堆2.5 方法区2.5.1 运行时常量池2.6 直接内存三、HotSpot虚拟机对象探秘3.1 对象的创建3.2 对象的内存布局3.3 对象的访问定位一、前言 C/C需要自行回收和释放已经没用的对象…...

JAVA开发(史上最完整追本溯源JAVA历史、发展和学习)
(第二次世界大战1931-1945) 世界上最先进的技术往往是由于战争催生,在第二次世界大战中除了飞机,坦克和大炮的武器较量外,在隐秘战线的情报工作其实更为重要,在军队将领来往的电报中,为了防止军事情报的泄漏ÿ…...

Qt 防止程序退出
文章目录摘要QWidgetQML方法 1方法 2关键字: Qt、 eventFilter、 Close、 键盘、 任务管理器摘要 今天要聊得内容还是怎么防止别人关闭我的程序,之前都是在win下面,一般都是用过钩子连捕获键盘事件,完了吧对应的事件忽略&#x…...
【校验码 - 循环冗余校验码CRC】
水善利万物而不争,处众人之所恶,故几于道💦 目录 循环冗余校验码 1.多项式 2.CRC编码的组成 3.校验码的生成 4.例题: 循环冗余校验码 广泛地在网络通信及磁盘存储时采用。 1.多项式 在循环冗余校验(CRC)码中,无一例…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...