K8S-Demo集群实践11:部署ipvs模式的kube-kubelet组件

本文详细介绍了如何在Kubernetes集群中部署ipvs模式的kubelet组件,包括创建和分发kubelet配置文件,启动kubelet服务,并确保kube-apiserver能访问kubelet API。此外,还涵盖了证书签名请求(CSR)的批准流程和节点状态的检查。

  • kubelet运行在每个worker节点上,接收kube-apiserver发送的请求,管理Pod容器,执行交互式命令,如exec、run、logs等
  • kubelet启动时自动向kube-apiserver注册节点信息,内置的cadvisor统计和监控节点的资源使用情况

一、创建和分发kubelet bootstrap kubeconfig文件

[root@master1 ~]# cd /opt/install/kubeconfig
[root@master1 kubeconfig]# for node_name in ${ALL_NAMES[@]}
  do
    echo ">>> ${node_name}"

    # 创建 token
    export BOOTSTRAP_TOKEN=$(kubeadm token create \
      --description kubelet-bootstrap-token \
      --groups system:bootstrappers:${node_name} \
      --kubeconfig ~/.kube/config)

    # 设置集群参数
    kubectl config set-cluster k8s-demo \
      --certificate-authority=/opt/install/cert/ca.pem \
      --embed-certs=true \
      --server=${KUBE_APISERVER} \
      --kubeconfig=kubelet-bootstrap-${node_name}.kubeconfig

    # 设置客户端认证参数
    kubectl config set-credentials kubelet-bootstrap \
      --token=${BOOTSTRAP_TOKEN} \
      --kubeconfig=kubelet-bootstrap-${node_name}.kubeconfig

    # 设置上下文参数
    kubectl config set-context default \
      --cluster=k8s-demo \
      --user=kubelet-bootstrap \
      --kubeconfig=kubelet-bootstrap-${node_name}.kubeconfig

    # 设置默认上下文
    kubectl config use-context default --kubeconfig=kubelet-bootstrap-${node_name}.kubeconfig
  done
  • 分发到所有节点 3Master+3Node,方便监控每个节点的资源利用率
[root@master1 ~]# cd /opt/install/kubeconfig
[root@master1 kubeconfig]# for node_name in ${ALL_NAMES[@]}
  do
    echo ">>> ${node_name}"
    scp kubelet-bootstrap-${node_name}.kubeconfig root@${node_name}:/opt/k8s/etc//kubelet-bootstrap.kubeconfig
  done

二、创建和分发kubelet的参数配置文件

  • 准备模板 kubelet-config.yaml.template
[root@master1 ~]# cd /opt/install/kubeconfig
[root@master1 kubeconfig]# cat > kubelet-config.yaml.template <<EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: "##NODE_IP##"
staticPodPath: ""
syncFrequency: 1m
fileCheckFrequency: 20s
httpCheckFrequency: 20s
staticPodURL: ""
port: 10250
readOnlyPort: 0
rotateCertificates: true
serverTLSBootstrap: true
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: true
  x509:
    clientCAFile: "/opt/k8s/etc/cert/ca.pem"
authorization:
  mode: Webhook
registryPullQPS: 0
registryBurst: 20
eventRecordQPS: 0
eventBurst: 20
enableDebuggingHandlers: true
enableContentionProfiling: true
healthzPort: 10248
healthzBindAddress: "##NODE_IP##"
clusterDomain: "${CLUSTER_DNS_DOMAIN}"
clusterDNS:
  - "${CLUSTER_DNS_SVC_IP}"
nodeStatusUpdateFrequency: 10s
nodeStatusReportFrequency: 1m
imageMinimumGCAge: 2m
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
volumeStatsAggPeriod: 1m
kubeletCgroups: ""
systemCgroups: ""
cgroupRoot: ""
cgroupsPerQOS: true
cgroupDriver: cgroupfs
runtimeRequestTimeout: 10m
hairpinMode: promiscuous-bridge
maxPods: 220
podCIDR: "${CLUSTER_CIDR}"
podPidsLimit: -1
resolvConf: /etc/resolv.conf
maxOpenFiles: 1000000
kubeAPIQPS: 1000
kubeAPIBurst: 2000
serializeImagePulls: false
evictionHard:
  memory.available:  "100Mi"
  nodefs.available:  "10%"
  nodefs.inodesFree: "5%"
  imagefs.available: "15%"
evictionSoft: {}
enableControllerAttachDetach: true
failSwapOn: true
containerLogMaxSize: 20Mi
containerLogMaxFiles: 10
systemReserved: {}
kubeReserved: {}
systemReservedCgroup: ""
kubeReservedCgroup: ""
enforceNodeAllocatable: ["pods"]
EOF
  • ddress:kubelet安全端口(https,10250)监听的地址,不能为127.0.0.1,否则kube-apiserver、heapster等不能调用kubelet的API
  • readOnlyPort=0:关闭只读端口(默认 10255),等效为未指定
  • authentication.anonymous.enabled:设置为false,不允许匿名访问10250端口
  • authentication.x509.clientCAFile:指定签名客户端证书的CA证书,开启HTTP证书认证
  • authentication.webhook.enabled=true:开启HTTPS bearer token认证
  • 分发到所有节点
[root@master1 ~]# cd /opt/install/kubeconfig
[root@master1 kubeconfig]# for node_ip in $
[root@k8s-master ~]# systemctl status kubeletkubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since 三 2025-11-19 09:50:15 CST; 21min ago Docs: https://kubernetes.io/docs/ Main PID: 1065 (kubelet) Tasks: 25 Memory: 126.6M CGroup: /system.slice/kubelet.service └─1065 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kube... 11月 19 10:11:04 k8s-master kubelet[1065]: E1119 10:11:04.762027 1065 pod_workers.go:191] Error syncing pod 6f29173f-3388-49a0-b78e-f7e4bf6718c5 ("calico-nod... 11月 19 10:11:06 k8s-master kubelet[1065]: W1119 10:11:06.432920 1065 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d 11月 19 10:11:08 k8s-master kubelet[1065]: E1119 10:11:08.774041 1065 kubelet.go:2183] Container runtime network not ready: NetworkReady=false reaso...itialized 11月 19 10:11:11 k8s-master kubelet[1065]: W1119 10:11:11.433579 1065 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d 11月 19 10:11:13 k8s-master kubelet[1065]: E1119 10:11:13.814004 1065 kubelet.go:2183] Container runtime network not ready: NetworkReady=false reaso...itialized 11月 19 10:11:15 k8s-master kubelet[1065]: E1119 10:11:15.760929 1065 pod_workers.go:191] Error syncing pod 6f29173f-3388-49a0-b78e-f7e4bf6718c5 ("calico-nod... 11月 19 10:11:16 k8s-master kubelet[1065]: W1119 10:11:16.434114 1065 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d 11月 19 10:11:18 k8s-master kubelet[1065]: E1119 10:11:18.854685 1065 kubelet.go:2183] Container runtime network not ready: NetworkReady=false reaso...itialized 11月 19 10:11:21 k8s-master kubelet[1065]: W1119 10:11:21.435030 1065 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d 11月 19 10:11:23 k8s-master kubelet[1065]: E1119 10:11:23.894789 1065 kubelet.go:2183] Container runtime network not ready: NetworkReady=false reaso...itialized
最新发布
11-20
Kuberneteskubelet 报错无法更新 CNI 配置(no networks found in /etc/cni/net.d)以及容器运行时网络未就绪(NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized),以 Calico 为例,可采取以下解决方案: ### 检查并安装 CNI 插件 确保 CNI 插件已正确安装并配置。创建 `/opt/cni/bin` 目录并下载相应的压缩包,如从 `https://github.com/containernetworking/plugins/releases/tag/v0.8.6` 下载 `cni-plugins-linux-amd64-v0.8.6.tgz`,然后将其解压在 `/opt/cni/bin` 下: ```bash sudo mkdir -p /opt/cni/bin cd /opt/cni/bin wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz tar -xzvf cni-plugins-linux-amd64-v0.8.6.tgz ``` ### 部署 Calico 网络 按照 Calico 的官方文档进行部署,使用以下命令来部署 Calico: ```bash kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ``` 需注意修改 `CALICO_IPV4POOL_CIDR` 参数,使其与 `kubeadm init` 时指定的 `--pod-network-cidr` 一致 [^2]。 ### 检查 kubelet 配置 编辑 `/var/lib/kubelet/kubeadm-flags.env` 文件,确保配置正确。同时可以查看 `kubelet` 中 `--pod-infra-container-image` 选项含义: ```bash kubelet --help|grep infra ``` 该选项指定的镜像将不会被镜像垃圾收集器修剪。当容器运行时设置为 `docker` 时,每个 `pod` 中的所有容器都将使用这个镜像中的 `network/ipc` 名称空间。其他 CRI 实现有自己的配置来设置这个镜像,默认值为 `k8s.gcr.io/pause:3.5` [^2]。 ### 检查网络组件状态 使用以下命令检查 Calico 相关 Pod 的状态: ```bash kubectl get pods -n kube-system | grep calico ``` 确保所有 Calico 相关的 Pod 都处于 `Running` 状态。 ### 检查内核参数和模块 确保内核参数和模块已正确配置,可执行以下操作: ```bash cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- br_netfilter modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && \ bash /etc/sysconfig/modules/ipvs.modules && \ lsmod | grep -E "ip_vs|nf_conntrack_ipv4" cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 vm.swappiness = 0 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 fs.may_detach_mounts = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值