在 Kubernetes(K8s)项目中,plugin
目录用于存放插件相关的代码和配置。插件是用来扩展和自定义 Kubernetes 的核心功能的组件。它们可以添加新的资源类型、调度策略、网络功能、存储后端以及其他的扩展能力。
如下是 plugin
目录中常见的一些子目录和它们的作用:
pkg
: 这个目录通常包含了插件的核心代码,例如一些共享的库、工具函数和类型定义等。插件的实现可以使用这些代码来与 Kubernetes 系统进行交互。
cmd
: 该目录包含了插件的可执行文件,用于启动和管理插件的进程。每个插件通常有一个独立的命令行工具,用于配置和管理插件的运行。
apis
: 该目录用于定义插件的自定义 API 资源类型。插件可以通过自定义资源定义(Custom Resource Definitions, CRDs)添加新的 API 对象,以扩展 Kubernetes 的 API。
admission
: 在该目录下,可以实现插件的准入控制(Admission Control)。准入控制是一种机制,用于对 Kubernetes API 请求进行筛选和修改。插件可以使用准入控制来验证、修正或拒绝 API 请求。
scheduler
: 该目录包含了插件的调度器相关代码。调度器是负责决定将容器化工作负载分配到哪个节点上的组件。通过实现自定义的调度器插件,可以实现特定的调度策略,如亲和性调度、互斥性调度等。
network
: 在这个目录下,可以实现插件的网络功能,例如 CNI(Container Network Interface)插件。CNI 插件用于配置容器网络,使得容器可以在 Kubernetes 集群中进行网络通信。
storage
: 该目录用于存放与存储相关的插件。存储插件可以实现不同的存储后端,以供容器使用,例如本地存储、分布式文件系统、云存储等。
volume
: 在这个目录下,可以实现插件的卷存储(Volume)功能。卷存储插件用于将持久化数据附加到容器,并将其作为文件系统提供给容器。
plugin完整目录结构为:
.
├── OWNERS
└── pkg
├── admission
│ ├── OWNERS
│ ├── admit
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── alwayspullimages
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── antiaffinity
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ └── doc.go
│ ├── certificates
│ │ ├── OWNERS
│ │ ├── approval
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ ├── ctbattest
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ ├── signing
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ ├── subjectrestriction
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ └── util.go
│ ├── defaulttolerationseconds
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── deny
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── eventratelimit
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ ├── apis
│ │ │ └── eventratelimit
│ │ │ ├── OWNERS
│ │ │ ├── doc.go
│ │ │ ├── install
│ │ │ │ └── install.go
│ │ │ ├── register.go
│ │ │ ├── types.go
│ │ │ ├── v1alpha1
│ │ │ │ ├── defaults.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── register.go
│ │ │ │ ├── types.go
│ │ │ │ ├── zz_generated.conversion.go
│ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ └── zz_generated.defaults.go
│ │ │ ├── validation
│ │ │ │ ├── validation.go
│ │ │ │ └── validation_test.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ └── limitenforcer.go
│ ├── extendedresourcetoleration
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── gc
│ │ ├── gc_admission.go
│ │ └── gc_admission_test.go
│ ├── imagepolicy
│ │ ├── OWNERS
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ ├── certs_test.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── doc.go
│ │ └── gencerts.sh
│ ├── limitranger
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ └── interfaces.go
│ ├── namespace
│ │ ├── autoprovision
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ └── exists
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── network
│ │ ├── defaultingressclass
│ │ │ ├── admission.go
│ │ │ └── admission_test.go
│ │ └── denyserviceexternalips
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── noderestriction
│ │ ├── OWNERS
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── nodetaint
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── podnodeselector
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── podtolerationrestriction
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ ├── apis
│ │ │ └── podtolerationrestriction
│ │ │ ├── OWNERS
│ │ │ ├── doc.go
│ │ │ ├── install
│ │ │ │ └── install.go
│ │ │ ├── register.go
│ │ │ ├── types.go
│ │ │ ├── v1alpha1
│ │ │ │ ├── defaults.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── register.go
│ │ │ │ ├── types.go
│ │ │ │ ├── zz_generated.conversion.go
│ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ └── zz_generated.defaults.go
│ │ │ ├── validation
│ │ │ │ ├── validation.go
│ │ │ │ └── validation_test.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── config.go
│ │ └── doc.go
│ ├── priority
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── resourcequota
│ │ └── admission_test.go
│ ├── runtimeclass
│ │ ├── OWNERS
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── security
│ │ ├── doc.go
│ │ └── podsecurity
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ └── testdata
│ │ ├── pod_baseline.yaml
│ │ └── pod_restricted.yaml
│ ├── securitycontext
│ │ └── scdeny
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── serviceaccount
│ │ ├── OWNERS
│ │ ├── admission.go
│ │ ├── admission_test.go
│ │ └── doc.go
│ └── storage
│ ├── persistentvolume
│ │ ├── label
│ │ │ ├── OWNERS
│ │ │ ├── admission.go
│ │ │ ├── admission_test.go
│ │ │ └── doc.go
│ │ └── resize
│ │ ├── admission.go
│ │ └── admission_test.go
│ ├── storageclass
│ │ └── setdefault
│ │ ├── admission.go
│ │ └── admission_test.go
│ └── storageobjectinuseprotection
│ ├── admission.go
│ └── admission_test.go
└── auth
├── OWNERS
├── authenticator
│ ├── OWNERS
│ └── token
│ └── bootstrap
│ ├── bootstrap.go
│ └── bootstrap_test.go
├── authorizer
│ ├── OWNERS
│ ├── doc.go
│ ├── node
│ │ ├── OWNERS
│ │ ├── graph.go
│ │ ├── graph_populator.go
│ │ ├── graph_test.go
│ │ ├── intset.go
│ │ ├── intset_test.go
│ │ ├── metrics.go
│ │ ├── node_authorizer.go
│ │ └── node_authorizer_test.go
│ └── rbac
│ ├── bootstrappolicy
│ │ ├── controller_policy.go
│ │ ├── controller_policy_test.go
│ │ ├── namespace_policy.go
│ │ ├── policy.go
│ │ ├── policy_test.go
│ │ └── testdata
│ │ ├── cluster-role-bindings.yaml
│ │ ├── cluster-roles.yaml
│ │ ├── controller-role-bindings.yaml
│ │ ├── controller-roles.yaml
│ │ ├── namespace-role-bindings.yaml
│ │ └── namespace-roles.yaml
│ ├── rbac.go
│ ├── rbac_test.go
│ ├── subject_locator.go
│ └── subject_locator_test.go
└── doc.go
62 directories, 152 files
File: plugin/pkg/admission/storage/storageobjectinuseprotection/admission.go
在Kubernetes项目中,plugin/pkg/admission/storage/storageobjectinuseprotection/admission.go
文件是一个控制器插件,用于保护正在使用的存储对象。这个插件的主要功能是在删除持久卷(PersistentVolume)和持久卷声明(PersistentVolumeClaim)之前,检查是否有其他正在使用这些存储对象的资源。
接下来,逐个介绍这些变量和函数的作用:
_
变量:在Go语言中,_
被用作占位符,表示忽略该变量。pvResource
变量:代表持久卷(PersistentVolume)的Kubernetes资源。pvcResource
变量:代表持久卷声明(PersistentVolumeClaim)的Kubernetes资源。
接下来是一些结构体的作用:
storageProtectionPlugin
结构体:表示存储保护插件的实例结构,用于注册和调用相关的函数。Register
函数:用于将存储保护插件注册到Kubernetes的插件管理器中。newPlugin
函数:创建一个新的存储保护插件实例。Admit
函数:是存储保护插件的主要入口点,用于拦截和处理请求。admitPV
函数:用于处理持久卷(PersistentVolume)的请求,进行存储保护的检查。admitPVC
函数:用于处理持久卷声明(PersistentVolumeClaim)的请求,进行存储保护的检查。
总而言之,plugin/pkg/admission/storage/storageobjectinuseprotection/admission.go
文件中的这些变量和函数实现了一个存储保护插件,用于拦截、检查和处理持久卷和持久卷声明的请求,以保护正在使用的存储对象不被意外删除。
File: plugin/pkg/auth/doc.go
在Kubernetes项目中,plugin/pkg/auth/doc.go
文件的作用是提供身份验证相关的文档和说明,以帮助开发人员更好地理解和使用身份验证插件。
具体来说,该文件是一个Go语言源代码文件,使用了标准的Godoc格式。它包含了身份验证插件包中各个部分的文档注释,以及一些对该包整体功能和设计进行解释的文档。这些文档注释中描述了各个函数、方法和类型的作用、输入/输出参数、使用注意事项等详细信息。
这个文件的主要目的是作为项目的文档源,供开发人员参考和借鉴。它提供了关于身份验证插件包的整体概述,帮助开发人员快速了解该包的功能和设计思想。通过阅读该文件,开发人员可以更好地理解身份验证插件的使用方法,正确地调用各个函数和方法,并遵循最佳实践。
除了提供基本的函数和方法文档,doc.go
文件还可以包含一些示例代码、使用说明和注意事项,以进一步辅助开发人员使用身份验证插件。它可以包含一些高级的概念和设计原则的解释,帮助开发人员掌握更深入的知识和技巧。
总结起来,plugin/pkg/auth/doc.go
文件在Kubernetes项目中的作用是为身份验证插件包提供详细的文档和说明,帮助开发人员快速理解和正确使用该包,以及掌握身份验证插件的更高级特性和最佳实践。
File: plugin/pkg/admission/certificates/util.go
在 Kubernetes 项目中,plugin/pkg/admission/certificates/util.go 文件是一个证书工具文件,主要用于证书的验证和生成。
其中,IsAuthorizedForSignerName 函数用于检查给定的证书是否被授权使用指定的发行者名称(signer name)。它会验证证书的签名是否来自于授权的发行者,并返回一个布尔值表示验证结果。
buildAttributes 函数用于构建证书的属性,包括 Common Name、组织、国家/地区、省份等。它从给定的证书请求中提取信息,并构建一个具有标准格式的属性对象。
buildWildcardAttributes 函数用于构建一个带有通配符的证书属性。它接收一个基础域名,并通过将通配符(*) 添加到该域名的左侧,构建一个用于签发通配符证书的属性对象。
这些函数在 Kubernetes 中的证书管理和权限控制中起着重要的作用。通过验证证书的签名和构建正确的属性,可以确保证书的合法性和授权性。同时,通过构建通配符证书属性,可以方便地管理和签发带有通配符的证书,提供更灵活的证书管理能力。
File: plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/install.go
在Kubernetes项目中,plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/install.go
文件的作用是为Pod容忍限制(admission controller)定义安装方法和资源。
详细解释每个函数的作用如下:
Install
函数:Install
函数负责将Pod容忍限制(admission controller)相关的自定义资源定义(CRD)添加到Kubernetes集群中。- 首先,它创建一个
apiextensionsv1.CustomResourceDefinition
对象,用于定义Pod容忍的限制规则自定义资源的结构。这个定义规定了资源名称、规范和版本等属性。 - 然后,它通过Kubernetes的API Server将自定义资源定义对象创建到集群中。
- 最后,它检查是否出现错误,如果有错误则打印日志。
Uninstall
函数:Uninstall
函数用于从Kubernetes集群中删除Pod容忍限制(admission controller)相关的自定义资源定义。- 它首先通过API Server获取CRD的名称和API 版本。
- 然后,通过这些信息创建一个
apiextensionsv1.CustomResourceDefinition
对象,并将其删除。 - 最后,它检查是否出现错误,如果有错误则打印日志。
InstallMutatingWebhook
函数:InstallMutatingWebhook
函数用于安装Pod容忍限制(admission controller)的Mutating Webhook。- 它首先定义了一个Mutating Webhook配置对象,并指定了Webhook服务器、路径、端口等属性。
- 然后,它通过Kubernetes的API Server将Mutating Webhook配置对象创建到集群中。
- 最后,它检查是否出现错误,如果有错误则打印日志。
UninstallMutatingWebhook
函数:UninstallMutatingWebhook
函数用于卸载Pod容忍限制(admission controller)的Mutating Webhook。- 它首先通过API Server获取Webhook的配置名称和API 版本。
- 然后,通过这些信息创建一个Mutating Webhook配置对象,并将其删除。
- 最后,它检查是否出现错误,如果有错误则打印日志。
这些函数提供了可重用的方法,用于安装和卸载Pod容忍限制(admission controller)的自定义资源定义和Webhook配置。它们为Pod容忍限制功能的部署、管理和维护提供了便利。
File: plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/register.go
在Kubernetes项目中,plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/register.go文件的作用是对Pod的容忍性约束进行注册。
该文件中的变量和函数起到了以下作用:
SchemeGroupVersion
:定义了Pod容忍性约束API组和版本。SchemeBuilder
:用于构建Kubernetes对象的Scheme,它可以添加自定义的类型和默认的类型到Scheme中。localSchemeBuilder
:本地的Scheme构建器,用于定义Pod容忍性约束的类型。AddToScheme
:将Pod容忍性约束的类型添加到指定的Scheme中,以便可以在Kubernetes中使用这些类型。
下面是这些函数的详细解释:
init
:该函数是包级别的初始化函数,在引入包时自动调用。在这个文件中,它注册了Pod容忍性约束的类型和版本。addKnownTypes
:该函数用于添加Pod容忍性约束的类型到指定的Scheme中。首先,它使用localSchemeBuilder
创建一个新的Scheme。然后,它将Pod容忍性约束的类型和版本注册到该Scheme中。
此文件的主要目标是注册Pod容忍性约束的自定义类型和版本,以便在Kubernetes中可以使用这些类型。这样,Kubernetes可以在Pod创建和调度时使用这些容忍性约束来约束Pod的调度行为。
File: plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/types.go
在Kubernetes项目中,plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/types.go
文件的作用是定义了Pod Toleration Restriction的API对象。
该文件中定义了以下三个结构体来表示Pod Toleration Restriction的配置:
Configuration
:该结构体表示Pod Toleration Restriction的整体配置对象,包含多个Pod Toleration Restriction的规则。PodTolerationRestriction
:该结构体表示单个Pod Toleration Restriction的规则,包括禁止的Toleration键值对以及作用于哪些Namespace。PodToleration
:该结构体表示Pod的Toleration对象,用于指定Pod所容忍的特殊节点条件。
这些结构体的作用如下:
Configuration
结构体用于包含整个Pod Toleration Restriction的配置,可以定义多个PodTolerationRestriction
规则。PodTolerationRestriction
结构体用于定义单个Pod Toleration Restriction的规则,包括禁止的Toleration键值对以及作用于哪些Namespace。它可以限制在指定的Namespace中哪些Pod允许或禁止使用特定的Toleration。PodToleration
结构体用于表示Pod的Toleration,用于指定Pod所容忍的特殊节点条件。Toleration允许Pod在调度时选择是否容忍具有指定Taints的节点。
通过这些结构体,可以在Kubernetes中定义和配置Pod Toleration Restriction的规则,从而限制在特定的Namespace中哪些Pod可以使用特定的Toleration,从而增强了对集群中Pod的调度和部署的控制能力。
File: plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/defaults.go
在kubernetes的项目中,plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/defaults.go文件的作用是为Pod Toleration Restriction API的v1alpha1版本定义默认值。
该文件中的addDefaultingFuncs函数集合定义了一系列的默认值设置函数,这些函数用来为Pod Toleration Restriction API对象的各个字段设置默认值。这些函数在对象创建时被调用,以确保对象的字段具有默认值。
以下是addDefaultingFuncs函数集合中的几个函数以及它们的作用:
addDefaultingFuncs:
- 该函数将以下函数注册为Pod Toleration Restriction API对象的默认值设置函数。
SetDefaults_PodTolerationRestrictionSpec:
- 该函数用于为PodTolerationRestrictionSpec对象的字段设置默认值。
- 它将为未设置的字段设置默认值,例如设置Spec字段的默认值。如果Spec字段为空,则会根据需求自动设置默认值。
SetDefaults_PodTolerationRestriction:
- 该函数用于为PodTolerationRestriction对象的字段设置默认值。
- 它将为未设置的字段设置默认值,例如设置TypeMeta字段的默认值。
这些默认值设置函数的目的是确保在创建Pod Toleration Restriction对象时,所有字段都有合适的默认值。这样可以简化对象的创建,并减少用户需要手动设置的字段数量,提高使用的方便性。
File: plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/validation.go
在 Kubernetes 项目中,plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/validation.go
文件的作用是验证 Pod 的容忍度限制配置是否有效和合法。该文件包含了用于验证的函数。
以下是 validation.go
文件中的 ValidateConfiguration
函数的作用:
ValidateConfiguration
函数验证 Pod 的容忍度限制配置是否有效和合法。ValidateTolerationsForCreation
函数验证在创建 Pod 时的容忍度限制配置是否有效和合法。ValidateTolerationsForUpdate
函数验证在更新 Pod 时的容忍度限制配置是否有效和合法。ValidateTolerations
函数验证容忍度限制配置是否有效和合法。
这些函数的作用分别如下:
ValidateConfiguration
函数执行完整的配置验证,使用其他函数进行具体的验证,并返回任何无效配置的错误信息。ValidateTolerationsForCreation
函数验证在创建 Pod 时的容忍度限制配置是否有效和合法。它会检查容忍度配置是否满足一些必要的条件,并返回任何无效配置的错误信息。ValidateTolerationsForUpdate
函数验证在更新 Pod 时的容忍度限制配置是否有效和合法。它也会检查容忍度配置是否满足一些必要的条件,并返回任何无效配置的错误信息。ValidateTolerations
函数验证容忍度限制配置是否有效和合法。它检查容忍度配置是否满足一些必要的条件,并返回任何无效配置的错误信息。
通过这些函数,validation.go
文件确保 Pod 的容忍度限制配置符合规定,并防止无效或不合法的配置被应用。
File: plugin/pkg/admission/eventratelimit/cache.go
在Kubernetes项目中,plugin/pkg/admission/eventratelimit/cache.go文件的主要作用是实现请求事件速率限制的缓存功能。
具体来说,该文件中定义了三个结构体:cache、singleCache和lruCache。
- cache结构体:是一个通用的缓存实现,用于管理请求事件的速率限制。其中的key是请求的标识,value是缓存的数据。
- singleCache结构体:继承自cache结构体,用于单个请求的速率限制。它维护了请求的历史记录和相应的限制策略,以判断当前请求是否符合限制条件。
- lruCache结构体:继承自cache结构体,用于管理请求的最近操作记录。它将请求的标识作为key,请求的时间戳作为value,用于判断是否需要清理过期的请求。
在cache.go文件中,还定义了一系列的get函数,用于获取缓存中的数据或执行相关操作:
- GetRequestCount:获取指定请求的计数值。
- GetKey:获取请求的标识。
- GetSingleCache:获取单个请求的缓存。
- GetLimitQuota:获取请求的限制配额。
- GetLimitBurst:获取请求的限制突发。
- GetListKeys:获取缓存中的所有请求标识。
- GetListValues:获取缓存中的所有请求值。
- GetExpireDuration:获取请求的过期时间。
- GetCacheSize:获取缓存的大小。
- GetExpiredKeys:获取已过期的请求标识列表。
- GetPendingKeys:获取所有等待中的请求标识列表。
通过这些get函数,可以对缓存中的数据进行查询、操作和管理,以实现请求事件速率的限制。
File: plugin/pkg/admission/podtolerationrestriction/config.go
在Kubernetes项目中,plugin/pkg/admission/podtolerationrestriction/config.go
文件的作用是定义了Pod容忍性限制插件的配置选项和配置加载的相关函数。
该文件中的scheme
变量用于定义golang程序的配置项,它被用于注册并访问存储在配置结构体中的选项。codecs
变量被用于序列化和反序列化配置选项。
init()
函数是一个特殊的初始化函数,它在包被导入时被调用。在config.go
文件中的init()
函数主要用于注册Golang命令行工具的Flags(参数)。在此文件中,init()
函数用于注册Pod容忍性限制插件的配置选项(例如:允许的容忍性配置、不允许的容忍性配置等)。
loadConfiguration()
函数用于从配置文件中加载和解析Pod容忍性限制插件的配置选项。该函数会获取默认的插件配置选项以及从命令行参数中传递的配置选项,并与配置文件中的配置选项合并。
总的来说,plugin/pkg/admission/podtolerationrestriction/config.go
文件的作用是定义和处理Pod容忍性限制插件的配置选项,并提供了函数用于加载和解析插件的配置选项。
File: plugin/pkg/admission/eventratelimit/limitenforcer.go
文件limitenforcer.go的作用是在Kubernetes中实施事件速率限制。在Kubernetes集群中,客户端可以发送请求来执行各种操作,如创建、更新或删除资源对象。为了避免恶意或错误的请求对集群造成过大的负担,需要对请求进行速率限制。
limitEnforcer是一个结构体,它是限制实施器的核心实现。它通过限制相同用户、相同源IP地址和相同对象的请求频率,来实施速率限制。
- newLimitEnforcer函数是用于创建新的限制实施器的工厂方法。
- accept函数用于判断某个请求是否应该被接受。在请求被接受之前,会进行一系列的检查,包括检查请求的源IP地址、用户、对象等是否已超出限制。
- getServerKey函数用于获取请求的服务器键。在集群中,一个请求可能是针对所有服务器的,这个函数用于返回服务器键。
- getNamespaceKey函数用于获取请求的命名空间键。命名空间键是一个标识,用于将请求与特定命名空间相关联。
- getUserKey函数用于获取请求的用户键。用户键用于将请求与特定用户相关联。
- getSourceAndObjectKey函数用于获取请求的源和对象键。这个函数将请求的源IP地址和对象信息组合成一个键。
通过这些函数和限制实施器的结构体,可以实现对请求进行速率限制,保护Kubernetes集群免受恶意或过大的请求负载的影响。
File: plugin/pkg/admission/gc/gc_admission.go
在 Kubernetes 项目中,plugin/pkg/admission/gc/gc_admission.go
文件的作用是实现资源垃圾回收的逻辑。它是一个 Kubernetes 的 Admission Controller 插件,用于在资源的创建、更新和删除之前进行验证和修改。
以下是关于提到的各个变量和函数的详细介绍:
_
:在 Go 语言中,下划线_
被用作一个空标识符,表示一个变量被声明但没有被使用。在这个文件中,_
变量是用于表示不使用的某些返回值或参数。gcPermissionsEnforcement
:这是一个全局布尔变量,用于配置是否启用资源垃圾回收的权限强制控制。whiteListItem
:这是一个结构体,用于存储资源垃圾回收的白名单项。它包含资源的 API 组、版本和资源类型等信息。Register
:这个函数用于注册垃圾回收的 Admission Controller 插件。isWhiteListed
:这个函数检查指定的资源是否在白名单中,确定是否进行垃圾回收。Validate
:这个函数用于验证资源对象是否满足垃圾回收的要求。它检查资源对象中是否存在与垃圾回收相关的注释和标签,并进行相应的处理。isChangingOwnerReference
:这个函数检查资源对象是否正在修改其拥有者引用,用于确定是否进行垃圾回收。finalizeAnythingRecord
:这个函数用于标记特定资源对象的垃圾回收状态。ownerRefToDeleteAttributeRecords
:这个函数用于删除指定资源对象的垃圾回收记录。blockingOwnerRefs
:这个函数用于查找和返回拥有者引用的资源对象。indexByUID
:这是一个用于索引资源对象的函数,以便更高效地进行访问和检查。newBlockingOwnerDeletionRefs
:这个函数用于创建拥有者引用的删除记录。SetAuthorizer
:这个函数用于设置垃圾回收的授权器,用于验证用户对资源的操作权限。SetRESTMapper
:这个函数用于设置 REST 映射器,以便将资源对象映射到相应的 API 组、版本和资源类型。ValidateInitialization
:这个函数用于验证垃圾回收插件的初始化,并确保所需的依赖关系和配置正确设置。
这些变量和函数共同协作,实现了 Kubernetes 中资源对象的垃圾回收功能,确保系统中的资源得到有效管理和释放。
File: plugin/pkg/admission/limitranger/interfaces.go
在Kubernetes项目中,plugin/pkg/admission/limitranger/interfaces.go
文件定义了限制范围(LimitRanger)插件的接口和相关结构体。这个插件用于实施资源的配额和限制,确保在Kubernetes集群中可控地分配资源给每个运行的容器。
该文件中的接口和结构体充当了限制范围插件的核心部分,提供了与Kubernetes API服务器进行交互和处理容器资源请求的方法。
下面是interfaces.go
文件中的一些重要结构体和它们的作用:
LimitRangerAdmitInterface
接口: 该接口定义了一个Admit
方法,用于对资源请求进行验证和审批。它接收一个*v1.AdmissionRequest
对象作为输入,并返回一个*v1.AdmissionResponse
对象。这个接口的实现类负责根据资源请求和集群中的配置规则来判断是否允许对该请求进行审批。LimitRangerInterface
接口: 该接口定义了与限制范围插件交互的方法。主要有两个方法,UpdatePluginConfig
用于更新插件的配置,ResourceCreated
用于处理新创建的资源。LimitRangerActions
结构体: 这个结构体定义了一些特定的LimitRanger操作。它包含了一组方法,每个方法对应了不同的操作类型,例如资源限制的验证(ValidateLimitRange)、容器创建的授权(AdmitCreate)、容器更新的授权(AdmitUpdate)等。这些操作在实现上会调用其他逻辑和验证方法,来确保资源请求满足集群配置的限制规则。
总的来说,interfaces.go
文件中的接口和结构体定义了限制范围插件的功能和操作,用于验证和授权容器的资源请求,以确保资源配额的合理分配和使用。
File: plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go
在 Kubernetes 项目中,plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go
文件的作用是实现了 TokenAuthenticator 接口的默认鉴权方法。下面对其中的结构体和函数进行详细介绍:
TokenAuthenticator
结构体:它是一个接口类型,定义了对 token 进行鉴权的方法。包括AuthenticateToken
和Wrap
。wrappedTokenAuthenticator
结构体:它是TokenAuthenticator
接口的实现,包装了一个TokenAuthenticator
实例和一个ErrorHandler
。当使用AuthenticateToken
方法进行鉴权时,会先调用wrappedTokenAuthenticator
的Resolve
方法获取到实际的TokenAuthenticator
实例,并调用其AuthenticateToken
方法进行鉴权。NewTokenAuthenticator
函数:它是一个构造函数,用于创建一个TokenAuthenticator
实例。该函数接受一个参数tokenAllower
,是一个函数类型,用于判断 token 是否允许通过身份验证。NewTokenAuthenticator
函数返回一个TokenAuthenticator
接口的实例。tokenErrorf
函数:它是一个辅助函数,用于格式化错误信息,并返回一个AuthenticationError
实例。AuthenticateToken
函数:它是TokenAuthenticator
接口的方法,用于对输入的 token 进行鉴权。该函数先调用tokenAllower
判断 token 是否允许通过身份验证,如果允许则返回对应的UserInfo
实例,否则返回一个AuthenticationError
。
总结起来,bootstrap.go
文件中的代码实现了对 token 的鉴权操作。通过 NewTokenAuthenticator
函数创建一个 TokenAuthenticator
实例,并使用 AuthenticateToken
方法对输入的 token 进行鉴权,根据鉴权结果返回对应的 UserInfo
或 AuthenticationError
实例。同时,在鉴权过程中,可以通过 tokenAllower
函数自定义判断 token 是否允许通过身份验证的逻辑。
File: plugin/pkg/auth/authorizer/node/graph.go
在kubernetes项目中,plugin/pkg/auth/authorizer/node/graph.go文件是用来实现用于节点授权的图形数据结构和相关操作的。它充当了一种权限验证方式,用于确定节点之间的连接和关联关系。以下是关于文件中相关部分的详细介绍:
- vertexTypes是一个枚举类型,定义了节点的不同类型,例如Pod、PV、VolumeAttachment等,用来标识不同类型的节点。
- namedVertex结构体表示一个带有名称的节点,用于表示具体的资源对象。它包含一个ID字段,用来唯一标识该节点,以及一个String字段,用来表示节点名称。
- destinationEdge结构体用于表示节点之间的连接关系,包括从一个节点到另一个节点的权重。
- Graph结构体表示整个图形,包含了与节点和边相关的信息。它包括了多个索引和映射,用于快速查找和操作节点和边。
- namespaceVertexMapping结构体用于映射命名空间到具体的节点,方便查找某个命名空间下的节点。
- nameVertexMapping结构体用于映射名称到具体的节点,方便根据名称查找节点。
- vertexType是一个映射表,用于将节点类型映射到对应的枚举类型。
- newNamedVertex函数用于创建一个新的带有名称的节点。
- ID函数用于获取节点的唯一标识。
- String函数用于获取节点的名称。
- newDestinationEdge函数用于创建一个从源节点到目标节点的连接。
- From函数用于获取边的源节点。
- To函数用于获取边的目标节点。
- Weight函数用于获取边的权重。
- DestinationID函数用于获取边的目标节点的唯一标识。
- NewGraph函数用于创建一个新的图形对象。
- getOrCreateVertex_locked函数用于获取或创建一个节点,并在操作过程中加锁。
- getVertex_rlocked函数用于获取一个节点的只读副本,不会加锁。
- createVertex_locked函数用于创建一个新的节点,并在操作过程中加锁。
- deleteVertex_locked函数用于删除一个节点,并在操作过程中加锁。
- deleteEdges_locked函数用于删除与节点相关的边,并在操作过程中加锁。
- removeEdgeFromDestinationIndex_locked函数用于从目标节点的索引中删除一条边,并在操作过程中加锁。
- addEdgeToDestinationIndex_locked函数用于向目标节点的索引中添加一条边,并在操作过程中加锁。
- removeVertex_locked函数用于从图形中删除一个节点,并在操作过程中加锁。
- recomputeDestinationIndex_locked函数用于重新计算目标节点的索引,并在操作过程中加锁。
- AddPod函数用于向图形中添加一个Pod节点。
- DeletePod函数用于从图形中删除一个Pod节点。
- AddPV函数用于向图形中添加一个PV节点。
- DeletePV函数用于从图形中删除一个PV节点。
- AddVolumeAttachment函数用于向图形中添加一个VolumeAttachment节点。
- DeleteVolumeAttachment函数用于从图形中删除一个VolumeAttachment节点。
这些函数都是用于在图形中进行节点和边的操作,从而实现节点授权的功能。
File: plugin/pkg/auth/authorizer/node/graph_populator.go
在kubernetes项目中,plugin/pkg/auth/authorizer/node/graph_populator.go
文件的作用是实现节点图谱的填充。这个文件中的代码负责将不同资源(如Pod、PersistentVolume、VolumeAttachment等)添加到节点图谱中,并在资源发生变化时更新图谱。
graphPopulator
结构体是整个图谱填充过程的控制器。它包含了一些必要的字段和方法,用于初始化节点图谱、处理资源事件、更新图谱等。
下面是graphPopulator
结构体的重要字段和方法:
clusterGraph
:表示整个集群的节点图谱,用来保存各个节点及其关联的资源。podStore
:一个内存中的缓存,保存着集群中所有的Pod资源。pvcStore
:一个内存中的缓存,保存着集群中所有的PersistentVolumeClaim资源。volumeAttachmentStore
:一个内存中的缓存,保存着集群中所有的VolumeAttachment资源。
AddGraphEventHandlers
函数是graphPopulator
结构体的一个方法,用于为各个资源的事件注册相应的处理函数。当一个资源(如Pod、PersistentVolume等)发生变化时,这个函数会被调用,然后根据事件类型执行相应的操作。
以下是部分处理函数的功能简介:
addPod
:添加新的Pod到节点图谱中,设置Pod和对应节点之间的关联关系。updatePod
:更新图谱中现有Pod的信息,如Pod的状态、运行时信息等。deletePod
:从图谱中删除指定的Pod,清除Pod和节点之间的关联关系。addPV
:将新的PersistentVolume添加到图谱中。updatePV
:更新图谱中现有PersistentVolume的信息。deletePV
:从图谱中删除指定的PersistentVolume。addVolumeAttachment
:添加新的VolumeAttachment到图谱中,设置VolumeAttachment和对应节点之间的关联关系。updateVolumeAttachment
:更新图谱中现有VolumeAttachment的信息。deleteVolumeAttachment
:从图谱中删除指定的VolumeAttachment,清除VolumeAttachment和节点之间的关联关系。
总的来说,graph_populator.go
文件中的代码实现了节点图谱的填充逻辑,通过监听资源的事件,将各个资源(如Pod、PersistentVolume等)添加到图谱中,并在资源发生变化时更新图谱的信息。这样,在进行权限控制和调度等操作时,可以更方便地获取和处理节点与资源之间的关联关系。
File: plugin/pkg/auth/authorizer/node/intset.go
intset.go文件位于Kubernetes项目的plugin/pkg/auth/authorizer/node目录中,主要用于实现一个用于跟踪节点访问令牌的数据结构。这个数据结构是一个整数集合(intset),用于记录每个节点上令牌的数量。
intSet结构体定义了一个整数集合,它包含以下字段:
- items:一个map类型的字段,用于存储每个令牌标识对应的数量。
- counts:一个整数字段,用于记录整个集合中所有令牌的总数量。
newIntSet函数用于创建一个新的intSet实例,它会初始化items字段和counts字段,并返回一个指向这个新创建实例的指针。
has函数用于判断给定的令牌标识是否存在于集合中。它会检查items字段中是否存在该令牌标识的条目,并返回相应的布尔值。
reset函数用于重置整个集合,将所有令牌的数量都设置为0,并将counts字段重置为0。
increment函数用于增加指定令牌标识的数量。它会检查items字段中是否存在该令牌标识的条目,如果存在则将其数量增加1,如果不存在则创建一个新的条目并设置数量为1。
decrement函数用于减少指定令牌标识的数量。它会检查items字段中是否存在该令牌标识的条目,如果存在则将其数量减少1,如果数量减少后为0,则会删除该条目。
总之,该文件中的intSet数据结构和相关函数,用于管理节点访问令牌的数量,并提供对该集合的操作方法,以实现对节点令牌的增减和查询等功能。
File: plugin/pkg/auth/authorizer/node/metrics.go
文件路径:plugin/pkg/auth/authorizer/node/metrics.go
该文件实现了用于节点权限认证的度量指标(metrics)。它提供了一组度量指标,用于监控节点上的权限认证操作的持续时间。
具体来说,该文件定义了以下几个变量和函数:
- graphActionsDuration:该变量是一个度量指标,用于记录节点权限认证操作的持续时间。它使用Prometheus库提供的Histogram类型进行度量。Histogram是用于度量持续时间分布的一种指标类型,可以统计和计算操作执行的时间范围、数量以及分布。
- registerMetrics():这是一个用于注册度量指标的函数。它通过Prometheus库提供的方法创建并注册节点权限认证的度量指标。在该函数中,会创建用于记录权限认证持续时间的Histogram指标,并将其注册到Prometheus的默认注册器中。
- exposeMetricsEndpoint():这是一个用于向节点暴露度量指标的函数。它通过Prometheus库提供的HTTPHandler方法创建一个HTTP服务,用于暴露度量指标的API endpoint,并指定该服务的路径和端口。通过访问该API endpoint,可以获取当前节点上的权限认证持续时间的度量指标信息。
总的来说,该文件为节点权限认证操作提供了度量指标,可帮助系统管理员监控和分析节点的权限认证性能。graphActionsDuration变量用于记录权限认证操作的持续时间,registerMetrics函数用于创建和注册度量指标,exposeMetricsEndpoint函数用于暴露度量指标的API endpoint,以便获取度量指标信息。
File: plugin/pkg/auth/authorizer/node/node_authorizer.go
在Kubernetes项目中,plugin/pkg/auth/authorizer/node/node_authorizer.go这个文件是NodeAuthorizer节点授权器的实现。节点授权器用于对请求进行鉴权,决定其是否有权限执行特定操作。
以下是具体介绍:
- configMapResource:指定ConfigMap资源的名称。
- secretResource:指定Secret资源的名称。
- pvcResource:指定PersistentVolumeClaim资源的名称。
- pvResource:指定PersistentVolume资源的名称。
- vaResource:指定VolumeAttachment资源的名称。
- svcAcctResource:指定ServiceAccount资源的名称。
- leaseResource:指定Lease资源的名称。
- csiNodeResource:指定CSINode资源的名称。
这些变量定义了不同资源类型的名称,用于授权的匹配。
- NodeAuthorizer结构体:用于实现节点授权器。
- NewAuthorizer函数:用于创建一个新的节点授权器。
- RulesFor函数:根据请求的用户、资源和请求操作,返回相应的授权规则。
- Authorize函数:对节点请求进行授权处理。
- authorizeStatusUpdate函数:对节点状态更新进行授权校验。
- authorizeGet函数:对获取节点信息的请求进行授权校验。
- authorizeReadNamespacedObject函数:对读取命名空间中的对象进行授权校验。
- authorizeCreateToken函数:对创建令牌的请求进行授权校验。
- authorizeLease函数:对Lease资源的请求进行授权校验。
- authorizeCSINode函数:对CSINode资源的请求进行授权校验。
- hasPathFrom函数:检查资源A是否可以通过某些路径访问资源B。
这些函数是节点授权器的核心逻辑,根据请求的不同操作类型和资源类型,判断是否具有相应的权限并执行相应的鉴权逻辑。
总体而言,node_authorizer.go文件中的代码实现了Kubernetes节点授权器的功能,对请求进行鉴权判断,确保只有具有相应权限的实体可以对节点进行操作。
File: plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go
在Kubernetes项目中,plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go
文件的作用是构建和管理控制器的角色和角色绑定。
具体来说,这个文件是用于实现控制器的策略管理,控制器是Kubernetes中的核心组件,用于自动化管理和调度Pod和其他资源的状态。在Kubernetes中,控制器通过角色和角色绑定来控制访问控制策略。
下面是对controller_policy.go
文件中提到的几个函数的详细介绍:
addControllerRole
: 这个函数用于向给定的角色列表中添加控制器角色。控制器角色用于定义控制器对资源的访问权限。eventsRule
: 这个函数用于构建事件规则,事件规则定义了控制器能够访问的事件资源。buildControllerRoles
: 这个函数用于构建控制器角色。它使用指定的资源类型和动作列表生成角色名称,并为每个角色分别调用addControllerRole
函数。ControllerRoles
: 这个函数返回一个角色列表,包含了控制器支持的所有角色。ControllerRoleBindings
: 这个函数返回一个角色绑定列表,表示角色与被授权用户或组的关联关系。
通过这些函数,controller_policy.go
文件实现了控制器角色和角色绑定的管理功能,以确保控制器具有适当的权限来执行其指定的任务。通过定义合适的角色和角色绑定,可以更好地控制和限制控制器的访问权限,从而提高系统的安全性和可靠性。
File: plugin/pkg/auth/authorizer/rbac/bootstrappolicy/namespace_policy.go
在 Kubernetes 项目中,plugin/pkg/auth/authorizer/rbac/bootstrappolicy/namespace_policy.go
文件的作用是初始化和创建命名空间(Namespace)级别的 Role(角色)和 RoleBinding(角色绑定)。
下面是关于这个文件中各个变量和函数的详细介绍:
namespaceRoles
:这是一个存储命名空间角色(Role)的切片(slice),用于存储 Role 对象的定义。通过执行AddNamespaceRole
函数,可以向该切片添加新的 Role。namespaceRoleBindings
:这也是一个存储命名空间角色绑定(RoleBinding)的切片,用于存储 RoleBinding 对象的定义。通过执行AddNamespaceRoleBinding
函数,可以向该切片添加新的 RoleBinding。AddNamespaceRole
函数:用于向namespaceRoles
中添加一个命名空间角色。该函数接收角色的名称和权限规则,并创建一个 Role 对象,然后将其添加到namespaceRoles
中。AddNamespaceRoleBinding
函数:用于向namespaceRoleBindings
中添加一个命名空间角色绑定。该函数接收绑定名称、绑定的角色名称和绑定的命名空间,并创建一个 RoleBinding 对象,然后将其添加到namespaceRoleBindings
中。init
函数:在初始化时被调用,用于创建和填充命名空间角色和角色绑定。该函数首先会调用AddNamespaceRole
和AddNamespaceRoleBinding
函数,添加一些默认的命名空间角色和角色绑定。NamespaceRoles
函数:返回namespaceRoles
切片,用于获取已定义的命名空间角色。NamespaceRoleBindings
函数:返回namespaceRoleBindings
切片,用于获取已定义的命名空间角色绑定。
通过这些函数和变量,namespace_policy.go
文件提供了创建和管理命名空间角色和角色绑定的能力。这些角色和角色绑定可以用于控制和限制某些用户或服务对命名空间中资源的访问和操作权限。
File: plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go
在kubernetes项目中,plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go是一个文件,其作用是定义和实现RBAC(Role-Based Access Control)策略的构建。
下面详细介绍文件中的内容:
- Write、ReadWrite、Read、ReadUpdate、Label、Annotation:这些变量定义了不同级别的权限策略,用于控制对资源的访问权限。每个变量都代表一种权限级别,如Write表示写权限,Read表示读权限,Label表示标签权限等。这些权限级别的定义会被用于后续的策略构建中。
- addDefaultMetadata函数:这个函数用于为集群中默认的RBAC策略添加元数据。通过添加默认元数据,可以确保所有资源具有相同的标签和注释,以便更容易管理和筛选这些资源。
- addClusterRoleLabel函数:这个函数用于为集群角色(ClusterRole)添加标签。标签用于对角色进行分类和组织,从而方便管理员对角色进行管理和控制。
- addClusterRoleBindingLabel函数:这个函数用于为集群角色绑定(ClusterRoleBinding)添加标签。标签同样用于对角色绑定进行分类和组织,以便更好地管理和控制绑定关系。
- NodeRules函数:这个函数用于为节点(Node)定义权限规则,即定义节点的访问权限和操作限制。例如,可以限制节点只能读取特定类型的资源或者具有特定的标签。
- ClusterRoles函数:这个函数用于创建集群角色。集群角色是一组权限规则的集合,定义了对集群中资源的控制策略。通过ClusterRoles函数,可以创建不同的角色,并为每个角色指定特定的权限级别。
- ClusterRoleBindings函数:这个函数用于创建集群角色绑定。集群角色绑定将角色授予用户、组或者用户组,从而实现对角色的授权。通过ClusterRoleBindings函数,可以创建不同的角色绑定,并将角色绑定到特定的用户、组或者用户组。
- ClusterRolesToAggregate函数:这个函数用于定义集群角色集合。集群角色集合是一组聚合的角色,可以通过一个角色绑定而将一组角色授予用户或者组。ClusterRolesToAggregate函数定义了不同角色集合的组成。
- ClusterRoleBindingsToSplit函数:这个函数用于定义需要拆分的集群角色绑定。当一个角色绑定授予了一组角色时,可以使用ClusterRoleBindingsToSplit函数将角色绑定拆分为单独的角色绑定,从而更好地管理和控制角色的授权。
File: plugin/pkg/auth/authorizer/rbac/rbac.go
在Kubernetes项目中,文件plugin/pkg/auth/authorizer/rbac/rbac.go是负责实现基于角色的访问控制(Role-based Access Control, RBAC)的认证授权功能。
- RequestToRuleMapper:将请求映射到RBAC规则的接口,用于确定请求的操作和资源是否符合RBAC规则。
- RBACAuthorizer:基于RBAC规则的授权器,根据请求的用户和资源信息,使用规则判断用户是否有权限执行操作。
- authorizingVisitor:用于检查RBAC规则是否授权给用户或者服务账号。
- RoleGetter:获取角色对象的接口,用于获取指定名称的角色定义。
- RoleBindingLister:获取绑定到角色的列表,用于获取绑定了指定角色的用户或服务账号列表。
- ClusterRoleGetter:获取集群角色对象的接口,用于获取指定名称的集群角色定义。
- ClusterRoleBindingLister:获取绑定到集群角色的列表,用于获取绑定了指定集群角色的用户或服务账号列表。
以下是各个函数的作用:
- visit:访问RBAC规则,并确定用户是否有权限执行指定的操作和访问资源。
- Authorize:根据请求和RBAC规则,判断用户是否有权限执行指定的操作和访问资源。
- RulesFor:根据用户、资源和名称空间,获取RBAC规则。
- New:创建RBACAuthorizer对象,用于执行RBAC授权功能。
- RulesAllow:判断给定的RBAC规则是否允许指定的操作和资源。
- RuleAllows:判断给定的RBAC规则是否允许指定的操作和资源。
- GetRole:获取指定名称的角色对象。
- ListRoleBindings:获取绑定到角色的列表。
- GetClusterRole:获取指定名称的集群角色对象。
- ListClusterRoleBindings:获取绑定到集群角色的列表。
这些函数和结构体的作用是结合RBAC规则,实现对请求进行认证和授权,决定用户是否有权限执行操作和访问资源。
File: plugin/pkg/auth/authorizer/rbac/subject_locator.go
在Kubernetes项目中,plugin/pkg/auth/authorizer/rbac/subject_locator.go
文件的作用是定位主体(Subject)信息,用于授权验证。
_
:这个变量是一个占位符,表示忽略不需要使用的值。在这个文件中,这些占位符被用于忽略不需要的返回值。RoleToRuleMapper
:这个结构体用于将角色(Role)映射到规则(Rule)。它负责解析和映射角色定义的规则,并将其关联到相应的角色名称。SubjectLocator
:这个结构体用于定位主体信息。它包含一些函数和字段,用于根据提供的主体名称和类型查找相应的主体。SubjectAccessEvaluator
:这个结构体用于评估主体的访问权限。它根据规则评估是否允许主体执行某个操作。NewSubjectAccessEvaluator
:这个函数创建一个新的主体访问评估器。它接受一些参数,如主体定位器和角色到规则的映射,创建相应的评估器实例。AllowedSubjects
:这个函数根据指定的资源和操作,返回允许执行该操作的主体列表。它基于主体访问评估器的结果生成允许的主体列表,并排除不符合条件的主体。这个函数通常用于授权验证过程中确定能够执行操作的主体。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。