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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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 nod
<think>好的,我需要解释Kubernetes中ClusterIP的生成原理和服务创建过程。首先,用户提到了ClusterIP是k8s分配的一个虚拟IP,只能在集群内部访问,通过iptables转发到后端Pod。根据引用[3],ClusterIP是在创建Service时由k8s从可分配的IP池中分配的,这个IP池应该是在配置集群时设置的,比如在kube-apiserver的启动参数中指定了service-cluster-ip-range参数。 接下来,服务创建的过程涉及几个步骤。当用户创建Service资源时,kube-apiserver会接收到请求,然后Service控制器负责分配ClusterIP。这个IP需要是唯一的,并且属于预先配置的CIDR范围内。然后,kube-proxy组件会根据Service的配置更新iptables规则,将流量从ClusterIP转发到对应的Endpoints,也就是后端的Pod地址。引用[4]提到kube-proxy使用iptables模式,这是默认的方式,通过设置iptables规则来实现负载均衡。 此外,引用[2]指出ClusterIP是虚拟IP,无法ping通,但可以通过服务端口访问。这说明ClusterIP并不绑定到任何实际网络接口,而是通过iptables或IPVS进行流量拦截和转发。 关于生成机制,ClusterIP的分配可能涉及到etcd,如引用[3]所述,但更准确地说,应该是kube-controller-manager中的service控制器负责管理IP分配,可能使用内部的存储机制来跟踪已分配的IP,而不是直接依赖etcd。每个Service创建时,控制器从池中选择一个未被使用的IP,并确保其唯一性。 最后,整个过程需要各个组件的协作:kube-apiserver处理请求,Service控制器分配IP,kube-proxy配置网络规则。这样,当用户访问ClusterIP时,流量会被正确路由到后端Pod。</think>### Kubernetes ClusterIP 生成原理与服务创建过程 #### 1. **ClusterIP 的生成机制** ClusterIP 是 Kubernetes 为 Service 分配的**虚拟 IP 地址**,其生成遵循以下核心逻辑: - **IP 池配置**:集群初始化时通过 `service-cluster-ip-range` 参数定义 CIDR 范围(如 `10.233.0.0/16`),该范围决定了可分配的 ClusterIP 池[^1]。 - **动态分配**:创建 Service 时,kube-controller-manager 的 Service 控制器从 IP 池中选择**最小可用 IP**,并通过原子操作确保唯一性(无需依赖 etcd)[^3]。 - **保留 IP**:首地址(如 `10.233.0.1`)通常保留给 Kubernetes API Server,后续地址按需分配。 #### 2. **Service 创建流程** 当用户创建 Service 资源时,系统会触发以下过程: 1. **API Server 接收请求** YAML 文件提交后,kube-apiserver 验证并存储 Service 资源到 etcd。 2. **Service 控制器介入** - 检测到新 Service 对象后,控制器从预配置的 IP 池分配 ClusterIP。 - 更新 Service 对象的 `.spec.clusterIP` 字段[^3]。 3. **Endpoints 控制器同步** 根据 Service 的 Label Selector 匹配 Pod,生成 Endpoints 对象(记录后端 Pod 的 IP:Port 列表)。 4. **kube-proxy 配置网络规则** - **iptables 模式**(默认):插入 NAT 规则,将目标为 ClusterIP:Port 的流量随机转发至后端 Pod IP[^4]。 - **IPVS 模式**:利用内核 IPVS 表实现更高效的负载均衡。 #### 3. **关键技术特性** - **虚拟性**:ClusterIP 不绑定物理网卡,仅通过 iptables/IPVS 实现流量重定向[^3]。 - **稳定性**:Service 生命周期内 ClusterIP 固定不变(删除重建会重新分配)。 - **DNS 集成**:CoreDNS 自动为 ClusterIP 创建 `[服务名].[命名空间].svc.cluster.local` 的 DNS 记录[^2]。 #### 4. **示例配置片段** ```yaml apiVersion: v1 kind: Service metadata: name: demo-service spec: type: ClusterIP clusterIP: 10.233.5.20 # 可手动指定(需在池内且未被占用) ports: - port: 80 targetPort: 9376 selector: app: demo-app ``` #### 5. **流量转发示意图** ``` Client Pod --> ClusterIP:80 --> iptables/IPVS --> Pod1:9376 (10.244.1.5) --> Pod2:9376 (10.244.2.3) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值