k8s工作端二进制部署-kubelet
本文章是 k8s二进制高可用集群部署 的分支。详细步骤请参考目录。
二进制下载地址
压缩包下载:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG
注:打开链接你会发现里面有很多包,下载一个Server包就够了,里面包含了Server和Client以及Node二进制文件。
单个下载:https://www.downloadkubernetes.com/
具体下载那个,自由发挥。
1.创建工作目录并拷贝二进制文件
# 在所有worker node创建工作目录(master已创建,新加入节点需要创建) mkdir -p /opt/kubernetes/{cfg,ssl,logs} # 从解压的k8s server压缩包中拷贝文件 cp kubelet kube-proxy /usr/local/bin
2.生成kubelet初次加入集群引导kubeconfig文件
KUBE_CONFIG="/opt/kubernetes/cfg/bootstrap.kubeconfig" KUBE_APISERVER="https://192.168.64.130:6443" # apiserver IP:PORT TOKEN=$(awk -F "," '{print $1}' /opt/kubernetes/cfg/token.csv) # 与token.csv里保持一致 # 生成 kubelet bootstrap kubeconfig 配置文件 kubectl config set-cluster kubernetes \ --certificate-authority=/opt/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=${KUBE_CONFIG} kubectl config set-credentials "kubelet-bootstrap" \ --token=${TOKEN} \ --kubeconfig=${KUBE_CONFIG} kubectl config set-context default \ --cluster=kubernetes \ --user="kubelet-bootstrap" \ --kubeconfig=${KUBE_CONFIG} kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
3.生成kubeconfig文件
KUBE_CONFIG="/opt/kubernetes/cfg/kubelet.kubeconfig" KUBE_APISERVER="https://192.168.64.130:6443" # apiserver IP:PORT TOKEN=$(awk -F "," '{print $1}' /opt/kubernetes/cfg/token.csv) #设置集群参数 kubectl config set-cluster kubernetes --certificate-authority=/opt/kubernetes/ssl/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=${KUBE_CONFIG} #设置客户端认证参数 kubectl config set-credentials kubelet-bootstrap --token=${TOKEN} --kubeconfig=${KUBE_CONFIG} #设置上下文参数 kubectl config set-context default --cluster=kubernetes --user=kubelet-bootstrap --kubeconfig=${KUBE_CONFIG} #设置默认上下文 kubectl config use-context default --kubeconfig=${KUBE_CONFIG} #创建角色绑定 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
4.配置参数文件【二选一,注意cgroupDriver参数值必须和容器统一,Docker使用Docker info查看】
1.yml形式
cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 0.0.0.0 port: 10250 readOnlyPort: 10255 cgroupDriver: systemd clusterDNS: - 10.0.0.2 clusterDomain: cluster.local failSwapOn: false authentication: anonymous: enabled: false webhook: cacheTTL: 2m0s enabled: true x509: clientCAFile: /opt/kubernetes/ssl/ca.pem authorization: mode: Webhook webhook: cacheAuthorizedTTL: 5m0s cacheUnauthorizedTTL: 30s evictionHard: imagefs.available: 15% memory.available: 100Mi nodefs.available: 10% nodefs.inodesFree: 5% maxOpenFiles: 1000000 maxPods: 110 EOF
2.json形式
cat > /opt/kubernetes/cfg/kubelet.json << EOF { "kind": "KubeletConfiguration", "apiVersion": "kubelet.config.k8s.io/v1beta1", "authentication": { "x509": { "clientCAFile": "/etc/kubernetes/ssl/ca.pem" }, "webhook": { "enabled": true, "cacheTTL": "2m0s" }, "anonymous": { "enabled": false } }, "authorization": { "mode": "Webhook", "webhook": { "cacheAuthorizedTTL": "5m0s", "cacheUnauthorizedTTL": "30s" } }, "address": "192.168.64.130", "port": 10250, "readOnlyPort": 10255, "cgroupDriver": "cgroupfs", //如果docker的驱动为systemd,处修改为systemd。此处设置很重要,否则后面node节点无法加入到集群 "hairpinMode": "promiscuous-bridge", "serializeImagePulls": false, "featureGates": { "RotateKubeletClientCertificate": true, "RotateKubeletServerCertificate": true }, "clusterDomain": "cluster.local.", "clusterDNS": ["10.255.0.2"] } EOF
5.创建配置文件
cat > /opt/kubernetes/cfg/kubelet.conf << EOF KUBELET_OPTS=" \ --v=2 \ --hostname-override=k8s-master1 \ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \ --config=/opt/kubernetes/cfg/kubelet-config.yml \ --cert-dir=/opt/kubernetes/ssl \ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6" \ --container-runtime=docker \ --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock EOF
参数说明:
--hostname-override:显示名称,集群中唯一
--network-plugin:启用CNI
在 Kubernetes 1.24 之前,CNI 插件也可以由 kubelet 使用命令行参数 cni-bin-dir
和 network-plugin
管理。Kubernetes 1.24 移除了这些命令行参数, CNI 的管理不再是 kubelet 的工作。
如果你在移除 dockershim 之后遇到问题, 请参阅排查 CNI 插件相关的错误。
--kubeconfig:空路径,会自动生成,后面用于连接apiserver
--bootstrap-kubeconfig:首次启动向apiserver申请证书
--config:配置参数文件
--cert-dir:kubelet证书生成目录
--pod-infra-container-image:管理Pod网络容器的镜像
6.systemd管理kubelet
cat > /usr/lib/systemd/system/kubelet.service << EOF [Unit] Description=Kubernetes Kubelet After=docker.service [Service] EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf ExecStart=kubelet \$KUBELET_OPTS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF
7.启动并设置开机启动
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
8.批准kubelet证书申请并加入集群【master上执行】
确认kubelet服务启动成功后,接着到master上审批一下bootstrap请求。
# 查看kubelet证书请求 kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION node-csr-fRFDx1XzoS7nSHzq21BnBYbcPC4lkbU1qJ7webSfJ0c 12s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap <none> Pending # 批准申请 kubectl certificate approve node-csr-fRFDx1XzoS7nSHzq21BnBYbcPC4lkbU1qJ7webSfJ0c # 查看节点(由于网络插件还没有部署,节点会没有准备就绪 NotReady) kubectl get node NAME STATUS ROLES AGE VERSION k8s-master1 NotReady <none> 1s v1.26.1