🐶安装前准备事项
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 最好保证服务都是同一网络环境下(我自己这边使用的云服务的网络安全组)
- 没有标注为需要那台机器执行为
全部机器执行
或者任意机器执行
🐕安装docker
🐕🦺删除docker
yum remove docker
🐕🦺安装yum工具
sudo yum install -y yum-utils
🐕🦺设置docker镜像源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
🐕🦺安装指定版本docker
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
🐕🦺设置开启自启
systemctl enable docker --now
🐕🦺阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://soxxp5r5.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
🐕准备环境
每个机器ip互通
每台机器有自己的hostname 不能使用losthost
hostName | IP |
---|---|
k8s-master | 192.168.0.71 |
k8s-node1 | 192.168.0.138 |
k8s-node2 | 192.168.0.154 |
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
其他机器跟着一样设置即可
# 将 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
# 将桥接的IPv4流量传递到iptables的链 这个是k8s官网的步骤
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
sysctl --system # 生效
🐕安装kubelet、kubeadm、kubectl
#配置k8s的yum源地址
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
EOF
#安装 kubelet,kubeadm,kubectl
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
#启动kubelet
sudo systemctl enable --now kubelet
#所有机器配置master域名 ,修改hosts
echo "192.168.0.71 k8s-master" >> /etc/hosts
cat >> /etc/hosts << EOF
192.168.0.138 k8s-node1
192.168.0.154 k8s-node2
EOF
🐕🦺初始化master节点
以下步骤在master执行即可
一定要注意网段不能重复
我这边服务网段就是192.168.0.0/16
,所以-pod-network-cidr=172.31.0.0/16
使用这个网段,后面用网络插件是calico,默认网段是192.168.0.0/16
,需修改其对应配置文件
kubeadm init \
--apiserver-advertise-address=192.168.0.71 \
--control-plane-endpoint=k8s-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=172.31.0.0/16
参数详解
apiserver-advertise-address=192.168.0.71
作用:指定 Kubernetes API 服务器对外暴露的 IP 地址。此 IP 必须是当前节点的有效 IP,其他节点和组件(如 kubelet、kube-proxy)将通过此 IP 与 API 服务器通信。
- 典型场景:
节点有多个网卡时,需明确指定监听的 IP。
避免默认绑定到 127.0.0.1 或无效地址。
2.--control-plane-endpoint=k8s-master
作用:指定控制平面的统一入口地址(DNS 名称或 IP),用于高可用(HA)集群或单节点负载均衡。单节点模式下,此参数通常指向当前节点的主机名或 IP。- 注意事项:
若使用主机名(如 k8s-master),需确保该名称能被解析为正确的 IP(通过 DNS 或 /etc/hosts)。
高可用集群中,此地址应指向负载均衡器(如 HAProxy、Nginx)的虚拟 IP。
image-repository=registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images
作用:指定拉取 Kubernetes 核心组件镜像的仓库地址。默认仓库 k8s.gcr.io 在国内访问受限,此参数使用阿里云镜像仓库加速下载。
- 典型场景:
解决国内网络无法拉取官方镜像的问题。
使用私有镜像仓库时替换为私有地址。
kubernetes-version=v1.20.9
作用:明确指定安装的 Kubernetes 版本。若不指定,kubeadm 会尝试安装最新版本。
注意事项:
需确保镜像仓库中存在该版本的镜像(如阿里云仓库是否同步了 v1.20.9)。
版本号需与后续组件(如 kubelet、kubectl)一致。service-cidr=10.96.0.0/16
作用:定义 Kubernetes Service 的虚拟 IP 地址范围(CIDR)。默认值为 10.96.0.0/12,此处缩小范围为 10.96.0.0/16。
- 注意事项:
需确保此 CIDR 与物理网络、Pod 网络无冲突。
Service CIDR 用于分配 ClusterIP(如 10.96.0.1 为 kube-dns 的 ClusterIP)。
pod-network-cidr=172.31.0.0/16
作用:定义 Pod 网络的 IP 地址范围(CIDR)。此值需与后续安装的网络插件(如 Calico、Flannel)配置一致。
- 典型场景:
Flannel 默认使用 10.244.0.0/16,若此处设为 172.31.0.0/16,需确保网络插件的配置与此匹配。
避免与物理网络(如 192.168.0.0/24)或 Service CIDR 重叠。
注:这里只是告诉你有这个命令,不是让你执行.
清除 kubeadm initkubeadm reset -f
- 出现
Your Kubernetes control-plane has initialized successfully!
即为成功,但是需要记录master执行完成后的日志
#配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#提前保存令牌
kubeadm join k8s-master:6443 --token afb6st.b7jz45ze7zpg65ii \
--discovery-token-ca-cert-hash sha256:e5e5854508dafd04f0e9cf1f502b5165e25ff3017afd23cade0fe6acb5bc14ab
- 使用命令查看主节点
kubectl get nodes
🐕🦺安装网络插件calico
# 下载配置文件
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
- 我们前面不是说了calico的默认网段是
192.168.0.0/16
么,我不需要修改,如果你不是那就要需要修改它- 使用命令
cat calico.yaml |gerp 192.168
查看 这里需要把我们这里的网段修改为我们刚才设置
# 修改完成后我们开始启动
kubectl apply -f calico.yaml
#查看状态,等待就绪
watch kubectl get pod -n kube-system -o wide
耐心等待所有的完成即可
🐕🦺work 加入集群(子节点执行)
#使用刚才master打印的令牌命令加入
kubeadm join k8s-master:6443 --token afb6st.b7jz45ze7zpg65ii \
--discovery-token-ca-cert-hash sha256:e5e5854508dafd04f0e9cf1f502b5165e25ff3017afd23cade0fe6acb5bc14ab
#如果超过2小时忘记了令牌,可以这样做
kubeadm token create --print-join-command #打印新令牌
kubeadm token create --ttl 0 --print-join-command #创建个永不过期的令牌
#如果出现重新执行 kubeadm join的需要,先重置一下
kubeadm reset
主节点执行即可
kubectl get nodes
这样就是已经安装完成了
🐕k8s集群测试
#创建一个nginx镜像
kubectl create deployment mynginx --image=nginx
查看nginx运行在哪个节点
kubectl get pods,svc -o wide
任意节点访问
curl http://172.31.169.129
这里可以看到可以访问成功
🐕问题排错
当执行 kubectl get nodes 遇到 502 Bad Gateway 错误
当执行 kubectl get nodes 遇到 502 Bad Gateway 错误(伴随 Nginx 响应)时,表明 kubectl 无法正确连接到 Kubernetes API 服务器,可能由于 API 服务器未正常运行、代理配置错误或网络问题导致。
当执行 kubectl get nodes
遇到 502 Bad Gateway
错误(伴随 Nginx 响应)时,表明 kubectl
无法正确连接到 Kubernetes API 服务器,可能由于 API 服务器未正常运行、代理配置错误或网络问题导致。以下是详细的排查和解决方案:
1. 检查 API 服务器状态
首先确认 kube-apiserver
是否正常运行:
# 查看 kube-apiserver Pod 状态
kubectl get pods -n kube-system | grep kube-apiserver
# 查看 kube-apiserver 容器日志(如果使用 Docker)
docker ps | grep kube-apiserver
docker logs <kube-apiserver-container-id>
- 可能的现象:
kube-apiserver
Pod 处于CrashLoopBackOff
状态。- 日志中显示绑定 IP 错误、证书问题或端口冲突(如
listen tcp 192.168.0.71:6443: bind: cannot assign requested address
)。
2. 检查 control-plane-endpoint
解析
如果初始化时指定了 --control-plane-endpoint=k8s-master
,需确保该域名或 IP 能被正确解析:
# 检查域名解析
ping k8s-master
nslookup k8s-master
# 检查本地 hosts 文件
cat /etc/hosts
- 修复方法:
- 如果
k8s-master
是域名且未配置 DNS,需在/etc/hosts
中添加解析:echo "192.168.0.71 k8s-master" >> /etc/hosts
- 如果使用负载均衡器(如 Nginx、HAProxy),确认其配置正确且后端指向有效的 API 服务器实例。
- 如果
3. 验证 API 服务器证书
API 服务器的证书必须包含 control-plane-endpoint
的域名或 IP:
# 查看 kube-apiserver 证书 SAN(Subject Alternative Names)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A1 "Subject Alternative Name"
- 预期输出:
DNS:k8s-master, DNS:kubernetes, DNS:kubernetes.default, IP Address:192.168.0.71, ...
- 修复方法:
- 若证书未包含
k8s-master
,需重新生成证书并更新集群配置:kubeadm init phase certs apiserver --config=kubeadm-config.yaml systemctl restart kubelet
- 若证书未包含
4. 检查代理或负载均衡器配置
如果使用了反向代理(如 Nginx)暴露 API 服务器,检查代理配置:
- Nginx 配置示例:
stream { upstream kubernetes { server 192.168.0.71:6443; # 确保指向正确的 API 服务器地址和端口 } server { listen 6443; proxy_pass kubernetes; } }
- 验证步骤:
- 直接访问 API 服务器 IP 和端口(绕过代理):
如果返回 Kubernetes 版本信息,说明代理配置错误;否则继续排查 API 服务器问题。curl -k https://192.168.0.71:6443/version
- 直接访问 API 服务器 IP 和端口(绕过代理):
5. 检查网络连通性和防火墙
确保 API 服务器的端口(默认为 6443
)可被访问:
# 检查本地端口监听
ss -tulnp | grep 6443
# 检查防火墙规则(假设使用 firewalld)
firewall-cmd --list-ports | grep 6443
- 修复方法:
- 开放端口:
firewall-cmd --add-port=6443/tcp --permanent firewall-cmd --reload
- 如果使用云服务器,确保安全组允许
6443
端口入站流量。
- 开放端口:
6. 重置并重新初始化集群
如果问题仍存在,彻底清理后重新初始化:
kubeadm reset -f
rm -rf /etc/kubernetes/ /var/lib/etcd/
systemctl restart docker kubelet
kubeadm init --config=kubeadm-config.yaml # 使用之前的配置
7. 验证 kubectl 配置
确保 kubectl
使用的配置文件正确:
# 检查配置文件路径
echo $KUBECONFIG
# 验证配置
kubectl config view
- 修复方法:
- 复制管理员配置文件:
mkdir -p $HOME/.kube cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
- 复制管理员配置文件: