k8s1.24 FAQ

在k8s1.24版本中遇到了runc相关的错误,表现为containerd创建任务失败,原因是无法找到oci runtime错误。解决方法包括:从官网下载最新runc替换原有文件并赋予执行权限;检查并修改containerd配置文件;处理cni插件初始化网络错误;解决kubelet认证问题;处理kube-proxy的授权问题;以及解决k8s拉取私有镜像仓库失败的问题,特别是遇到'permission denied'错误时。
  • k8s1.24版本关于runc的问题

问题报错:
May 12 13:48:30 k8snode2 containerd:
time=“2022-05-12T13:48:30.848749359+08:00” level=error msg=“RunPodSandbox for &PodSandboxMetadata{Name:kube-flannel-ds-8lvs6,Uid:1c0ac5b8-74eb-49b2-842c-bcc00355ddff,Namespace:kube-system,Attempt:0,} failed,
error” error=“failed to create containerd task: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open
/run/containerd/io.containerd.runtime.v2.task/k8s.io/029eabb43894ea21e4ac75a43a4f144031ed8946fe748006e8748d1d65843092/log.json: no such file or directory): runc did not terminate successfully: exit status 127: unknown”

  • 解决方法

官网下载 runc 执行文件 替换linux原有的 /user/local/sbin/runc, 赋予执行权限 chmod +x /user/local/sbin/runc

- containerd配置文件需要修改的地方

/etc/containerd/config.toml 

[plugins."io.containerd.grpc.v1.cri"]
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
    .....
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true
	......
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
                endpoint = ["https://registry-1.docker.io"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.io"]
                endpoint = ["http://myharbor.io"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.io".tls]
                insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.io".auth]
      [plugins."io.containerd.grpc.v1.cri".registry.headers]

- cni插件未初始化网络错误,解决办法

mkdir -p /etc/cni/net.d/
cat >/etc/cni/net.d/10-flannel.conflist <<EOF
{
  "name": "cbr0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

EOF
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat >/run/flannel/subnet.env <<EOF
FLANNEL_NETWORK=172.16.0.0/12  # 这里的网段修改为kube-controller-manager组件启动参数--cluster-cidr指定的网段
FLANNEL_SUBNET=172.16.0.0/24 
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

- 出现kubelet匿名还是集群角色无法认证的问题

May 12 15:58:22 k8snode1 kubelet: W0512 15:58:22.313065    3950 reflector.go:324] vendor/k8s.io/client-go/informers/factory.go:134: failed to list *v1.Service: services is forbidden: User "system:anonymous" cannot list resource "services" in API group "" at the cluster scope
May 12 15:58:22 k8snode1 kubelet: E0512 15:58:22.313093    3950 reflector.go:138] vendor/k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.Service: failed to list *v1.Service: services is forbidden: User "system:anonymous" cannot list resource "services" in API group "" at the cluster scope
May 12 15:58:22 k8snode1 kubelet: E0512 15:58:22.361994    3950 kubelet.go:2419] "Error getting node" err="node \"k8snode1\" not found"
  • 解决办法
node节点关闭开启的kubelet
# systemctl stop kubelet

master节点
# kubectl delete clusterrolebinding kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io "kubelet-bootstrap" deleted

# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created

#node节点开启kubelet
systemctl start kubelet

master节点
# kubectl get csr

- 问题:kube-proxy匿名授权

May 12 19:12:32 k8snode1 kube-proxy: E0512 19:12:32.438837   34504 reflector.go:138] vendor/k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: endpointslices.discovery.k8s.io is forbidden: User "system:anonymous" cannot list resource "endpointslices" in API group "discovery.k8s.io" at the cluster scope
  • 解决方法
kubectl config set-cluster kubernetes \
  --certificate-authority=/data/k8s/ssl/ca.pem \
  --embed-certs=true \
  --server="https://192.168.8.203:6443" \
  --kubeconfig=kube-proxy.kubeconfig

kubectl config set-credentials kube-proxy \
  --client-certificate=/data/k8s/ssl/kube-proxy.pem \
  --client-key=/data/k8s/ssl/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig

kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig

kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

systemctl restart kube-proxy

- 问题:k8s拉取私有镜像仓库失败处理方法

~/.docker/config.json
让k8s集群具有拉取私有仓库的权限
kubectl create secret generic harbor-registry --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson
  • 问题:failed to set bridge addr: could not add IP address to \“cni0\”: permission denied"
报错信息:
May 14 14:35:27 k8snode4 kubelet: E0514 14:35:27.058422    5161 pod_workers.go:951] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"eip-nfs-nfsshare-556ccffc6d-jk8rk_kube-system(7c2fcb44-7df3-4804-a5bb-f5f7dc60b2b6)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"eip-nfs-nfsshare-556ccffc6d-jk8rk_kube-system(7c2fcb44-7df3-4804-a5bb-f5f7dc60b2b6)\\\": rpc error: code = Unknown desc = failed to setup network for sandbox \\\"24743a13eb6ff7bf972c0f7a25bb6d5860ccafc1eed49b07d6ed6131edaa793d\\\": plugin type=\\\"bridge\\\" failed (add): failed to set bridge addr: could not add IP address to \\\"cni0\\\": permission denied\"" pod="kube-system/eip-nfs-nfsshare-556ccffc6d-jk8rk" podUID=7c2fcb44-7df3-4804-a5bb-f5f7dc60b2b6
  • 处理方法
导致这个问题是由于cni0网段地址不一致导致网络加入没有权限
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat >/run/flannel/subnet.env <<EOF
FLANNEL_NETWORK=172.16.0.0/12
FLANNEL_SUBNET=172.16.0.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

ifconfig cni0 down
ip link delete cni0
systemctl start kubelet
### 内网环境下安装 Kubernetes 1.24 版本 #### 准备工作 为了在内网环境中成功安装 Kubernetes 1.24,需提前完成如下准备工作: - **配置 `/etc/hosts` 文件** 确保所有节点能够通过主机名互相解析。编辑各节点上的 `/etc/hosts` 文件,添加集群中其他机器的信息。 ```bash echo "192.168.0.1 master" >> /etc/hosts echo "192.168.0.2 node1" >> /etc/hosts ``` - **允许 iptables 检查桥接流量** 设置系统参数以便容器间的通信正常运作。 ```bash cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF sudo modprobe br_netfilter ``` - **配置网桥过滤和内核转发** 调整内核参数支持 Docker 和 Kubelet 的功能需求。 ```bash cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system ``` - **关闭防火墙并禁用交换分区** 停用不必要的服务减少干扰因素。 ```bash sudo swapoff -a sudo systemctl stop firewalld && sudo systemctl disable firewalld ``` #### 安装必要组件 由于处于内网环境,无法直接访问外部仓库,因此需要事先准备好所需的 RPM 或 DEB 包,并将其放置于本地 HTTP(S) 服务器供后续安装使用。 对于基于 RedHat/CentOS 的操作系统: ```bash yum install -y ./packages/*.rpm ``` 对于基于 Debian/Ubuntu 的操作系统: ```bash dpkg -y apt install -y kubeadm=1.24.1-00 kubelet=1.24.1-00 kubectl=1.24.1-00[^1] ``` 注意:上述命令中的 `*.deb` 应替换为实际路径下的具体包名称;如果已知确切版本,则可以直接指定版本号进行安装。 #### 修改默认镜像源地址 针对国内用户,默认的 pause 镜像可能难以获取,建议更改为阿里云提供的镜像资源。 ```bash sed -i 's|sandbox_image.*$|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"|g' /var/lib/kubelet/config.yaml[^5] ``` #### 初始化 Master 节点 当一切就绪之后,在 Master 上执行初始化操作。 ```bash kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers ``` 此过程可能会花费一些时间等待所需镜像被拉取完毕。完成后按照提示信息配置管理员账户权限以及创建 Pod 网络插件(如 Flannel, Calico 等),以实现跨宿主机之间的网络互通。 #### 加入 Worker 节点 最后一步是在各个 Workder 节点上运行由 `kubeadm init` 输出得到的 join 命令来加入到现有集群当中去。 ```bash kubeadm join ... ``` 以上即完成了整个内网环境下 Kubernetes 1.24 的搭建流程概述[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值