Kubernetes K8S部署之Docker运行时

140次阅读
没有评论

环境准备:

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:Swapall

​(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

正文完
 0
wujingquan
版权声明:本站原创文章,由 wujingquan 于2025-06-09发表,共计8903字。
转载说明:Unless otherwise specified, all articles are published by cc-4.0 protocol. Please indicate the source of reprint.
评论(没有评论)