# 安装 kubeadm

LLMS index: [llms.txt](/llms.txt)

---

<!--
title: Installing kubeadm
content_type: task
weight: 10
card:
  name: setup
  weight: 20
  title: Install the kubeadm setup tool
-->

<!-- overview -->

<!--
<img src="/images/kubeadm-stacked-color.png" align="right" width="150px"></img>
This page shows how to install the `kubeadm` toolbox.
For information on how to create a cluster with kubeadm once you have performed this installation process,
see the [Creating a cluster with kubeadm](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) page.
-->
<img src="/images/kubeadm-stacked-color.png" align="right" width="150px"></img>
本页面显示如何安装 `kubeadm` 工具箱。
有关在执行此安装过程后如何使用 kubeadm 创建集群的信息，
请参见[使用 kubeadm 创建集群](/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)。







<div class="version-list">
    <p>
        此 installation guide 适用于 Kubernetes v1.36。如果你想使用其他 Kubernetes 版本，请参考以下页面：
    </p>
    <ul>
        
            
        
            
            <li>
                <a href="https://v1-35.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">安装 kubeadm (Kubernetes v1.35)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-34.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">安装 kubeadm (Kubernetes v1.34)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-33.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">安装 kubeadm (Kubernetes v1.33)</a>
            </li>
            
        
            
            <li>
                <a href="https://v1-32.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">安装 kubeadm (Kubernetes v1.32)</a>
            </li>
            
        
    </ul>
</div>


## 准备开始

<!--
* A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions
  based on Debian and Red Hat, and those distributions without a package manager.
* 2 GB or more of RAM per machine (any less will leave little room for your apps).
* 2 CPUs or more for control plane machines.
* Full network connectivity between all machines in the cluster (public or private network is fine).
* Unique hostname, MAC address, and product_uuid for every node. See [here](#verify-mac-address) for more details.
* Certain ports are open on your machines. See [here](#check-required-ports) for more details.
-->
* 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux
  发行版以及一些不提供包管理器的发行版提供通用的指令。
* 每台机器 2 GB 或更多的 RAM（如果少于这个数字将会影响你应用的运行内存）。
* 控制平面机器需要 CPU 2 核心或更多。
* 集群中的所有机器的网络彼此均能相互连接（公网和内网都可以）。
* 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见[这里](#verify-mac-address)了解更多详细信息。
* 开启机器上的某些端口。请参见[这里](#check-required-ports)了解更多详细信息。


<div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
The `kubeadm` installation is done via binaries that use dynamic linking and assumes that your target system provides `glibc`.
This is a reasonable assumption on many Linux distributions (including Debian, Ubuntu, Fedora, CentOS, etc.)
but it is not always the case with custom and lightweight distributions which don't include `glibc` by default, such as Alpine Linux.
The expectation is that the distribution either includes `glibc` or a
[compatibility layer](https://wiki.alpinelinux.org/wiki/Running_glibc_programs)
that provides the expected symbols.
-->
<p><code>kubeadm</code> 的安装是通过使用动态链接的二进制文件完成的，安装时假设你的目标系统提供 <code>glibc</code>。
这个假设在许多 Linux 发行版（包括 Debian、Ubuntu、Fedora、CentOS 等）上是合理的，
但对于不包含默认 <code>glibc</code> 的自定义和轻量级发行版（如 Alpine Linux），情况并非总是如此。
预期的情况是，发行版要么包含 <code>glibc</code>，
要么提供了一个<a href="https://wiki.alpinelinux.org/wiki/Running_glibc_programs">兼容层</a>以提供所需的符号。</p></div>


<!-- steps -->

<!--
## Check your OS version
-->
## 检查你的操作系统版本   {#check-your-os-version}

<div class="alert alert-secondary callout third-party-content" role="note"><strong>说明：</strong>&puncsp;本部分链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不负责这些项目。此页面遵循<a href="https://github.com/cncf/foundation/blob/main/policies-guidance/website-guidelines.md" target="_blank">CNCF 网站指南</a>，按字母顺序列出项目。要将项目添加到此列表中，请在提交更改之前阅读<a href="/zh-cn/docs/contribute/style/content-guide/#third-party-content">内容指南</a>。</div>


<ul class="nav nav-tabs" id="tabs-operating-system-version-check" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-operating-system-version-check-0" role="tab" aria-controls="tabs-operating-system-version-check-0" aria-selected="true">Linux</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-operating-system-version-check-1" role="tab" aria-controls="tabs-operating-system-version-check-1">Windows</a></li></ul>

<div class="tab-content" id="tabs-operating-system-version-check-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-operating-system-version-check-0" role="tabpanel" aria-labelledby="tabs-operating-system-version-check-0-tab" tabindex="operating-system-version-check"><!--
* The kubeadm project supports LTS kernels. See [List of LTS kernels](https://www.kernel.org/category/releases.html).
* You can get the kernel version using the command `uname -r`

For more information, see [Linux Kernel Requirements](/docs/reference/node/kernel-version-requirements/).
-->
<ul>
<li>kubeadm 项目支持 LTS 内核。参阅 <a href="https://www.kernel.org/category/releases.html">LTS 内核列表</a>。</li>
<li>你可以使用命令 <code>uname -r</code> 获取内核版本。</li>
</ul>
<p>欲了解更多信息，参阅 <a href="/zh-cn/docs/reference/node/kernel-version-requirements/">Linux 内核要求</a>。</p>
</div><div class="tab-body tab-pane fade"
        id="tabs-operating-system-version-check-1" role="tabpanel" aria-labelledby="tabs-operating-system-version-check-1-tab" tabindex="operating-system-version-check"><!--
* The kubeadm project supports recent kernel versions. For a list of recent kernels, see [Windows Server Release Information](https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info).
* You can get the kernel version (also called the OS version) using the command `systeminfo`

For more information, see [Windows OS version compatibility](/docs/concepts/windows/intro/#windows-os-version-support).
-->
<ul>
<li>kubeadm 项目支持最近的内核版本。有关最新内核的列表，参阅
<a href="https://learn.microsoft.com/zh-cn/windows/release-health/windows-server-release-info">Windows Server 版本信息</a>。</li>
<li>你可以使用命令 <code>systeminfo</code> 获取内核版本（也称为操作系统版本）。</li>
</ul>
<p>欲了解更多信息，参阅 <a href="/zh-cn/docs/concepts/windows/intro/#windows-os-version-support">Windows 操作系统版本兼容性</a>。</p>
</div></div>


<!--
A Kubernetes cluster created by kubeadm depends on software that use kernel features.
This software includes, but is not limited to the
<a class='glossary-tooltip' title='容器运行时是负责运行容器的软件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='container runtime'>container runtime</a>,
the <a class='glossary-tooltip' title='一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/reference/command-line-tools-reference/kubelet' target='_blank' aria-label='kubelet'>kubelet</a>, and a <a class='glossary-tooltip' title='容器网络接口 (Container network interface；CNI) 插件是遵循 appc/CNI 协议的一类网络插件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/' target='_blank' aria-label='Container Network Interface'>Container Network Interface</a> plugin.
-->
由 kubeadm 创建的 Kubernetes 集群依赖于使用内核特性的相关软件。  
这些软件包括但不限于<a class='glossary-tooltip' title='容器运行时是负责运行容器的软件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='容器运行时'>容器运行时</a>、  
<a class='glossary-tooltip' title='一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/reference/command-line-tools-reference/kubelet' target='_blank' aria-label='kubelet'>kubelet</a>
和<a class='glossary-tooltip' title='容器网络接口 (Container network interface；CNI) 插件是遵循 appc/CNI 协议的一类网络插件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/' target='_blank' aria-label='容器网络接口（CNI）'>容器网络接口（CNI）</a>插件。

<!--
To help you avoid unexpected errors as a result of an unsupported kernel version, kubeadm runs the `SystemVerification`
pre-flight check. This check fails if the kernel version is not supported.

You may choose to skip the check, if you know that your kernel
provides the required features, even though kubeadm does not support its version.
-->
为帮助你避免因内核版本不受支持而引发的意外错误，kubeadm 运行 `SystemVerification` 执行预检。  
如果内核版本不受支持，预检将失败。

如果你确认你的内核具备所需特性，尽管其版本不在 kubeadm 支持范围内，你也可以选择跳过此检查。

<!--
## Verify the MAC address and product_uuid are unique for every node {#verify-mac-address}

* You can get the MAC address of the network interfaces using the command `ip link` or `ifconfig -a`
* The product_uuid can be checked by using the command `sudo cat /sys/class/dmi/id/product_uuid`

It is very likely that hardware devices will have unique addresses, although some virtual machines may have
identical values. Kubernetes uses these values to uniquely identify the nodes in the cluster.
If these values are not unique to each node, the installation process
may [fail](https://github.com/kubernetes/kubeadm/issues/31).
-->
## 确保每个节点上 MAC 地址和 product_uuid 的唯一性    {#verify-mac-address}

* 你可以使用命令 `ip link` 或 `ifconfig -a` 来获取网络接口的 MAC 地址
* 可以使用 `sudo cat /sys/class/dmi/id/product_uuid` 命令对 product_uuid 校验

一般来讲，硬件设备会拥有唯一的地址，但是有些虚拟机的地址可能会重复。
Kubernetes 使用这些值来唯一确定集群中的节点。
如果这些值在每个节点上不唯一，可能会导致安装[失败](https://github.com/kubernetes/kubeadm/issues/31)。

<!--
## Check network adapters

If you have more than one network adapter, and your Kubernetes components are not reachable on the default
route, we recommend you add IP route(s) so Kubernetes cluster addresses go via the appropriate adapter.
-->
## 检查网络适配器   {#check-network-adapters}

如果你有一个以上的网络适配器，同时你的 Kubernetes 组件通过默认路由不可达，我们建议你预先添加 IP 路由规则，
这样 Kubernetes 集群就可以通过对应的适配器完成连接。

<!--
## Check required ports {#check-required-ports}
These
These [required ports](/docs/reference/networking/ports-and-protocols/)
need to be open in order for Kubernetes components to communicate with each other.
You can use tools like [netcat](https://netcat.sourceforge.net) to check if a port is open. For example:
-->
## 检查所需端口   {#check-required-ports}

启用这些[必要的端口](/zh-cn/docs/reference/networking/ports-and-protocols/)后才能使 Kubernetes 的各组件相互通信。
可以使用 [netcat](https://netcat.sourceforge.net) 之类的工具来检查端口是否开放，例如：

```shell
nc 127.0.0.1 6443 -zv -w 2
```

<!--
The pod network plugin you use may also require certain ports to be
open. Since this differs with each pod network plugin, please see the
documentation for the plugins about what port(s) those need.
-->
你使用的 Pod 网络插件 (详见后续章节) 也可能需要开启某些特定端口。
由于各个 Pod 网络插件的功能都有所不同，请参阅他们各自文档中对端口的要求。

<!--
## Swap configuration {#swap-configuration}

The default behavior of a kubelet is to fail to start if swap memory is detected on a node.
This means that swap should either be disabled or tolerated by kubelet.

* To tolerate swap, add `failSwapOn: false` to kubelet configuration or as a command line argument.
  Note: even if `failSwapOn: false` is provided, workloads wouldn't have swap access by default.
  This can be changed by setting a `swapBehavior`, again in the kubelet configuration file. To use swap,
  set a `swapBehavior` other than the default `NoSwap` setting.
  See [Swap memory management](/docs/concepts/cluster-administration/swap-memory-management) for more details.
* To disable swap, `sudo swapoff -a` can be used to disable swapping temporarily.
  To make this change persistent across reboots, make sure swap is disabled in
  config files like `/etc/fstab`, `systemd.swap`, depending how it was configured on your system.
-->
## 交换分区的配置 {#swap-configuration}

kubelet 的默认行为是在节点上检测到交换内存时无法启动。
这意味着要么禁用交换（swap）功能，要么让 kubelet 容忍交换。

* 若需允许交换分区（swap），请在 kubelet 配置文件中添加 `failSwapOn: false`，或通过命令行参数指定。
  注意：即使设置了 `failSwapOn: false`，工作负载默认情况下仍无法访问交换空间。
  可以通过在 kubelet 配置文件中设置 `swapBehavior` 来修改此设置。若要使用交换空间，
  请设置 `swapBehavior` 的值，这个值不能是默认的 `NoSwap`。
  更多细节参阅[交换内存管理](/zh-cn/docs/concepts/cluster-administration/swap-memory-management)。
* 要禁用交换分区（swap），可以使用命令 `sudo swapoff -a` 暂时关闭交换分区功能。
  要使此更改在重启后仍然生效，请确保在系统的配置文件（如 `/etc/fstab` 或 `systemd.swap`）中禁用交换功能，
  具体取决于你的系统配置方式。

<!--
## Installing a container runtime {#installing-runtime}

To run containers in Pods, Kubernetes uses a
<a class='glossary-tooltip' title='容器运行时是负责运行容器的软件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='container runtime'>container runtime</a>.
-->
## 安装容器运行时   {#installing-runtime}

为了在 Pod 中运行容器，Kubernetes
使用<a class='glossary-tooltip' title='容器运行时是负责运行容器的软件。' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='容器运行时（Container Runtime）'>容器运行时（Container Runtime）</a>。

<!--
By default, Kubernetes uses the
<a class='glossary-tooltip' title='在 kubelet 和本地容器运行时之间通讯的协议' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/concepts/architecture/cri' target='_blank' aria-label='Container Runtime Interface'>Container Runtime Interface</a> (CRI)
to interface with your chosen container runtime.

If you don't specify a runtime, kubeadm automatically tries to detect an installed
container runtime by scanning through a list of known endpoints.
-->
默认情况下，Kubernetes
使用<a class='glossary-tooltip' title='在 kubelet 和本地容器运行时之间通讯的协议' data-bs-toggle='tooltip' data-bs-placement='top' href='/zh-cn/docs/concepts/architecture/cri' target='_blank' aria-label='容器运行时接口（Container Runtime Interface，CRI）'>容器运行时接口（Container Runtime Interface，CRI）</a>
来与你所选择的容器运行时交互。

如果你不指定运行时，kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时。

<!--
If multiple or no container runtimes are detected kubeadm will throw an error
and will request that you specify which one you want to use.

See [container runtimes](/docs/setup/production-environment/container-runtimes/)
for more information.
-->
如果检测到有多个或者没有容器运行时，kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时。

参阅[容器运行时](/zh-cn/docs/setup/production-environment/container-runtimes/)以了解更多信息。


<div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
Docker Engine does not implement the [CRI](/docs/concepts/architecture/cri/)
which is a requirement for a container runtime to work with Kubernetes.
For that reason, an additional service [cri-dockerd](https://mirantis.github.io/cri-dockerd/)
has to be installed. cri-dockerd is a project based on the legacy built-in
Docker Engine support that was [removed](/dockershim) from the kubelet in version 1.24.
-->
<p>Docker Engine 没有实现 <a href="/zh-cn/docs/concepts/architecture/cri/">CRI</a>，
而这是容器运行时在 Kubernetes 中工作所需要的。
为此，必须安装一个额外的服务 <a href="https://mirantis.github.io/cri-dockerd/">cri-dockerd</a>。
cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目，
它在 1.24 版本从 kubelet 中<a href="/zh-cn/dockershim">移除</a>。</p></div>


<!--
The tables below include the known endpoints for supported operating systems:
-->
下面的表格包括被支持的操作系统的已知端点。

<ul class="nav nav-tabs" id="tabs-container-runtime" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-container-runtime-0" role="tab" aria-controls="tabs-container-runtime-0" aria-selected="true">Linux</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-container-runtime-1" role="tab" aria-controls="tabs-container-runtime-1">Windows</a></li></ul>

<div class="tab-content" id="tabs-container-runtime-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-container-runtime-0" role="tabpanel" aria-labelledby="tabs-container-runtime-0-tab" tabindex="container-runtime"><!--
| Runtime                            | Path to Unix domain socket                   |
|------------------------------------|----------------------------------------------|
| containerd                         | `unix:///var/run/containerd/containerd.sock` |
| CRI-O                              | `unix:///var/run/crio/crio.sock`             |
| Docker Engine (using cri-dockerd)  | `unix:///var/run/cri-dockerd.sock`           |
-->
<table><caption style="display: none;">Linux 容器运行时</caption>
	<thead>
			<tr>
					<th>运行时</th>
					<th>Unix 域套接字</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>containerd</td>
					<td><code>unix:///var/run/containerd/containerd.sock</code></td>
			</tr>
			<tr>
					<td>CRI-O</td>
					<td><code>unix:///var/run/crio/crio.sock</code></td>
			</tr>
			<tr>
					<td>Docker Engine（使用 cri-dockerd）</td>
					<td><code>unix:///var/run/cri-dockerd.sock</code></td>
			</tr>
	</tbody>
</table>
</div><div class="tab-body tab-pane fade"
        id="tabs-container-runtime-1" role="tabpanel" aria-labelledby="tabs-container-runtime-1-tab" tabindex="container-runtime"><!--
| Runtime                            | Path to Windows named pipe                   |
|------------------------------------|----------------------------------------------|
| containerd                         | `npipe:////./pipe/containerd-containerd`     |
| Docker Engine (using cri-dockerd)  | `npipe:////./pipe/cri-dockerd`               |
-->
<table><caption style="display: none;">Windows 容器运行时</caption>
	<thead>
			<tr>
					<th>运行时</th>
					<th>Windows 命名管道路径</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>containerd</td>
					<td><code>npipe:////./pipe/containerd-containerd</code></td>
			</tr>
			<tr>
					<td>Docker Engine（使用 cri-dockerd）</td>
					<td><code>npipe:////./pipe/cri-dockerd</code></td>
			</tr>
	</tbody>
</table>
</div></div>


<!--
## Installing kubeadm, kubelet and kubectl

You will install these packages on all of your machines:

* `kubeadm`: the command to bootstrap the cluster.

* `kubelet`: the component that runs on all of the machines in your cluster
  and does things like starting pods and containers.

* `kubectl`: the command line util to talk to your cluster.
-->
## 安装 kubeadm、kubelet 和 kubectl   {#installing-kubeadm-kubelet-and-kubectl}

你需要在每台机器上安装以下的软件包：

* `kubeadm`：用来初始化集群的指令。

* `kubelet`：在集群中的每个节点上用来启动 Pod 和容器等。

* `kubectl`：用来与集群通信的命令行工具。

<!--
kubeadm **will not** install or manage `kubelet` or `kubectl` for you, so you will
need to ensure they match the version of the Kubernetes control plane you want
kubeadm to install for you. If you do not, there is a risk of a version skew occurring that
can lead to unexpected, buggy behaviour. However, _one_ minor version skew between the
kubelet and the control plane is supported, but the kubelet version may never exceed the API
server version. For example, the kubelet running 1.7.0 should be fully compatible with a 1.8.0 API server,
but not vice versa.

For information about installing `kubectl`, see [Install and set up kubectl](/docs/tasks/tools/).
-->
kubeadm **不能**帮你安装或者管理 `kubelet` 或 `kubectl`，
所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。
如果不这样做，则存在发生版本偏差的风险，可能会导致一些预料之外的错误和问题。
然而，控制平面与 kubelet 之间可以存在**一个**次要版本的偏差，但 kubelet
的版本不可以超过 API 服务器的版本。
例如，1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器，反之则不可以。

有关安装 `kubectl` 的信息，请参阅[安装和设置 kubectl](/zh-cn/docs/tasks/tools/) 文档。

<div class="alert alert-danger" role="note"><h4 class="alert-heading">警告：</h4><!--
These instructions exclude all Kubernetes packages from any system upgrades.
This is because kubeadm and Kubernetes require
[special attention to upgrade](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/).
-->
<p>这些指南不包括系统升级时使用的所有 Kubernetes 程序包。这是因为 kubeadm 和 Kubernetes
有<a href="/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/">特殊的升级注意事项</a>。</p></div>


<!--
For more information on version skews, see:

* Kubernetes [version and version-skew policy](/docs/setup/release/version-skew-policy/)
* Kubeadm-specific [version skew policy](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy)
-->
关于版本偏差的更多信息，请参阅以下文档：

* Kubernetes [版本与版本间的偏差策略](/zh-cn/releases/version-skew-policy/)
* kubeadm 特定的[版本偏差策略](/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy)

<div class="alert alert-secondary callout note" role="note">
  <strong>说明：</strong> 自 2023 年 9 月 13 日起，Kubernetes 已经<a href="/zh-cn/blog/2023/08/31/legacy-package-repository-deprecation/">弃用并冻结了旧版软件包仓库 (<code>apt.kubernetes.io</code> 和<code>yum.kubernetes.io</code>)。</a>
<strong>强烈建议使用<a href="/zh-cn/blog/2023/08/15/pkgs-k8s-io-introduction/">托管在 <code>pkgs.k8s.io</code> 上的新软件包仓库</a>来安装 2023 年 9 月 13 日之后发布的 Kubernetes 版本。</strong>
旧版软件包仓库已被弃用，其内容可能在未来的任何时间被删除，恕不另行通知。新的软件包仓库提供了从 Kubernetes v1.24.0 版本开始的下载。
</div>



<div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
There's a dedicated package repository for each Kubernetes minor version. If you want to install
a minor version other than 1.36, please see the installation guide for
your desired minor version.
-->
<p>每个 Kubernetes 小版本都有一个专用的软件包仓库。
如果你想安装 1.36 以外的次要版本，请参阅所需次要版本的安装指南。</p></div>


<ul class="nav nav-tabs" id="tabs-k8s-install" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-k8s-install-0" role="tab" aria-controls="tabs-k8s-install-0" aria-selected="true">基于 Debian 的发行版</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-1" role="tab" aria-controls="tabs-k8s-install-1">基于 Red Hat 的发行版</a></li>
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-2" role="tab" aria-controls="tabs-k8s-install-2">无包管理器的情况</a></li></ul>

<div class="tab-content" id="tabs-k8s-install-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-k8s-install-0" role="tabpanel" aria-labelledby="tabs-k8s-install-0-tab" tabindex="k8s-install"><!--
These instructions are for Kubernetes 1.36.
-->
<p>以下指令适用于 Kubernetes 1.36.</p>
<!--
1. Update the `apt` package index and install packages needed to use the Kubernetes `apt` repository:

   ```shell
   sudo apt-get update
   # apt-transport-https may be a dummy package; if so, you can skip that package
   sudo apt-get install -y apt-transport-https ca-certificates curl gpg
   ```
-->
<ol>
<li>
<p>更新 <code>apt</code> 包索引并安装使用 Kubernetes <code>apt</code> 仓库所需要的包：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl"><span class="c1"># apt-transport-https 可能是一个虚拟包（dummy package）；如果是的话，你可以跳过安装这个包</span>
</span></span><span class="line"><span class="cl">sudo apt-get install -y apt-transport-https ca-certificates curl gpg
</span></span></code></pre></div></li>
</ol>
<!--
2. Download the public signing key for the Kubernetes package repositories.
   The same signing key is used for all repositories so you can disregard the version in the URL:

   ```shell
   # If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
   # sudo mkdir -p -m 755 /etc/apt/keyrings
   curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
   ```
-->
<ol start="2">
<li>
<p>下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥，因此你可以忽略URL中的版本：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 如果 `/etc/apt/keyrings` 目录不存在，则应在 curl 命令之前创建它，请阅读下面的注释。</span>
</span></span><span class="line"><span class="cl"><span class="c1"># sudo mkdir -p -m 755 /etc/apt/keyrings</span>
</span></span><span class="line"><span class="cl">curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key <span class="p">|</span> sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
</span></span></code></pre></div></li>
</ol>
<div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
In releases older than Debian 12 and Ubuntu 22.04, directory `/etc/apt/keyrings` does not
exist by default, and it should be created before the curl command.
-->
<p>在低于 Debian 12 和 Ubuntu 22.04 的发行版本中，<code>/etc/apt/keyrings</code> 默认不存在。
应在 curl 命令之前创建它。</p></div>
<!--
3. Add the appropriate Kubernetes `apt` repository. Please note that this repository have packages
   only for Kubernetes 1.36; for other Kubernetes minor versions, you need to
   change the Kubernetes minor version in the URL to match your desired minor version
   (you should also check that you are reading the documentation for the version of Kubernetes
   that you plan to install).
-->
<ol start="3">
<li>
<p>添加 Kubernetes <code>apt</code> 仓库。
请注意，此仓库仅包含适用于 Kubernetes 1.36 的软件包；
对于其他 Kubernetes 次要版本，则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本
（你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档）。</p>
<!--
```shell
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
```
-->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /&#39;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/kubernetes.list
</span></span></code></pre></div></li>
</ol>
<!--
4. Update `apt` package index, install kubelet, kubeadm and kubectl, and pin their version:
-->
<ol start="4">
<li>
<p>更新 <code>apt</code> 包索引，安装 kubelet、kubeadm 和 kubectl，并锁定其版本：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get install -y kubelet kubeadm kubectl
</span></span><span class="line"><span class="cl">sudo apt-mark hold kubelet kubeadm kubectl
</span></span></code></pre></div></li>
</ol>
<!--
5. (Optional) Enable the kubelet service before running kubeadm:

   ```shell
   sudo systemctl enable --now kubelet
   ```
-->
<ol start="5">
<li>
<p>（可选）先启用 kubelet 服务，再运行 kubeadm：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div></li>
</ol>
</div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-1" role="tabpanel" aria-labelledby="tabs-k8s-install-1-tab" tabindex="k8s-install"><!--
1. Set SELinux to `permissive` mode:

   These instructions are for Kubernetes 1.36.

   ```shell
   # Set SELinux in permissive mode (effectively disabling it)
   sudo setenforce 0
   sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
   ```
-->
<ol>
<li>
<p>将 SELinux 设置为 <code>permissive</code> 模式：</p>
<p>以下指令适用于 Kubernetes 1.36。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 将 SELinux 设置为 permissive 模式（相当于将其禁用）</span>
</span></span><span class="line"><span class="cl">sudo setenforce <span class="m">0</span>
</span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/^SELINUX=enforcing$/SELINUX=permissive/&#39;</span> /etc/selinux/config
</span></span></code></pre></div></li>
</ol>
<div class="alert alert-caution" role="note"><h4 class="alert-heading">注意：</h4><!-- 
- Setting SELinux in permissive mode by running `setenforce 0` and `sed ...`
  effectively disables it. This is required to allow containers to access the host
  filesystem; for example, some cluster network plugins require that. You have to
  do this until SELinux support is improved in the kubelet.
- You can leave SELinux enabled if you know how to configure it but it may require
  settings that are not supported by kubeadm.
-->
<ul>
<li>通过运行命令 <code>setenforce 0</code> 和 <code>sed ...</code> 将 SELinux 设置为 permissive 模式相当于将其禁用。
这是允许容器访问主机文件系统所必需的，例如，某些容器网络插件需要这一能力。
你必须这么做，直到 kubelet 改进其对 SELinux 的支持。</li>
<li>如果你知道如何配置 SELinux 则可以将其保持启用状态，但可能需要设定部分 kubeadm 不支持的配置。</li>
</ul>
</div>
<!--
2. Add the Kubernetes `yum` repository. The `exclude` parameter in the
   repository definition ensures that the packages related to Kubernetes are
   not upgraded upon running `yum update` as there's a special procedure that
   must be followed for upgrading Kubernetes. Please note that this repository
   have packages only for Kubernetes 1.36; for other
   Kubernetes minor versions, you need to change the Kubernetes minor version
   in the URL to match your desired minor version (you should also check that
   you are reading the documentation for the version of Kubernetes that you
   plan to install).

   ```shell
   # This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repo
   cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
   [kubernetes]
   name=Kubernetes
   baseurl=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/
   enabled=1
   gpgcheck=1
   gpgkey=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/repodata/repomd.xml.key
   exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
   EOF
   ```
-->
<ol start="2">
<li>
<p>添加 Kubernetes 的 <code>yum</code> 仓库。在仓库定义中的 <code>exclude</code> 参数确保了与
Kubernetes 相关的软件包在运行 <code>yum update</code> 时不会升级，因为升级
Kubernetes 需要遵循特定的过程。请注意，此仓库仅包含适用于
Kubernetes 1.36 的软件包；
对于其他 Kubernetes 次要版本，则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本
（你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档）。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置</span>
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
</span></span></span><span class="line"><span class="cl"><span class="s">[kubernetes]
</span></span></span><span class="line"><span class="cl"><span class="s">name=Kubernetes
</span></span></span><span class="line"><span class="cl"><span class="s">baseurl=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/
</span></span></span><span class="line"><span class="cl"><span class="s">enabled=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgkey=https://pkgs.k8s.io/core:/stable:/v1.36/rpm/repodata/repomd.xml.key
</span></span></span><span class="line"><span class="cl"><span class="s">exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></div></li>
</ol>
<!--
3. Install kubelet, kubeadm and kubectl, and enable kubelet to ensure it's automatically started on startup:
-->
<ol start="3">
<li>
<p>安装 kubelet、kubeadm 和 kubectl，并启用 kubelet 以确保它在启动时自动启动:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo yum install -y kubelet kubeadm kubectl --disableexcludes<span class="o">=</span>kubernetes
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div></li>
</ol>
</div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-2" role="tabpanel" aria-labelledby="tabs-k8s-install-2-tab" tabindex="k8s-install"><!--
Install CNI plugins (required for most pod network):
-->
<p>安装 CNI 插件（大多数 Pod 网络都需要）：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CNI_PLUGINS_VERSION</span><span class="o">=</span><span class="s2">&#34;v1.3.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DEST</span><span class="o">=</span><span class="s2">&#34;/opt/cni/bin&#34;</span>
</span></span><span class="line"><span class="cl">sudo mkdir -p <span class="s2">&#34;</span><span class="nv">$DEST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/containernetworking/plugins/releases/download/</span><span class="si">${</span><span class="nv">CNI_PLUGINS_VERSION</span><span class="si">}</span><span class="s2">/cni-plugins-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">CNI_PLUGINS_VERSION</span><span class="si">}</span><span class="s2">.tgz&#34;</span> <span class="p">|</span> sudo tar -C <span class="s2">&#34;</span><span class="nv">$DEST</span><span class="s2">&#34;</span> -xz
</span></span></code></pre></div><!--
Define the directory to download command files:
-->
<p>定义要下载命令文件的目录：</p>
<div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
The `DOWNLOAD_DIR` variable must be set to a writable directory.
If you are running Flatcar Container Linux, set `DOWNLOAD_DIR="/opt/bin"`.
-->
<p><code>DOWNLOAD_DIR</code> 变量必须被设置为一个可写入的目录。
如果你在运行 Flatcar Container Linux，可设置 <code>DOWNLOAD_DIR=&quot;/opt/bin&quot;</code>。</p></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">DOWNLOAD_DIR</span><span class="o">=</span><span class="s2">&#34;/usr/local/bin&#34;</span>
</span></span><span class="line"><span class="cl">sudo mkdir -p <span class="s2">&#34;</span><span class="nv">$DOWNLOAD_DIR</span><span class="s2">&#34;</span>
</span></span></code></pre></div><!--
Optionally install crictl (required for interaction with the Container Runtime Interface (CRI), optional for kubeadm):
-->
<p>可以选择安装 crictl（与容器运行时接口 (CRI) 交互时必需，但对 kubeadm 来说是可选的）：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CRICTL_VERSION</span><span class="o">=</span><span class="s2">&#34;v1.31.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/kubernetes-sigs/cri-tools/releases/download/</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">/crictl-</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">.tar.gz&#34;</span> <span class="p">|</span> sudo tar -C <span class="nv">$DOWNLOAD_DIR</span> -xz
</span></span></code></pre></div><!--
Install `kubeadm`, `kubelet`, `kubectl` and add a `kubelet` systemd service:
-->
<p>安装 <code>kubeadm</code>、<code>kubelet</code>、<code>kubectl</code> 并添加 <code>kubelet</code> 系统服务：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">RELEASE</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>curl -sSL https://dl.k8s.io/release/stable.txt<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="nv">$DOWNLOAD_DIR</span>
</span></span><span class="line"><span class="cl">sudo curl -L --remote-name-all https://dl.k8s.io/release/<span class="si">${</span><span class="nv">RELEASE</span><span class="si">}</span>/bin/linux/<span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span>/<span class="o">{</span>kubeadm,kubelet<span class="o">}</span>
</span></span><span class="line"><span class="cl">sudo chmod +x <span class="o">{</span>kubeadm,kubelet<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RELEASE_VERSION</span><span class="o">=</span><span class="s2">&#34;v0.16.2&#34;</span>
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/krel/templates/latest/kubelet/kubelet.service&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:</span><span class="si">${</span><span class="nv">DOWNLOAD_DIR</span><span class="si">}</span><span class="s2">:g&#34;</span> <span class="p">|</span> sudo tee /usr/lib/systemd/system/kubelet.service
</span></span><span class="line"><span class="cl">sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:</span><span class="si">${</span><span class="nv">DOWNLOAD_DIR</span><span class="si">}</span><span class="s2">:g&#34;</span> <span class="p">|</span> sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
</span></span></code></pre></div><div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
Please refer to the note in the [Before you begin](#before-you-begin) section for Linux distributions
that do not include `glibc` by default.
-->
<p>对于默认不包括 <code>glibc</code> 的 Linux 发行版，请参阅<a href="#before-you-begin">开始之前</a>一节的注释。</p></div>
<!--
Install `kubectl` by following the instructions on [Install Tools page](/docs/tasks/tools/#kubectl).
Enable and start `kubelet`:
-->
<p>请参照<a href="/zh-cn/docs/tasks/tools/#kubectl">安装工具页面</a>的说明安装 <code>kubelet</code>。
激活并启动 <code>kubelet</code>：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div><div class="alert alert-info" role="note"><h4 class="alert-heading">说明：</h4><!--
The Flatcar Container Linux distribution mounts the `/usr` directory as a read-only filesystem.
Before bootstrapping your cluster, you need to take additional steps to configure a writable directory.
See the [Kubeadm Troubleshooting guide](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#usr-mounted-read-only)
to learn how to set up a writable directory.
-->
<p>Flatcar Container Linux 发行版会将 <code>/usr/</code> 目录挂载为一个只读文件系统。
在启动引导你的集群之前，你需要执行一些额外的操作来配置一个可写入的目录。
参见 <a href="/zh-cn/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#usr-mounted-read-only">kubeadm 故障排查指南</a>
以了解如何配置一个可写入的目录。</p></div>
</div></div>


<!--
The kubelet is now restarting every few seconds, as it waits in a crashloop for
kubeadm to tell it what to do.
-->
kubelet 现在每隔几秒就会重启，因为它陷入了一个等待 kubeadm 指令的死循环。

<!--
## Configuring a cgroup driver

Both the container runtime and the kubelet have a property called
["cgroup driver"](/docs/setup/production-environment/container-runtimes/#cgroup-drivers), which is important
for the management of cgroups on Linux machines.
-->
## 配置 cgroup 驱动程序  {#configuring-a-cgroup-driver}

容器运行时和 kubelet 都具有名字为
["cgroup driver"](/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers)
的属性，该属性对于在 Linux 机器上管理 CGroups 而言非常重要。

<div class="alert alert-danger" role="note"><h4 class="alert-heading">警告：</h4><!--
Matching the container runtime and kubelet cgroup drivers is required or otherwise the kubelet process will fail.

See [Configuring a cgroup driver](/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/) for more details.
-->
<p>你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动，否则 kubelet
进程会失败。</p>
<p>相关细节可参见<a href="/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/">配置 cgroup 驱动</a>。</p>
</div>


<!--
## Troubleshooting

If you are running into difficulties with kubeadm, please consult our
[troubleshooting docs](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/).
-->
## 故障排查   {#troubleshooting}

如果你在使用 kubeadm 时遇到困难，
请参阅我们的[故障排查文档](/zh-cn/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/)。

## 接下来

<!--
* [Using kubeadm to Create a Cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
-->
* [使用 kubeadm 创建集群](/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
