环境准备:
debian12
docker-ce
k8s: 1.23.17
因为在1.24及之后的版本,移除了xx的支持。
K8S安装部署
准备三个节点:master\node\node
master内存4G,其他的2G
基础配置:
apt update -y
apt install sudo lrzsz gnupg -y # 安装gpg工具
修改hosts:
cat >> /etc/hosts << EOF
192.168.2.111 k8s111
192.168.2.112 k8s112
192.168.2.113 k8s113
EOF
cat /etc/hosts
hostnamectl set-hostname <hostname> # 根据规划设置主机名
时间同步:
systemctl start chronyd && systemctl enable chronyd
date
报错:
Failed to start chronyd.service: Unit chronyd.service not found.
这是因为没有安装chrony
执行apt install chrony -y 安装
安装完成之后会自动启动服务
执行:systemctl start chronyd会报错
Failed to enable unit: Refusing to operate on alias name or linked unit file: chronyd.service
禁用firewalld
““
systemctl stop firewalld && systemctl disable firewalld
如果报错:
Failed to start firewalld.service: Unit firewalld.service not found.
说明没有安装防火墙,那么不用再处理了。
禁用selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
提示命令不存,Debian/Ubuntu 默认不安装 SELinux
SELinux 是 Red Hat 系列(如 CentOS/RHEL)默认的安全模块,而 Debian/Ubuntu 默认使用 AppArmor 作为安全框架。
、禁用swap
临时关闭, 重启失效:
swapoff -a
永久关闭:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
如果提示命令不存在,尝试:
/sbin/swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
或者apt install util-linux
free -h 查看是否关闭,Swap行的数据都是0就是关闭了
默认情况下,K8s为了追求高性能,不建议使用交换分区,为此它要求每个节点禁用swap,否则各个节点中的kubelet无法运行。
f、网桥设置
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system // 执行命令,使其生效
sysctl not found,换这个试试:
```
systemctl restart systemd-sysctl
sudo modprobe br_netfilter
时间同步:`
yum insall ntpdate -y
ntpdate time.windows.com
安装依赖工具:
apt update -y
apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
apt install sudo
安装docker:Debian | Docker Docs
安装之后,修改配置:
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://docker.1ms.run"]
}
EOF
cat /etc/docker/daemon.json
systemctl daemon-reload && systemctl restart docker #重启服务
docker pull nginx #拉取Nginx镜像测试
docker info | grep Driver #检查驱动是否变为systemd了
拉取镜像报错:
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 31.13.69.245:443: connect: connection refused
修改镜像之后还是报同样的错误:可能是配置文件的格式错误。
安装k8s
使用阿里云镜像安装 Kubernetes
1.添加阿里云Kubernetes镜像源
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
2.安装 kubeadm/kubelet/kubectl
sudo apt update -y
sudo apt install -y kubeadm=1.23.17-00 kubectl=1.23.17-00 kubelet=1.23.17-00
sudo systemctl enable kubelet # 开机启动
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本
4. 初始化 Master 节点
(1) 使用阿里云镜像初始化
sudo kubeadm init \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
--ignore-preflight-errors=Swap \
--service-cidr=10.96.0.0/12 \
- –image-repository
- –pod-network-cidr
- –service-cidr
- –apiserver-advertise-address
- –ignore-preflight-errors:
Swap
、all
(2) 配置 kubectl
普通用户执行这个:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
超级管理执行这个:
export KUBECONFIG=/etc/kubernetes/admin.conf
(3) 安装网络插件(calico和Flannel二选一)
安装网络插件calico
curl https://docs.projectcalico.org/manifests/calico.yaml -O
然后搜索CALICO_IPV4POOL_CIDR,修改为跟初始化Master命中的–pod-network-cidr参数的值。
kubectl apply -f calico.yaml
安装网络插件Flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
5. 初始化 Worker 节点
sudo kubeadm join <Master节点IP>:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash> \
--image-repository=registry.aliyuncs.com/google_containers
6. 验证集群状态
kubectl get nodes # 所有节点应为 Ready
kubectl get pods -A # 检查 CoreDNS 和 Flannel 是否运行
常见问题:
Q1:节点Not Ready 未就绪?
- 未安装网络插件
- 网络配置错误
- Docker镜像拉取失败,检查Docker镜像地址是否是可用状态,执行
kubectl describe po calico-node-lsdl6 -n kube-system
来查看状态
Q2:为什么配置了镜像地址,还是如下错误?
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded
https://registry-1.docker.io/v2/
是 Docker 官方镜像仓库 (Docker Hub) 的 API 入口地址,registry-1.docker.io
:Docker 官方镜像仓库的主域名,/v2/
:Docker Registry API V2 版本的接口路径。
即使配置了国内镜像加速,但是国内镜像源也无法访问,Docker 仍尝试直连官方仓库,最后官方仓库也无法访问,就报错。
Docker最新可用镜像加速/镜像源/加速列表(2025年6月8日更新长期维护) – WUJINGQUAN
Q3:忘记保存Master节点的token和discovery-token-ca-cert-hash?
获取token可以在Master节点执行kubeadm token list
查看,如果过期了,可以执行kubeadm token create
创建一个新的。
获取discovery-token-ca-cert-hash可以在Master节点执行
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin
outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
然后使用字符sha256:
拼接,例如:sha256:ceac418438238c5cc2db8cd91ee057435a8a6cf2c0f1f1fbc5d85db024383f8a
Q4:Pon状态不正常怎么处理?
执行kubectl describe po calico-node-lsdl6 -n kube-system
查看pod日志,然后再根据对应的情况处理。
或者删除podkubectl delete pod calico-node-r5rp6 -n kube-system
令k8s自动创建新的Pod。
Q5:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
这个错误通常出现在 Kubernetes 或 容器网络 相关的环境中,表示系统缺少 bridge-nf-call-iptables
内核参数。以下是解决方法:
1. 问题原因
-
bridge-nf-call-iptables
是一个内核参数,用于控制 网桥流量是否经过 iptables/nftables。 - Kubernetes、Docker 或其他容器网络工具(如 Calico、Flannel)需要此参数设置为
1
,以确保网络策略和 NAT 正常工作。 - 如果
/proc/sys/net/bridge/bridge-nf-call-iptables
文件不存在,通常是因为 br_netfilter
内核模块未加载。
2. 解决方法
步骤 1:加载 br_netfilter
模块
sudo modprobe br_netfilter
验证模块是否加载成功:
lsmod | grep br_netfilter
如果输出包含 br_netfilter
,说明模块已加载。
步骤 2:手动创建参数文件(可选)
如果模块已加载但文件仍不存在,可以手动创建并设置值:
echo 1 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables
验证:
cat /proc/sys/net/bridge/bridge-nf-call-iptables
应该输出 1
。
步骤 3:永久生效(重启后仍有效)
编辑 /etc/sysctl.conf
或创建 /etc/sysctl.d/k8s.conf
:
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
应用配置:
sudo sysctl --system
步骤 4:验证 Kubernetes 环境(如适用)
如果是 Kubernetes 节点,运行以下命令检查:
sudo kubeadm init phase preflight
或手动检查:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables
两者均应返回 1
。
3. 常见问题排查
- 错误:
modprobe: FATAL: Module br_netfilter not found
说明内核未编译此模块。解决方法:- 更新内核(推荐):
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
- 或重新编译内核,启用
CONFIG_BRIDGE_NETFILTER
选项。
- 更新内核(推荐):
- Docker 或 Containerd 网络问题
确保 Docker/Containerd 已正确配置:sudo docker info | grep -i bridge
4. 总结
问题原因 | 解决方法 |
---|---|
br_netfilter 未加载 |
sudo modprobe br_netfilter |
参数文件不存在 | 手动创建并设置为 1 |
需永久生效 | 写入 /etc/sysctl.d/ 并应用 |
完成上述步骤后,Kubernetes、Docker 或其他容器工具应能正常识别该参数。
Q6:Master节点init失败
# 重置 kubeadm
sudo kubeadm reset -f
# 删除残留文件和目录
sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/ /var/lib/etcd/
Q7:
The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
sudo systemctl status kubelet
journalctl -u kubelet -f # 实时跟踪日志
swap没有导致服务没有启动。
Q8
执行:journalctl -u kubelet -f
查看日志
Jun 11 03:56:39 k8s111 kubelet[4035]: I0611 03:56:39.406702 4035 cni.go:240] "Unable to update cni config" err="no networks found in /etc/cni/net.d"
Jun 11 03:56:40 k8s111 kubelet[4035]: E0611 03:56:40.118842 4035 kubelet.go:2394] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"
Q9:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
这个错误表明 kubectl
无法连接到 Kubernetes API 服务器(默认尝试 localhost:8080
),通常是因为以下原因之一。以下是逐步解决方案:
1. 检查 Kubernetes 服务状态
(1)确认控制平面组件是否运行
sudo systemctl status kubelet # 核心服务
sudo kubectl get pods -n kube-system # 检查关键组件(apiserver等)
- 如果未运行,启动服务:
sudo systemctl start kubelet
(2)检查 API Server 日志
sudo journalctl -u kube-apiserver -f
- 常见错误:证书过期、端口冲突、etcd 连接失败。
2. 配置正确的 kubectl
访问
(1)指定正确的 kubeconfig 文件
默认情况下,kubectl
需要 ~/.kube/config
文件。如果是通过 kubeadm
安装的集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)验证配置
kubectl config view # 检查配置
export KUBECONFIG=$HOME/.kube/config # 显式指定路径
3. 检查 API Server 端口
(1)确认 API Server 监听的端口
sudo netstat -tulnp | grep kube-apiserver
- 正常应监听
6443
端口(而非8080
)。 - 如果端口被占用或未监听,检查 API Server 参数:
ps -ef | grep kube-apiserver | grep --color=auto secure-port
(2)临时测试 API Server
curl -k https://localhost:6443/healthz # 忽略证书验证
- 预期返回
ok
。
4. 常见问题修复
(1)证书过期
sudo kubeadm certs check-expiration # 检查证书
sudo kubeadm certs renew all # 更新证书
sudo systemctl restart kubelet
(2)防火墙/SELinux 阻止访问
sudo ufw allow 6443/tcp # Ubuntu
sudo firewall-cmd --add-port=6443/tcp --permanent && sudo firewall-cmd --reload # CentOS
sudo setenforce 0 # 临时禁用 SELinux
(3)etcd 服务异常
sudo systemctl status etcd
sudo journalctl -u etcd -f
5. 快速验证
# 使用完整配置测试连接
kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes
错误原因总结
原因 | 解决命令 |
---|---|
缺少 kubeconfig | sudo cp /etc/kubernetes/admin.conf ~/.kube/config |
API Server 未运行 | sudo systemctl start kube-apiserver |
证书过期 | sudo kubeadm certs renew all |
端口冲突 | 检查 6443 端口是否被占用 |
防火墙阻止 | 开放 6443 端口 |
附:重置集群(终极方案)
如果问题持续,彻底重置并重建集群:
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/
sudo systemctl restart kubelet
sudo kubeadm init # 重新初始化
执行后记得重新配置 kubectl
(如步骤2所示)。
我这里的原因是退出了shell,导致之前设置变量没有,之前设置的是临时变量。重新执行下面的命令就恢复了。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
参考
命令
kubectl get node
kubectl get no
kubectl get componentstatus
kubectl get cs
kubectl get pods
kubectl get po
kubectl get pods -n kube-system
grep image calico.yaml
使用命令清除
apply -f calico.yaml