CentOS7 / Debian10 使用 kubeadm 安装 Kubernetes (k8s) 1.27.2 (一控制节点+多工作节点)
> 官方文档:[使用 kubeadm 引导集群](https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/) # 说明 1. 本教程适用于开发或测试环境,因为仅有一个控制节点,生产环境应当有多个控制节点 2. 下文的命令除特殊说明外,在所有主机上都需要执行 3. (2023-6-15)仅适用于 `Debian 10` 、 `CentOS 7.9` ,在 `Debian 11` / `Debian 12` 上安装完成后会有问题,暂时未找到原因 下文的机器环境信息如下: 主机名 | ip | 角色 --- | --- | --- node1 | 192.168.220.201 | 控制节点 node2 | 192.168.220.202 | 工作节点 node3 | 192.168.220.203 | 工作节点 # 系统检查与配置 ## 机器唯一性 确保每个节点上 `MAC` 地址和 `product_uuid` 的唯一性 - 使用命令 `ip link` 或 `ifconfig -a` 来获取网络接口的 `MAC` 地址 - 可以使用 `cat /sys/class/dmi/id/product_uuid` 命令对 `product_uuid` 校验 ## 关闭防火墙 默认情况下, `Debian` 系统未安装 `firewalld` 防火墙 ```bash systemctl stop firewalld systemctl disable firewalld ``` ## 关闭 selinux 仅 `CentOS` 系统 ```bash # 立即 setenforce 0 # 永久 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config ``` ## 关闭 swap > 立即关闭 ```bash swapoff -a ``` > 永久关闭 编辑配置文件 ```bash vim /etc/fstab ``` 在 `/etc/fstab` 中 `swap` 分区这行前加 `#` ``` # /dev/mapper/centos-swap swap swap defaults 0 0 ``` ## 设置 hostname 在**各自节点**设置 ```bash # node1 hostnamectl set-hostname node1 # node2 hostnamectl set-hostname node2 # node3 hostnamectl set-hostname node3 ``` ## 设置 hosts ```bash cat >> /etc/hosts << EOF 192.168.220.201 node1 192.168.220.202 node2 192.168.220.203 node3 EOF ``` ## 转发 IPv4 并让 iptables 看到桥接流量 ### 加载系统模块 > 立即生效 ```bash modprobe overlay modprobe br_netfilter ``` > 永久配置 ```bash cat <<EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF ``` ### 配置 sysctl 写入配置文件永久生效 ```bash cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF ``` 保存后执行命令立即生效 ```bash sysctl -p ``` # 安装容器运行时 本文容器运行时环境选择 `containerd` ## 设置软件源 按照以下教程设置源(仅需要执行到**设置存储库并更新缓存**,不需要安装 `Docker` ) - `CentOS7` : [CentOS7 安装 Docker-CE](https://maxqiu.com/article/detail/24) - `Debian10` : [Debian10 安装 Docker-CE](https://maxqiu.com/article/detail/154) ## 执行安装 执行以下命令安装 `containerd` ```bash # CentOS7 yum install -y containerd.io # Debian10 apt-get install containerd.io ``` ## 配置 container 默认的配置文件中禁止了 `CRI` 集成插件,即 `disabled_plugins = ["cri"]` ,需要启用 `CRI` 支持才能在 `Kubernetes` 集群中使用 `containerd` ```bash # 方便起见,直接删除该配置文件并重启服务 rm -rf /etc/containerd/config.toml systemctl enable containerd.service systemctl restart containerd.service ``` # 安装 k8s ## CentOS7 ### yum 源 二选一即可 ```bash # 官方源(需要可以访问外网) cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch enabled=1 gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF # 阿里源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF ``` ### 安装服务 ```bash # 更新缓存 yum makecache fast # 查看最新的版本 yum list --showduplicates kubeadm --disableexcludes=kubernetes # 安装指定版本(2023-8-14最新) yum install -y kubelet-1.27.4-0 kubeadm-1.27.4-0 kubectl-1.27.4-0 --disableexcludes=kubernetes # 启动 systemctl enable --now kubelet ``` ## Debian10 ### 秘钥 ```bash # 官方源(需要可以访问外网) curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg # 阿里源 curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | \ gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg ``` ### apt 源 二选一即可 ```bash # 官方源(需要可以访问外网) echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | \ tee /etc/apt/sources.list.d/kubernetes.list # 阿里源 echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | \ tee /etc/apt/sources.list.d/kubernetes.list ``` ### 安装服务 ```bash # 更新源 apt-get update # 查看最新版本 apt-cache madison kubeadm # 安装最新版本(2023-8-14最新) apt-get install kubelet=1.27.4-00 kubeadm=1.27.4-00 kubectl=1.27.4-00 # 保持当前版本 apt-mark hold kubelet kubeadm kubectl ``` # 部署 ## 部署控制节点 1. 使用 `--image-repository` 设置不同的镜像源 - 官方源: `--image-repository=registry.k8s.io` - 阿里源: `--image-repository=registry.aliyuncs.com/google_containers` 2. 使用阿里源时,可能需要先执行以下命令手动拉取部分镜像 ```bash ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.6 ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 ``` ### 执行初始化 在**控制节点**上执行以下命令 ```bash # 官方源(需要可以访问外网) kubeadm init \ --apiserver-advertise-address=192.168.220.201 \ --kubernetes-version v1.27.4 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository=registry.k8s.io # 阿里源 kubeadm init \ --apiserver-advertise-address=192.168.220.201 \ --kubernetes-version v1.27.4 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers ``` 初始化之后会显示如下类似内容 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/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.220.201:6443 --token g9t71p.wajxnogsklp2l02z \ --discovery-token-ca-cert-hash sha256:b20b3beed6eb847aac5085777e92b2c701a779b4e6e89d625d50c838f6e2cafd 其中 `kubeadm join xxxxxx --token xxxxxx \ --discovery-token-ca-cert-hash xxxxxx` 需要复制下来,用于从节点加入使用 ### 配置环境变量 继续在**控制节点**上执行以下命令 ```bash echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile source /etc/profile ``` ## 部署工作节点 在**工作节点**执行以下命令 ```bash # 使用阿里源时,需要手动拉取一个镜像 ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.6 ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 # 加入 kubeadm join 192.168.220.101:6443 --token ua6ikc.zpbrhi2lr6hm5t9q \ --discovery-token-ca-cert-hash sha256:5e704218035996479d9b07f7b5fa17da6c647d84c8b9185d8360a477722400da ``` ## 配置网络插件 在**控制节点**上执行以下命令: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` # 测试 在**控制节点**上执行以下命令: ```bash kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get nodes,pod,svc ``` 展示类似于如下信息: NAME STATUS ROLES AGE VERSION node/node1 Ready control-plane 16h v1.27.4 node/node2 Ready <none> 16h v1.27.4 node/node3 Ready <none> 16h v1.27.4 NAME READY STATUS RESTARTS AGE pod/nginx-77b4fdf86c-2s5dt 1/1 Running 1 (149m ago) 16h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h service/nginx NodePort 10.106.208.51 <none> 80:31211/TCP 16h 通过访问 `ip:31211` (端口是随机的,根据展示信息自行修改)查看页面 # 补充 ## 命令自动补全 在**控制节点**执行以下命令,后续使用时按 `tab` 键可以自动补全命令 ```bash kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null kubeadm completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null ``` ## 安装失败后的重置 如果在执行 `kubeadm init` 或 `kubeadm join` 时出错后需要重新执行,则可以执行以下命令初始化 1. 执行 `kubeadm reset` 重置 `kubeadm` 安装的状态 2. 执行 `iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X` 重置 `iptables` 3. 如果重置的是工作节点,则需要在控制节点执行 `kubectl delete node <节点名称>` 删除被重置的节点