## 使用 kubeadm 部署 Kubernetes (使用 Docker) `kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令,作为快速创建 `Kubernetes` 集群的最佳实践。 > ⚠️ **重要说明**:自 Kubernetes 1.24 起,内置 `dockershim` 已被移除,Kubernetes 默认不再直接使用 Docker Engine 作为容器运行时 (CRI)。因此,**更推荐参考** 同目录下的《[使用 kubeadm 部署 Kubernetes (CRI 使用 containerd)](kubeadm.md)》。 > > 本文档主要用于历史环境/学习目的:如果你确实需要在较新版本中继续使用 Docker Engine,通常需要额外部署 `cri-dockerd` 并在 `kubeadm init/join` 中指定 `--cri-socket`。 ### 安装 Docker 参考[安装 Docker](../../03_install/README.md) 一节安装 Docker。 ### 安装 **kubelet****kubeadm****kubectl** 需要在每台机器上安装以下的软件包: #### Ubuntu/Debian 运行以下命令: ```bash $ K8S_MINOR="v1.35" $ sudo apt-get update $ sudo apt-get install -y ca-certificates curl gpg $ sudo install -m 0755 -d /etc/apt/keyrings $ curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg $ sudo chmod a+r /etc/apt/keyrings/kubernetes-apt-keyring.gpg $ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null $ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl $ sudo apt-mark hold kubelet kubeadm kubectl ``` #### CentOS/Fedora 运行以下命令: ```bash $ K8S_MINOR="v1.35" $ cat < 执行可能出现错误,例如缺少依赖包,根据提示安装即可。 执行成功会输出 ```bash ... [addons] Applied essential addon: CoreDNS I1116 12:35:13.270407 86677 request.go:538] Throttling request took 181.409184ms, request: POST:https://192.168.199.100:6443/api/v1/namespaces/kube-system/serviceaccounts I1116 12:35:13.470292 86677 request.go:538] Throttling request took 186.088112ms, request: POST:https://192.168.199.100:6443/api/v1/namespaces/kube-system/configmaps [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \ --discovery-token-ca-cert-hash sha256:5edb316fd0d8ea2792cba15cdf1c899a366f147aa03cba52d4e5c5884ad836fe ``` #### node 工作节点 在 **另一主机** 重复 **部署** 小节以前的步骤,安装配置好 kubelet。根据提示,加入到集群。 ```bash $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \ --discovery-token-ca-cert-hash sha256:5edb316fd0d8ea2792cba15cdf1c899a366f147aa03cba52d4e5c5884ad836fe ``` ### 查看服务 所有服务启动后,查看本地实际运行的 Docker 容器。这些服务大概分为三类:主节点服务、工作节点服务和其它服务。 #### 主节点服务 * `apiserver` 是整个系统的对外接口,提供 RESTful 方式供客户端和其它组件调用; * `scheduler` 负责对资源进行调度,分配某个 pod 到某个节点上; * `controller-manager` 负责管理控制器,包括 endpoint-controller (刷新服务和 pod 的关联信息) 和 replication-controller (维护某个 pod 的复制为配置的数值)。 #### 工作节点服务 * `proxy` 为 pod 上的服务提供访问的代理。 #### 其它服务 * Etcd 是所有状态的存储数据库; ### 使用 将 `/etc/kubernetes/admin.conf` 复制到 `~/.kube/config` 执行 `$ kubectl get all -A` 查看启动的服务。 由于未部署 CNI 插件,CoreDNS 未正常启动。如何使用 Kubernetes,请参考后续章节。 ### 部署 CNI 这里以 `flannel` 为例进行介绍。 #### 概述 总体概述了以下内容。 #### flannel 检查 podCIDR 设置 ```bash $ kubectl get node -o yaml | grep CIDR ## 输出 podCIDR: 10.244.0.0/16 podCIDRs: ``` ```bash $ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.26.1/Documentation/kube-flannel.yml ``` ### master 节点默认不能运行 pod 如果用 `kubeadm` 部署一个单节点集群,默认情况下无法使用,请执行以下命令解除限制 ```bash $ kubectl taint nodes --all node-role.kubernetes.io/master- ## 部分较新版本使用 control-plane taint ## $ kubectl taint nodes --all node-role.kubernetes.io/control-plane- ## 恢复默认值 ## $ kubectl taint nodes NODE_NAME node-role.kubernetes.io/master=true:NoSchedule ... ``` ### 参考文档 * [官方文档](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)