自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 收藏
  • 关注

原创 在 Cilium CNI 集群上运行 vCluster 虚拟集群

虚拟集群是一种在现有 Kubernetes 集群(Host 集群)之上创建的轻量级 Kubernetes 集群。它提供了一个独立的 Kubernetes 环境,但实际上是通过共享 Host 集群的资源来实现的。这种方式允许多个虚拟集群运行在同一个物理集群中,为不同的团队或项目提供隔离的开发、测试和生产环境,而不需要为每个环境创建单独的物理集群。vCluster是一种轻量级的虚拟集群解决方案,允许你在 Kubernetes 集群中创建和管理虚拟的 Kubernetes 集群。

2024-08-30 17:17:44 955

原创 K8sGPT+Ollama:免费的 Kubernetes 自动化诊断方案

周末检查博客草稿,发现了这篇。记得当时是与一起写的,算算过去了一年之久,这拖延症也算是病入膏肓了。原本想使用 K8sGPT +的方案,由于之前试过,感觉使用起来也更加友好,而且 Ollama 同样提供了,索性改成用 Ollama 吧。介绍 k8sgpt-operator 的文章发布后,有小伙伴反馈 OpenAI 的使用门槛,这个问题确实比较棘手,但也不是不能解决。不过本文并不是介绍如何解决这种问题的,而是介绍 OpenAI 的替代方案: Ollama。

2024-06-18 10:13:33 789

原创 使用 ZTM 增强极空间 NAS 的远程访问能力

在本次演示中,展示了如何通过 ZTM 增强极空间 NAS 的远程访问功能。演示中利用了两个服务:Web 服务和 Windows 远程桌面,来展示 ZTM 对多种协议的支持。即使没有 NAS 设备,只要网络中存在任何可以运行 ZTM Agent 的设备,都可以实现远程访问。ZTM 支持所有基于 TCP 或 UDP 的协议,确保更广泛的应用场景和更高的兼容性。后面我将会分享更多的使用场景,还有极空间的深度体验,敬请期待。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生。

2024-06-18 08:33:29 2236

原创 Kubernetes Gateway API v1.1 解读

几天前,K8s Network SIG 发布了 Gateway API(简称 gwapi)的,这个版本的发布包含了多项重要功能的 GA(一般可用),以及一些实验功能的引入。这两部分分别通过标准渠道和实验渠道发布。发布渠道用于指示网关 API 内的功能的稳定性。所有新功能和资源都是先从开始,在后续迭代演进的过程中可能会升级到,也有可能完全从 API 中废除。通过下图可以对 gwapi 的发布渠道有个清晰的了解。

2024-05-17 09:16:10 441

原创 抽丝剥茧:从 Linux 源码探索 eBPF 的实现

去年学习 eBPF,分享过,都是面向 eBPF 的应用。为了准备下一篇文章,这次决定从 Linux 源码入手,深入了解 eBPF 的工作原理。因此这篇又是一篇学习笔记,假如你对 eBPF 的工作原理也感兴趣,不如跟随我的脚步一起。文章中若有任何问题,请不吝赐教。这里不会再对 eBPF 进行过多的介绍,可以参考我的另一篇,结合可以了解 eBPF 的基本内容以及其在网络加速方面的应用。接下来我们还是使用中的程序为例, 配合源码探索 eBPF 的工作原理。

2024-04-01 14:07:41 936 1

原创 自定义 OpenTelemetry Collector 容器镜像

OpenTelemetry Collector 有两个官方发行版:Core 和 Contrib。不管 Core 还是 Contrib 都不应该成为你生产工作负载的一部分。仅仅使用 Core 本身太过简单,无法满足组织的需求(尽管它提供的组件都是必须的);虽然 Contrib 中提供的组件足够全面,然而并不是说每个组件都是你所需要的,太多冗余的组件显得过于臃肿,还增大的攻击面。那如何选择你所需的发行版呢?答案就是构建自己的发行版。

2024-03-05 08:48:33 764

原创 初探 Backstage:快速上手指南

Backstage 是一个用于构建开发人员门户的开放平台,统一了所有基础设施工具、服务和文档,以创建端到端的简化开发环境,由Spotify 开源并捐赠给 CNCF。通过这篇文章,我们了解了 Backstage 的基本概念和如何在不同环境中运行它。我认为,Backstage 更适合被定义为一个开发者门户而不是一个全面的开发者平台。它本质上是一个灵活的框架,而非一个即开即用的全套解决方案。

2024-01-29 10:24:08 1453

原创 聊聊我所理解的平台工程

平台工程是一门在云原生时代为软件工程组织设计和构建工具链及工作流程的学科,旨在提供自助服务能力。平台工程师提供的综合产品通常被称为“内部开发者平台”,涵盖了应用程序整个生命周期的运营需求。来自平台工程社区的介绍平台工程致力于构建和维护一个桥梁,这座桥梁把复杂的基础设施转化为简化的抽象,使得开发人员能够专注于业务逻辑的开发,无需深入钻研底层技术细节。同时,他们也努力将业务逻辑层的通用功能整合并下沉,进一步简化开发流程。此处,我更倾向于将“工程”理解为一个动词,即对平台进行工程化。

2024-01-22 08:33:16 955

原创 使用 OpenTelemetry 和 Loki 实现高效的应用日志采集和分析

(以下简称 Otel)是一个开源项目,旨在为分布式追踪、度量和日志提供统一的标准,简化应用程序的观测性(Observability)。它提供了一系列工具和 API,用于收集和传输应用程序的性能数据和日志,帮助开发者和运维团队更好地理解系统的行为。功能包括自动和手动检测应用程序的追踪数据,收集关键度量指标,以及捕获和传输日志。Otel 支持多种编程语言和框架,可以与多个后端系统集成,如 Prometheus、Jaeger、Elasticsearch 等。

2023-12-25 12:03:56 2528 4

原创 快速探索 Tetragon:基于 eBPF 的安全可观察性和执行工具

Tetragon 是一个专注于 eBPF、实时处理、安全性、可观测性和策略执行的工具,特别是在 Kubernetes 环境中。它通过利用一系列高级的挂钩点(hook points)和选择器(selectors),为基础设施安全提供了强大支持,并能够针对关键事件进行有效防护。深入理解 Tetragon,我们可以看到它主要是一个底层工具,专注于围绕进程、文件和网络活动实施安全策略。在网络方面,Tetragon 主要处理第三层(L3)的基础信息事件,如 IP 层面的通信。

2023-12-15 08:57:43 263

原创 探索服务网格与 OpenTelemetry 的协同之分布式跟踪

在上一篇文章中,介绍了并实现了无侵入(某些语言还无法实现,比如 Go 的 eBPF 对内核的苛刻要求)的分布式跟踪。这篇文章发出后有读者评论 javaagent 的“无侵入”一说,这里有必要解释下。“无侵入”主要指的是不需要修改应用程序的业务逻辑代码就能实现的功能,对应用程序无感知,让开发者专注于业务开发;同时由于无需修改应用程序代码,更;同时还,在多种语言、框架间保证功能的。而 Java Agent 在 JVM 启动时加载,它在运行时修改字节码来注入跟踪代码,而不是在应用程序的源代码层面上进行修改。

2023-12-14 08:57:49 174

原创 在 Kubernetes 中无侵入安装 OpenTelemetry 探针

是一个为了简化 OpenTelemetry 组件在 Kubernetes 环境中的部署和管理而设计的 Kubernetes Operator。OpenTelemetry Operator 通过 CRD() 实现在 Kubernetes 集群中自动部署和管理 OpenTelemetry Collector;在工作负载中自动安装 OpenTelemetry 探针。今天我们就将体验如何使用 OpenTelemetry Operator 自动安装探针,实现链路跟踪。

2023-12-13 09:46:03 612

原创 使用 k3sup 一分钟快速搭建 K3s 集群

k3sup 是一个轻量级工具,用于快速搭建 K3s 集群。k3sup 的特点是易于使用,只需单个命令即可在不同的平台上安装 K3s。它使用户可以快速创建 Kubernetes 集群,并可以轻松地将新节点加入到现有集群中。k3sup 通过 SSH 连接到目标服务器,然后自动安装和配置 K3s。这意味着我们可以在任何可以通过 SSH 访问的机器上安装和运行 Kubernetes,包括本地机器、云服务器或树莓派等设备。

2023-10-27 10:55:33 268

原创 单体 or 微服务?Service Weaver:我全都要!

Service Weaver 的思路很好,针对目前微服务架构的问题做了优化和提升,再加上有 Google 的背书,希望继续演进下去。尤其当前只支持 Go 语言,虽说 Go 在云原生中风生水起,当时业务开发大部分仍是 Java 技术栈。在业务开发中,Go 的受众还是相当小。当前的版本是 v0.21.2,仍处于很早期的阶段,请谨慎对待(源码里搜了下 TODO 关键词有 100 多处)。没有完美的架构,没有银弹!关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

2023-10-12 09:38:12 418

原创 Netflix 零配置服务网格与按需集群发现

本文翻译自由 David Vroom, James Mulcahy, Ling Yuan, Rob Gulewich 编写的 Netflix 博客。Netflix 相信大家并不陌生,在 Spring Cloud 生态中就有 Netflix 全家桶。多年前,我也曾将基于 Netflix OSS 构建的微服务架构搬上了 Kubernetes 平台,并持续折腾好几年。

2023-09-26 06:43:55 145

原创 探索 Gateway API 在 Service Mesh 中的工作机制

前几天,这意味着atewayPI foreshdministration)有了新进展,虽然目前还是。去年 6 月 Gateway API 发布 0.5.0 时,我还写了一篇。如今,SMI 作为 sandbox 项目的年度审查已经,唏嘘。废话不多说,我们来看下 0.8.0 下的 Gateway API 如何在 Service Mesh 中工作。

2023-09-08 08:38:48 116

原创 Kubernetes 容器运行时接口 CRI

CRI 提供了一种标准化的接口,用于与底层容器运行时进行交互。Kubernetes 控制平面与容器管理的具体实现解耦,可以独立升级或者切换容器运行时,方便扩展和优化。Kubernetes 作为一个跨云、跨平台和多环境的容器编排系统,在不同的环境和场景下使用不同的容器平台。CRI 的出现,保证平台的多样性和灵活性。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)criService。

2023-08-29 10:56:39 256

原创 CoreDNS 与多集群服务 MCS

引入了新的 DNS 域,需要改动应用代码。两个集群间的网络要打通,对底层的网络架构要求高,如果涉及跨云跨数据中心的话这个问题会更加明显。多集群服务 DNS 插件目前还属于 external plugin,还要像上面那样重新编译、部署 CoreDNS其中,由于目前 KEP1645 还处于提案阶段,待正式发布之后,相信 #3 的问题待插件进入核心插件列表后可以解决。而 #1 的问题,假如当前应用内的代码中是使用NAME.NS的方式的话,可以通过在 Pod增加搜索域来解决。

2023-07-20 11:27:26 184

原创 追踪 Kubernetes 中的 DNS 查询

在过去的文章中,我们曾,这篇文章将追踪 Kubernetes 中的 DNS 查询。让我们以在 Pod 中解析 Service 完全限定域名(FQDN)为例。在开始之前,先回顾下 DNS 的解析流程。

2023-07-19 08:46:22 354

原创 浅析 CoreDNS 的工作机制

CoreDNS 是一个开源的域名系统(DNS)服务器,用于将域名解析为 IP 地址以实现网络通信。它是一个用 Go 语言编写的可扩展 DNS 服务器,旨在取代传统的 DNS 服务器并提供更灵活、可配置的解析方案。CoreDNS 提供了模块化的插件系统,允许用户根据需求选择和组合插件,以定制 DNS 服务器的功能和行为。通过添加不同的插件,用户可以实现缓存、转发、重写、策略路由、服务发现等功能,从而满足各种复杂的域名解析需求。插件由和部分组成。

2023-07-18 09:11:15 384

原创 Cilium 如何处理 L7 流量

整篇看下来,Cilium 在处理 L7 流量上的实现还是比较复杂的,牵扯多个组件协同。eBPF 在 L3/L4 流量处理上有着优异的性能优势,但是对 L7 流量处理仍然无法脱离 sidecar 代理(不论 sidecar 是 per pod 还是 per node)。而 L7 流量处理也恰恰有着非常多的使用场景,不仅仅是 HTTP 协议。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)identity。

2023-06-12 08:28:56 518

原创 取代 Docker Desktop?Podman Desktop 发布 GA 版本 1.0

(POD MANager)是一个跨平台的容器管理工具,可用于管理容器、镜像、卷以及以容器组形式存在的 Pod。Podman 可以在 Linux 上直接运行容器,但在像 macOS 和 Windows 这样的平台,是通过虚拟机间接运行容器。Podman Desktop 提供的图形用户界面使开发人员可以方便快捷地在本地环境中创建和管理容器,简化了容器的使用,无需记忆和输入复杂的命令,降低容器的使用门槛。

2023-05-25 08:22:06 301

原创 深入探索 Cilium 的工作机制

这篇之前写记录的内容,隔了几个月终于想起把笔记完成,作为探索 Cilium 工作原理的入门,也还是 Cilium 冰山一角,像是高级的网络策略、网络加密、BGP 网络、服务网格等方面并没有深入。如果阅读过程中有发现任何问题,也烦请纠正。本文基于 Cilium v1.12 及 Kubernetes v1.25。

2023-05-22 09:28:19 615

原创 Kubernetes 自动化诊断工具:k8sgpt-operator

简单来说 k8sgpt-operator 可以在集群中开启自动化的 k8sgpt。它提供了两个 CRD:K8sGPT和Result。前者可以用来设置 k8sgpt 及其行为;而后者则是用来展示问题资源的诊断结果。

2023-05-04 11:36:07 399

原创 从单集群到多集群:Kubernetes 在多云混合云环境的演进

在多云、混合云成为趋势的当下,Kubernetes 多集群也不断地被提及并逐渐成为重要的解决方案。Kubernetes 多集群的讨论已不再局限于集群和应用的管理,还引入了跨集群的服务通信。多集群可以为企业提供更灵活、更可靠的应用部署和管理能力,使企业能够更好地利用混合多云环境中的资源,降低运营成本,提高应用的可靠性。除此以外,还可以助力企业更快速地进行应用迁移。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

2023-04-09 09:51:32 292

原创 使用 eBPF 技术实现更快的网络数据包传输

通过 eBPF 的引入,我们缩短了同节点通信数据包的 datapath,跳过了内核网络栈直接连接两个对端的 socket。这种设计适用于同 pod 两个应用的通信以及同节点上两个 pod 的通信。[^1]: 该辅助函数将引用的 socket 添加或者更新到 sockethashmap中,程序的输入作为键值对的值。详细信息可参考中的。[^2]: 该辅助函数将msg转发到 socket map 中key对应的 socket。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处。

2023-03-22 08:20:10 836

原创 追踪 Kubernetes 中的数据包

统计一下在三个场景中,经过内核网络协议栈的处理次数都是两次(包括 netfilter 的处理。),即使是同 pod 或者同节点内。而这两种情况实际都发生在同一个内核空间中。假如同一个内核空间中的两个 socket 可以直接传输数据,是不是就可以省掉内核网络协议栈处理带来的延迟?下篇继续。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

2023-03-22 08:19:15 101

原创 在 Kubernetes 上运行《我的世界》

假期给小朋友装上了叨叨许久的 Minecraft(我的世界),为了体验安装的是。其实这游戏我也关注比较久了,不过感觉太耗时间。但被小朋友拉上一起玩,便研究了下自建服务器。GitHub 发现已经有人做好了,先是在 HomeLab 上用 Docker 部署,通过多人连线就能玩起来了。由于不会玩几下被小朋友给打死,后来才发现还有“和平模式”。基于上面的原因,决定将服务器部署在 Azure 上,开一个 8c16g 的虚拟机并安装 k3s。数据呢,通过持久化存储在 Azure 的上。开始吧!

2023-03-20 10:29:11 129

原创 追踪 Kubernetes 中的数据包

统计一下在三个场景中,经过内核网络协议栈的处理次数都是两次(包括 netfilter 的处理。),即使是同 pod 或者同节点内。而这两种情况实际都发生在同一个内核空间中。假如同一个内核空间中的两个 socket 可以直接传输数据,是不是就可以省掉内核网络协议栈处理带来的延迟?下篇继续。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

2023-03-20 10:26:33 97

原创 追踪 Kubernetes 中的数据包

统计一下在三个场景中,经过内核网络协议栈的处理次数都是两次(包括 netfilter 的处理。),即使是同 pod 或者同节点内。而这两种情况实际都发生在同一个内核空间中。假如同一个内核空间中的两个 socket 可以直接传输数据,是不是就可以省掉内核网络协议栈处理带来的延迟?下篇继续。关注"云原生指北"微信公众号(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

2023-03-20 09:35:12 66

原创 分布式应用运行时 Dapr:万物皆可 API

Dapr 分布式应用运行时 Distributed Application Runtime 的首字母缩写。有关多运行时,可以看下 Bilgin Ibryam 的 Multi-Runtime Microservices Architecture,不想看英文的可以看下我之前的翻译。Dapr 是一个分布式系统工具包,通过提供 API 实现应用程序与外围组件的解耦合,让开发人员更加聚焦于业务逻辑的研发。解耦也是与传统 SDK 的很大区别,能力不再是通过应用程序中加入库的方式提供,而是通过应用附近的边车(side

2023-03-07 09:23:23 362

原创 【译】分拆:技术栈的自然演进

本文翻译自 Bilgin Lbryam 的 Unbundling: The Natural Evolution of Tech Stacks,翻译难免有所疏漏,有建议请反馈。“unbundling” 如何翻译,有点纠结,我一度将其翻译成“解耦”,但解耦是 “decoupling” 的翻译。这里我将其翻译成分拆,如果你有更好的翻译请告知。译者注作者应该是去年 7 月离开红帽加入了基于 Dapr 的创业公司 Diagrid,曾写过 Multi-Runtime Microservices Archite

2023-03-07 08:34:27 106

原创 使用 Ingress 访问 Dapr 应用

在 上一篇 文章中分享了分布式运行时 Dapr 的使用,在示例中将状态存储能力分离到 Dapr 运行时中,应用通过 Dapr API 来使用该能力。这篇文章将介绍如何通过 Ingress Controller(入口控制器)来访问 Dapr 应用。方案如何公开 Dapr 应用的访问,方案有两种:像传统用法一样,配置应用的 Service 作为后端,由入口控制器直接将流量转发到应用容器,简单说就是支持自动配置的 L7 负载均衡器。不直接访问应用容器,而是通过 Daprd 运行时来访问。这时,我们就需

2023-03-06 10:28:00 131

原创 使用 Terraform 创建 Azure 虚拟机

之前写过一篇 使用 Terraform 部署 Proxmox 虚拟机,那是一台 Core i7-8700 + 64G 的 Homelab 上搭建的虚拟机环境,这也是我一直以来的实验环境。直至去年加入微软 MVP 拿到了 Azure 的 credit,在需要资源较多或者拉取镜像频繁的情况下我也会选择使用 Azure 的虚拟机,尤其是最近经常在多集群的环境做测试。在 Azure 上创建虚拟机,我也从一开始的 Web 页面专项 CLI,再到现在因为需要复杂配置时的 Terraform。这篇文章就分享下如何使用

2023-03-03 08:29:50 588

原创 【译】eBPF 和服务网格:还不能丢掉 Sidecar

服务网格以典型的 sidecar 模型为人熟知,将 sidecar 容器与应用容器部署在同一个 Pod 中。虽说 sidecar 并非很新的模型(操作系统的 systemd、initd、cron 进程;Java 的多线程),但是以这种与业务逻辑分离的方式来提供服务治理等基础能力的设计还是让人一亮。随着 eBPF 等技术的引入,最近关于服务网格是否需要 sidecar (也就是 sidecarless)的讨论渐增。笔者认为任何问题都有其起因,长久困扰服务网格的不外乎性能和资源占用。这篇文章翻译自 Buo

2023-01-12 08:50:27 259

原创 源码解析:从 kubelet、容器运行时看 CNI 的使用

这是 Kubernetes 网络学习的第三篇笔记。深入探索 Kubernetes 网络模型和网络通信认识一下容器网络接口 CNI(本篇)源码分析:从 kubelet、容器运行时看 CNI 的使用从 Flannel 学习 Kubernetes VXLAN 网络Cilium CNI 与 eBPF...在上一篇中,通过对 CNI 规范的解读了解了网络配置的操作和相关的流程。在网络的几个操作中除了 CNI_COMMAND 外,有另外三个参数几乎每次都要提供 CNI_CONTAINERID、CNI

2022-12-12 09:29:04 778

原创 认识一下 Kubernetes 多集群服务 API

由于各种原因,采用 Kubernetes 的企业内部存在着几个、几十甚至上百个集群。比如处于研发流程上的考虑,不同环境下都存在独立的集群;监管层面的考虑,就地存储的用户数据需要搭配应用集群;单个集群的容量限制,无法满足业务体量;可用性要求的多云、多地、多中心;Kubernetes 原地升级成本大进而考虑新建集群;等等各种原因。这些集群彼此之间看似独立,但又有着千丝万缕的联系。比如高可用的多集群,实现了集群级的灾备,但集群中的服务如何实现跨集群的故障迁移?我们先看下集群内的应用如何对集群外提供服务。由

2022-12-09 16:23:49 599

原创 认识一下容器网络接口 CNI

写在最前,周末写到这篇的时候我就发现可能是给自己挖了很大的坑,整个 Kubernetes 网关相关的内容会非常复杂且庞大。深入探索 Kubernetes 网络模型和网络通信认识一下容器网络接口 CNI(本篇)源码分析:从 kubelet、容器运行时看 CNI 的使用从 Flannel 学习 Kubernetes VXLAN 网络Cilium CNI 与 eBPF...看自己能学到哪一步~在 《深入探索 Kubernetes 网络模型和网络通信》 文章中,我们介绍了网络命名空间(net

2022-12-09 08:53:22 1586

原创 深入探索 Kubernetes 网络模型和网络通信

Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结构的设计,无需将主机端口与网络端口进行映射便可以进行高效地通讯,也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。这篇文章主要深入探索 Kubernetes 网络模型,并了解容器、pod 间如何进行通讯。对于网络模型的实现将会在后面的文章介绍。Kubernetes 网络模型该模型定义了:每个 pod 都有自己的 IP 地址,这个 IP 在集群范围内可达Pod

2022-12-07 08:25:52 496

原创 零信任安全:SPIFFE 和 SPIRE 通用身份验证的标准和实现

最近正在读 《Solving the Bottom Turtle》 这本书,这篇是对部分内容的总结和思考,由于内容较多,会分几篇来发。这本书的副标题是:a SPIFFE Way to Establish Trust in Your Infrastructure via Universal Identity.通过通用身份以 SPIFFE 的方式在基础设施中建立信任。大家记住其中的有几个关键词:通用身份、SPIFFE 的方式、基础设施、建立信任。背景零信任是一种异常火热的安全模型,在之前翻译

2022-09-16 08:15:33 930

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除