suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件

2024-05-13 03:58

本文主要是介绍suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • 1.9、部署kubelet
          • 1.9.0、创建kubelet bootstrap kubeconfig文件
          • 1.9.1、创建kubelet配置文件
          • 1.9.2、配置kubelet为systemctl启动
          • 1.9.3、拉取kubelet依赖的pause镜像
          • 1.9.4、分发kubelet证书和文件到其他节点
          • 1.9.5、授权kubelet-bootstrap用户组允许请求证书
          • 1.9.6、启动kubelet服务
          • 1.9.7、自动approve CSR请求
          • 1.9.8、查看节点是否都为ready
          • 1.9.9、手动approve server cert csr
          • 1.9.10、bear token认证和授权

  • suse 12 二进制部署 Kubernetes 集群系列合集:
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第01章 - 创建CA证书和kubectl集群管理命令
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第02章 - 部署etcd集群
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第05章 - 部署kube-nginx
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第06章 - 部署kube-apiserver组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第07章 - 部署kube-controller-manager组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第08章 - 部署kube-scheduler组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第10章 - 部署kube-proxy组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第11章 - 部署coredns组件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第12章 - 部署dashboard插件
    • suse 12 二进制部署 Kubernetets 1.19.7 - 第13章 - 部署metrics-server插件
    • suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
    • suse 12 二进制部署 Kubernetets 1.19.7 - 番外篇 - 增加node节点
1.9、部署kubelet
  • kubelet运行在每个node节点上,接收kube-apiserver发送的请求,管理Pod容器,执行交互命令

  • kubelet启动时自动向kube-apiserver注册节点信息,内置的cAdivsor统计和监控节点的资源使用资源情况

  • 为确保安全,部署时关闭了kubelet的非安全http端口,对请求进行认证和授权,拒绝未授权的访问

1.9.0、创建kubelet bootstrap kubeconfig文件
#!/usr/bin/env bash
source /opt/k8s/bin/k8s-env.shfor node_name in ${NODE_NAMES[@]}
doprintf "\e[1;34m${node_name}\e[0m\n"# 创建 tokenexport BOOTSTRAP_TOKEN=$(kubeadm token create \--description kubelet-bootstrap-token \--groups system:bootstrappers:${node_name} \--kubeconfig ~/.kube/config)# 设置集群参数kubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/cert/ca.pem \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=/opt/k8s/ssl/kubelet-bootstrap-${node_name}.kubeconfig# 设置客户端认证参数kubectl config set-credentials kubelet-bootstrap \--token=${BOOTSTRAP_TOKEN} \--kubeconfig=/opt/k8s/ssl/kubelet-bootstrap-${node_name}.kubeconfig# 设置上下文参数kubectl config set-context default \--cluster=kubernetes \--user=kubelet-bootstrap \--kubeconfig=/opt/k8s/ssl/kubelet-bootstrap-${node_name}.kubeconfig# 设置默认上下文kubectl config use-context default --kubeconfig=/opt/k8s/ssl/kubelet-bootstrap-${node_name}.kubeconfig
done
  • 向kubeconfig写入的是token,bootstrap结束后kube-controller-manager为kubelet创建client和server证书
"查看kubeadm为各个节点创建的token"
k8s-01:~ # kubeadm token list --kubeconfig ~/.kube/config
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
5750z9.ycsk3jxiahgz1gkn   23h         2021-02-14T00:55:41+08:00   authentication,signing   kubelet-bootstrap-token                                    system:bootstrappers:k8s-05
f4scbn.lev5uqmokwai5k0e   23h         2021-02-14T00:55:40+08:00   authentication,signing   kubelet-bootstrap-token                                    system:bootstrappers:k8s-02
kjfsng.qmjesofryg97c80q   23h         2021-02-14T00:55:41+08:00   authentication,signing   kubelet-bootstrap-token                                    system:bootstrappers:k8s-04
nseipt.09jaep1j8qnoqn1a   23h         2021-02-14T00:55:40+08:00   authentication,signing   kubelet-bootstrap-token                                    system:bootstrappers:k8s-01
zlal1h.856gawjgom560fys   23h         2021-02-14T00:55:40+08:00   authentication,signing   kubelet-bootstrap-token                                    system:bootstrappers:k8s-03
  • token有效期为1天,超期后将不能被用来bootstrap kubelet,且会被kube-controller-manager的token cleaner清理
  • kube-apiserver接收kubelet的bootstrap token后,将请求的user设置为system:bootstrap; group设置为system:bootstrappers,后续将为这个group设置ClusterRoleBinding
1.9.1、创建kubelet配置文件
k8s-01:~ # cd /opt/k8s/conf/
k8s-01:/opt/k8s/conf # source /opt/k8s/bin/k8s-env.sh
k8s-01:/opt/k8s/conf # 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: falsewebhook:enabled: truex509:clientCAFile: "/etc/kubernetes/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: systemd
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
1.9.2、配置kubelet为systemctl启动
k8s-01:~ # cd /opt/k8s/conf/
k8s-01:/opt/k8s/conf # source /opt/k8s/bin/k8s-env.sh
k8s-01:/opt/k8s/conf # cat > kubelet.service.template <<EOF
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service[Service]
WorkingDirectory=${K8S_DIR}/kubelet
ExecStart=/opt/k8s/bin/kubelet \\--v=2 \\--hostname-override=##NODE_IP## \\--bootstrap-kubeconfig=/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig \\--cert-dir=/etc/kubernetes/cert \\--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\--config=/etc/kubernetes/kubelet-config.yaml \\--logtostderr=true \\--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 \\--image-pull-progress-deadline=15m \\--cni-conf-dir=/etc/cni/net.d \\--root-dir=${K8S_DIR}/kubeletRestart=always
RestartSec=5
StartLimitInterval=0[Install]
WantedBy=multi-user.target
EOF
  • –bootstrap-kubeconfig:指向 bootstrap kubeconfig 文件,kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求
  • K8S approve kubelet 的 csr 请求后,在 --cert-dir 目录创建证书和私钥文件,然后写入 --kubeconfig 文件
  • kubelet设置了 --hostname-override 选项,kube-proxy 也需要设置该选项,否则会出现 找不到 Node 的情况;
1.9.3、拉取kubelet依赖的pause镜像
k8s-01:~ # docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
k8s-01:~ # cd /opt/k8s/packages/
k8s-01:/opt/k8s/packages # docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o pause.tar
"将镜像保存到本地,分发到其他节点"
1.9.4、分发kubelet证书和文件到其他节点
#!/usr/bin/env bash
source /opt/k8s/bin/k8s-env.shfor (( i=0; i < 5; i++ ))
dosed -e "s/##NODE_IP##/${NODE_IPS[i]}/" /opt/k8s/conf/kubelet.service.template > \/opt/k8s/conf/kubelet-${NODE_IPS[i]}.servicesed -e "s/##NODE_IP##/${NODE_IPS[i]}/" /opt/k8s/conf/kubelet-config.yaml.template > \/opt/k8s/conf/kubelet-config-${NODE_IPS[i]}.yaml.template
donefor node_name in ${NODE_NAMES[@]}
doprintf "\e[1;34m${node_name}\e[0m\n"scp /opt/k8s/ssl/kubelet-bootstrap-${node_name}.kubeconfig \${node_name}:/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
donefor host in ${NODE_IPS[@]}
doprintf "\e[1;34m${host}\e[0m\n"scp /opt/k8s/conf/kubelet-${host}.service ${host}:/etc/systemd/system/kubelet.servicescp /opt/k8s/conf/kubelet-config-${host}.yaml.template ${host}:/etc/kubernetes/kubelet-config.yamlscp /opt/k8s/packages/pause.tar ${host}:/opt/k8s/ssh root@${host} "docker load -i /opt/k8s/pause.tar"
done
1.9.5、授权kubelet-bootstrap用户组允许请求证书
k8s-01:~ # kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers
  • 不创建的话,kubelet会启动失败
1.9.6、启动kubelet服务
#!/usr/bin/env bash
source /opt/k8s/bin/k8s-env.shfor host in ${NODE_IPS[@]}
doprintf "\e[1;34m${host}\e[0m\n"ssh root@${host} "mkdir -p ${K8S_DIR}/kubelet/kubelet-plugins/volume/exec/"ssh root@${host} "systemctl daemon-reload && \systemctl enable kubelet --now && \systemctl status kubelet | grep Active"
done
  • kubelet 启动后使用 --bootstrap-kubeconfigkube-apiserver 发送 CSR 请求,当这个CSR 被 approve 后,kube-controller-manager 为 kubelet 创建 TLS 客户端证书、私钥和 --kubeletconfig 文件
  • 注意:kube-controller-manager 需要配置 --cluster-signing-cert-file--cluster-signing-key-file 参数,才会为TLS Bootstrap 创建证书和私钥
1.9.7、自动approve CSR请求
  • 创建三个ClusterRoleBinding,分别用于自动approve clientrenew clientrenew server证书
k8s-01:~ # cd /opt/k8s/conf/
k8s-01:/opt/k8s/conf # cat > csr-crb.yaml <<EOF# Approve all CSRs for the group "system:bootstrappers"kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: auto-approve-csrs-for-groupsubjects:- kind: Groupname: system:bootstrappersapiGroup: rbac.authorization.k8s.ioroleRef:kind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:nodeclientapiGroup: rbac.authorization.k8s.io
---# To let a node of the group "system:nodes" renew its own credentialskind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: node-client-cert-renewalsubjects:- kind: Groupname: system:nodesapiGroup: rbac.authorization.k8s.ioroleRef:kind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:selfnodeclientapiGroup: rbac.authorization.k8s.io
---
# A ClusterRole which instructs the CSR approver to approve a node requesting a
# serving cert matching its client cert.
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: approve-node-server-renewal-csr
rules:
- apiGroups: ["certificates.k8s.io"]resources: ["certificatesigningrequests/selfnodeserver"]verbs: ["create"]
---# To let a node of the group "system:nodes" renew its own server credentialskind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: node-server-cert-renewalsubjects:- kind: Groupname: system:nodesapiGroup: rbac.authorization.k8s.ioroleRef:kind: ClusterRolename: approve-node-server-renewal-csrapiGroup: rbac.authorization.k8s.io
EOF
k8s-01:/opt/k8s/conf # kubectl apply -f csr-crb.yaml
  • auto-approve-csrs-for-group 自动approve node的第一次CSR,注意第一次CSR时,请求的Group为system:bootstrappers
  • node-client-cert-renewal 自动approve node后续过期的client证书,自动生成的证书Group为system:nodes
  • node-server-cert-renewal 自动approve node后续过期的server证书,自动生成的证书Group
1.9.8、查看节点是否都为ready
k8s-01:~ # kubectl get node
NAME            STATUS   ROLES    AGE   VERSION
192.168.72.39   Ready    <none>   20s   v1.19.7
192.168.72.40   Ready    <none>   19s   v1.19.7
192.168.72.41   Ready    <none>   18s   v1.19.7
192.168.72.42   Ready    <none>   18s   v1.19.7
192.168.72.43   Ready    <none>   17s   v1.19.7
1.9.9、手动approve server cert csr
  • 基于安全考虑,CSR approving controllers不会自动approve kubelet server证书签名请求,需要手动approve
k8s-01:~ # kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve
1.9.10、bear token认证和授权
  • 创建一个ServiceAccount,将它和ClusterRole system:kubelet-api-admin绑定,从而具有调用kubelet API的权限
k8s-01:~ # kubectl create sa kubelet-api-test
k8s-01:~ # kubectl create clusterrolebinding kubelet-api-test --clusterrole=system:kubelet-api-admin --serviceaccount=default:kubelet-api-test

这篇关于suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984620

相关文章

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

ubuntu16.04如何部署dify? 在Linux上安装部署Dify的技巧

《ubuntu16.04如何部署dify?在Linux上安装部署Dify的技巧》随着云计算和容器技术的快速发展,Docker已经成为现代软件开发和部署的重要工具之一,Dify作为一款优秀的云原生应用... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。它

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n