准备工作(来自官方文档)
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux
发行版以及一些不提供包管理器的发行版提供通用的指令。 - 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。 CPU 2 核心及以上。
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。
bash
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
可以选择一次性运行命令(不需要执行上面的命令):
sudo setenforce 0 && sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config && swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
转发 IPv4 并让 iptables 看到桥接流量(官网链接)
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay && sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo 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
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
启用必要端口
启用这些必要的端口后才能使 Kubernetes 的各组件相互通信。 可以使用 netcat 之类的工具来检查端口是否启用,例如:
nc 127.0.0.1 6443
你使用的 Pod 网络插件 (详见后续章节) 也可能需要开启某些特定端口。 由于各个 Pod 网络插件的功能都有所不同,请参阅他们各自文档中对端口的要求。
安装容器运行时
为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
如果你不指定运行时,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时。
如果检测到有多个或者没有容器运行时,kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时。
以docker为例
docker运行环境的安装
1、方式一
bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
systemctl start docker.service
systemctl enable docker.service
docker -v
2、方式二
① 移除以前docker相关包
bash
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
② 配置yum源
bash
sudo yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
③ 安装docker
bash
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
④ 启动并设置开机自启
bash
systemctl enable docker --now
配置加速("registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
为阿里云申请的镜像加速,如有需要可自行前往申请),申请方式见链接
这里一定要配置,不然后续kubelet会启动失败,报错如下
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3i54s1l9.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
基础环境
bash
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
安装 kubeadm、kubelet 和 kubectl
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
sudo yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 --disableexcludes=kubernetes && sudo systemctl enable --now kubelet
#kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
下面标注##包围的范围内master才需要执行,子节点不需要执行
#####################################################################################################
###############################################主节点执行#############################################
#####################################################################################################
使用 kubeadm 创建集群
准备所需的容器镜像(跳过该步骤)
bash
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
初始化主节点
shell
#所有机器(master+其他worker节点)添加master域名映射,192.168.2.100需要修改为自己的master节点ip
echo "10.8.0.8 cluster-endpoint" >> /etc/hosts
#主节点初始化(master) 10.8.0.8为主节点ip,cluster-endpoint为上一步配置的主节点映射域名,registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images为个人镜像仓库地址
kubeadm init \
--apiserver-advertise-address=10.8.0.8 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.224.0.0/16 \
--pod-network-cidr=192.225.0.0/16
#主节点初始化配置中,所有网络范围不重叠,pod-network-cidr若更改,默认是192.168.0.0/16,注意后续有一项配置也需要更改
初始化成功后见下图(复制kubeadm join相关语句,后续加入节点时会使用)
要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:
shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果你是 root 用户,则运行:
bash
export KUBECONFIG=/etc/kubernetes/admin.conf
安装网络组件
版本对应关系可访问链接https://docs.tigera.io/archive/v3.21/getting-started/kubernetes/requirements(中间的v3.21版本变化即可访问不同版本的对应关系)
前面初始化主节点时提到的配置变化,这里需要注意,将下载的文件做一定的更改,与前面配置的ip相同,如果前面的ip(192.168.0.0)未更改则无需更改
bash
wget https://docs.projectcalico.org/v3.24/manifests/calico.yaml --no-check-certificate
这里是默认的配置
由于我更改了初始化的ip段,所以这里对应也更改了
shell
# 执行下面的命令将docker.io/c变更为c,防止直接从docker.io拉去镜像失败
sed -i 's/docker.io\/c/c/g' calico.yaml && kubectl apply -f calico.yaml
#####################################################################################################
###############################################主节点执行结束##########################################
#####################################################################################################
加入node节点
bash
kubeadm join cluster-endpoint:6443 --token vv1m8c.55hlkvzvutu0qk84 \
--discovery-token-ca-cert-hash sha256:821f36f85d519bfffd6e45f6805588bc99d20805c4ebf9b10333a1c33749bb8c
如果没有令牌,可以通过在主master节点上运行以下命令来获取令牌:
bash
kubeadm token list
默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:kubeadm token create --print-join-command
加入成功后使用kubectl get nodes
查看节点信息
错误解决:
如果使用VPN搭建私有网络时,服务器做master节点,注册时将会报错,显示calico超时的错误,如下
shell
2023-09-07 12:12:18.566 [FATAL][1] cni-installer/<nil> <nil>: Unable to create token for CNI kubeconfig error=Post "https://10.96.0.1:443/api/v1/namespaces/kube-system/serviceaccounts/calico-node/token": dial tcp 10.96.0.1:443: i/o timeout
此时需要在master节点中的calico配置文件中对应的位置加入下面的语句,然后重新安装calico插件,其中tun0代表的是自己的VPN网卡名称
shell
- name: IP_AUTODETECTION_METHOD
value: "interface=tun0"
如果上面的方式不行,请设置自定义的ip,也许是ip有冲突,就算是看不见冲突,也尝试改变一下,代替默认的ip,同时记得更改calico.yaml中的设置
当你怎么弄都不行的时候,请尝试所有机器执行以下命令
shell
# 重置kubeadmin(所有)
kubeadmin reset
# 重置iptables(master)
iptables -F
# 删除旧的calico网络配置文件(所有)
rm -rf /etc/cni/net.d
# 删除旧的环境变量(master)
rm -rf $HOME/.kube/config
# 还不行就执行下面的语句(所有),ip对应各个机器的ip地址
echo "10.8.0.8 k8s-master" >> /etc/hosts
echo "10.8.0.4 k8s-node1" >> /etc/hosts
echo "10.8.0.9 k8s-node2" >> /etc/hosts
仍然不行请就自己的问题百度找寻解决方案(该文章为个人搭建学习使用),综合了多方视频教程融合起来整理的方案,若仍未能解决你的问题或满足你的需求,望谅解!