在 Ubuntu 22.04 上安装 Kubernetes
在 Ubuntu 22.04 上安装 Kubernetes
目标:在 Ubuntu 22.04 服务器上安装 Kubernetes 环境。
Operating System: Ubuntu 22.04.4 LTS
Kernel: Linux 5.15.0-86-generic
Architecture: x86-64
提示
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。
1. 前置条件
- RAM 2GB及以上
- CPU 2核心及以上
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid
- 开启机器上的某些端口
2. 安装容器运行时
为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
如果你不指定运行时,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时。
如果检测到有多个或者没有容器运行时,kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时。
Kubernetes 支持的容器运行时:containerd
、CRI-O
、Docker Engine
、Mirantis Container Runtime
,详见这里。
通过 apt-get
安装 containerd
containerd
The containerd.io packages in DEB and RPM formats are distributed by Docker (not by the containerd project). The containerd.io package contains runc too, but does not contain CNI plugins.
Install Docker Engine on Ubuntu using apt repository.
Set up Docker's apt repository
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Install the Docker packages
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verify that the Docker Engine installation is successful
docker version
3. 配置 containerd
参考链接,在 /etc/containerd/config.toml
中设置:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 配置 systemd cgroup 驱动
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" # 配置阿里云镜像
重启 containerd
sudo systemctl restart containerd
4. 安装 kubeadm、kubelet 和 kubectl
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
以下指令适用于 Kubernetes 1.29.
- 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
- 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.29 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
# 此操作会覆盖 /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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5. 配置 kubelet 的 cgroup 驱动
参考链接 kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。 KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。
这是一个最小化的示例 ~/kubeadm-config.yaml
,其中显式的配置了此字段:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.29.3 # kubernetes 版本
networking:
podSubnet: 10.244.0.0/24 # pod 网络
controlPlaneEndpoint: "10.0.0.95:6443" # 当前主机的IP
imageRepository: "registry.aliyuncs.com/google_containers" # 阿里云镜像
clusterName: "ecs-k8s" # 集群名称
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd # systemd cgroup 驱动 ***需要和容器运行时保持一致***
6. 初始化控制平面节点
kubeadm init --config kubeadm-config.yaml
初始化成功
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 10.0.0.95:6443 --token wqficy.*** \
--discovery-token-ca-cert-hash sha256:5849720b91575830d0e2967e62a0970bc8ca9a1a2b676b8229d97c24574ba75d \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.0.95:6443 --token wqficy.*** \
--discovery-token-ca-cert-hash sha256:5849720b91575830d0e2967e62a0970bc8ca9a1a2b676b8229d97c24574ba75d
6. 安装 Pod 网络附加组件
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml
Verify the status of pods in kube-system namespace,
kubectl get pods -n kube-system
Output,
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-787f445f84-ks6qr 1/1 Running 0 169m
calico-node-fjkwh 1/1 Running 0 169m
coredns-857d9ff4c9-pvcmn 1/1 Running 0 178m
coredns-857d9ff4c9-xqf5q 1/1 Running 0 178m
etcd-ecs-master 1/1 Running 1 178m
kube-apiserver-ecs-master 1/1 Running 1 178m
kube-controller-manager-ecs-master 1/1 Running 1 178m
kube-proxy-tlzwx 1/1 Running 0 178m
kube-scheduler-ecs-master 1/1 Running 1 178m
Perfect, check the nodes status as well.
kubectl get nodes
Output,
NAME STATUS ROLES AGE VERSION
ecs-master Ready control-plane 3h1m v1.29.3
7. 将控制平面节点加入Pod调度节点
默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod,例如单机 Kubernetes 集群,请运行:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
输出看起来像:
node/ecs-master untainted
这将从任何拥有 node-role.kubernetes.io/control-plane:NoSchedule 污点的节点(包括控制平面节点)上移除该污点。 这意味着调度程序将能够在任何地方调度 Pod。
8. 加入节点
节点是你的工作负载(容器和 Pod 等)运行的地方。 要将新节点添加到集群,请对每台计算机执行以下操作:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
9. 清理
如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。 你可以使用 kubectl config delete-cluster 删除对集群的本地引用。
但是,如果要更干净地取消配置集群, 则应首先清空节点并确保该节点为空, 然后取消配置该节点。