【云原生Kubernetes】二进制搭建Kubernetes集群(中)——部署node节点(1)

简介: 上一篇中已部署了etcd分布式数据库、master01节点,本文将部署Kubernetes集群中的 worker node 节点和 CNI 网络插件。

四、部署node节点


4.1 所有node节点部署 docker引擎

#所有 node 节点部署docker引擎
 #安装依赖包
 yum install -y yum-utils device-mapper-persistent-data lvm2
 #设置阿里云镜像源
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 #安装 docker-ce
 yum install -y docker-ce   #docker-ce-cli、containerd.io会作为依赖包被安装
 systemctl start docker.service     #启动docker
 systemctl enable docker.service    #设置为开机自启
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


4.2 部署 Worker Node 组件

#---------------1、在所有 node 节点上操作-----------------
 #创建kubernetes工作目录,并创建四个子目录cfg、bin、ssl、logs。cfg用于存放配置文件,bin用于存放执行文件,ssl用于存放证书文件,logs用于存放日志文件
 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
 #上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
 cd /opt/
 unzip node.zip
 chmod +x kubelet.sh proxy.sh   #为两个脚本文件增加执行权限
 #--------------2、在 master01 节点上操作----------------
 #把 kubelet、kube-proxy 拷贝到两个node 节点
 cd /opt/k8s/kubernetes/server/bin
 scp kubelet kube-proxy root@192.168.41.42:/opt/kubernetes/bin/
 scp kubelet kube-proxy root@192.168.41.43:/opt/kubernetes/bin/
 #创建/opt/k8s/kubeconfig 目录,上传 kubeconfig.sh 文件到该目录中,生成 kubeconfig 的配置文件。
 #kubeconfig文件包含集群参数(CA证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群context上下文参数(集群名称、用户名)。Kubenetes组件(如kubelet、 kube-proxy) 通过启动时指定不同的kubeconfig 文件可以切换到不同的集群,连接到apiserver
 mkdir /opt/k8s/kubeconfig
 cd /opt/k8s/kubeconfig
 chmod +x kubeconfig.sh
 ./kubeconfig.sh 192.168.41.10 /opt/k8s/k8s-cert/  #运行脚本,生成 kubeconfig 的配置文件。脚本后面跟的参数是 master01的IP、证书目录
 #把配置文件bootstrap.kubeconfig、kube-proxy.kubeconfig拷贝到node节点
 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.41.42:/opt/kubernetes/cfg/
 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.41.43:/opt/kubernetes/cfg/
 #RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求
 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
 #CSR 请求就是kublet向APIserver请求证书的操作
 #若执行失败,可先给kubectl绑定默认cluster-admin管理员集群角色,授权集群操作权限
 kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
 ----------------------- 虚线内是注释 -------------------------------------------------
 kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。
 Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。
 kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求,这个 Token 被预先内置在 apiserver 节点的 token.csv 中,其身份为 kubelet-bootstrap 用户和 system:kubelet-bootstrap 用户组;想要首次 CSR 请求能成功(即不会被 apiserver 401 拒绝),则需要先创建一个 ClusterRoleBinding,将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定(通过 kubectl get clusterroles 可查询),使其能够发起 CSR 认证请求。
 TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的;kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。
 也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。
 ------------------------------------------------------------------------------------
 #---------------3、在所有node节点上操作,启动kubelet服务-------------------
 #node01节点执行kubelet.sh脚本文件,启动 kubelet 服务,位置参数1为node01的ip地址。
 cd /opt/
 ./kubelet.sh 192.168.41.42  
 ps aux | grep kubelet
 #node02节点执行kubelet.sh脚本文件,启动 kubelet 服务,位置参数1为node02的ip地址。
 cd /opt/
 ./kubelet.sh 192.168.41.43
 ps aux | grep kubelet
 #-----------------4、在 master01 节点上操作,通过 CSR 请求----------------
 #检查到 node01节点和node02节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
 kubectl get csr
 NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           CONDITION
 node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw   4m39s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
 node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII   13m     kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
 #通过node01节点kubelet的 CSR 请求
 kubectl certificate approve node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw
 #通过node02节点kubelet的 CSR 请求
 kubectl certificate approve node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII
 #Approved,Issued 表示已授权 CSR 请求并签发证书
 kubectl get csr
 NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
 node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw   23m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
 node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII   31m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
 #查看node节点,由于网络插件还没有部署,节点会没有准备就绪,所以显示NotReady
 kubectl get node
 NAME            STATUS     ROLES    AGE   VERSION
 192.168.41.42   NotReady   <none>   11m   v1.20.11
 192.168.41.43   NotReady   <none>   12m   v1.20.11
 #--------------------5、在所有 node 节点上操作,启动kube-proxy服务-----------------------
 ##node01节点操作,加载 ip_vs 模块,启动kube-proxy服务
 #加载 ip_vs 模块
 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
 #运行脚本,启动kube-proxy服务
 cd /opt/
 ./proxy.sh 192.168.41.42
 ps aux | grep kube-proxy
 ##node02节点操作,加载 ip_vs 模块,启动kube-proxy服务
 #加载 ip_vs 模块
 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
 #运行脚本,启动kube-proxy服务
 cd /opt/
 ./proxy.sh 192.168.41.43
 ps aux | grep kube-proxy
复制代码


1、在所有 node 节点上操作

网络异常,图片无法展示
|


2、在 master01 节点上操作

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


3、在所有node节点上操作,启动kubelet服务

网络异常,图片无法展示
|


网络异常,图片无法展示
|


4、在 master01 节点上操作,通过 CSR 请求

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|



5、在所有 node 节点上操作

网络异常,图片无法展示
|


网络异常,图片无法展示
|


附录1:kubeconfig.sh

#!/bin/bash
 #example: kubeconfig.sh 192.168.41.10 /opt/k8s/k8s-cert/
 #脚本后面跟的第一个位置参数是:master01的IP,第二个位置参数是:证书目录。
 #创建bootstrap.kubeconfig文件
 #该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识向 apiserver 发起 CSR 请求
 BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv)
 APISERVER=$1
 SSL_DIR=$2
 export KUBE_APISERVER="https://$APISERVER:6443"
 # 设置集群参数
 kubectl config set-cluster kubernetes \
   --certificate-authority=$SSL_DIR/ca.pem \
   --embed-certs=true \
   --server=${KUBE_APISERVER} \
   --kubeconfig=bootstrap.kubeconfig
 #--embed-certs=true:表示将ca.pem证书写入到生成的bootstrap.kubeconfig文件中
 # 设置客户端认证参数,kubelet 使用 bootstrap token 认证
 kubectl config set-credentials kubelet-bootstrap \
   --token=${BOOTSTRAP_TOKEN} \
   --kubeconfig=bootstrap.kubeconfig
 # 设置上下文参数
 kubectl config set-context default \
   --cluster=kubernetes \
   --user=kubelet-bootstrap \
   --kubeconfig=bootstrap.kubeconfig
 # 使用上下文参数生成 bootstrap.kubeconfig 文件
 kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
 #----------------------
 #创建kube-proxy.kubeconfig文件
 # 设置集群参数
 kubectl config set-cluster kubernetes \
   --certificate-authority=$SSL_DIR/ca.pem \
   --embed-certs=true \
   --server=${KUBE_APISERVER} \
   --kubeconfig=kube-proxy.kubeconfig
 # 设置客户端认证参数,kube-proxy 使用 TLS 证书认证
 kubectl config set-credentials kube-proxy \
   --client-certificate=$SSL_DIR/kube-proxy.pem \
   --client-key=$SSL_DIR/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
 # 使用上下文参数生成 kube-proxy.kubeconfig 文件
 kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
复制代码


附录2:kubelet.sh

#!/bin/bash
 NODE_ADDRESS=$1
 DNS_SERVER_IP=${2:-"10.0.0.2"}
 #创建 kubelet 启动参数配置文件
 cat >/opt/kubernetes/cfg/kubelet <<EOF
 KUBELET_OPTS="--logtostderr=false \
 --v=2 \
 --log-dir=/opt/kubernetes/logs \
 --hostname-override=${NODE_ADDRESS} \
 --network-plugin=cni \
 --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
 --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
 --config=/opt/kubernetes/cfg/kubelet.config \
 --cert-dir=/opt/kubernetes/ssl \
 --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
 EOF
 #--hostname-override:指定kubelet节点在集群中显示的主机名或IP地址,默认使用主机hostname;kube-proxy和kubelet的此项参数设置必须完全一致
 #--network-plugin:启用CNI
 #--kubeconfig:指定kubelet.kubeconfig文件位置,当前为空路径,会自动生成,用于如何连接到apiserver,里面含有kubelet证书,master授权完成后会在node节点上生成 kubelet.kubeconfig 文件
 #--bootstrap-kubeconfig:指定连接 apiserver 的 bootstrap.kubeconfig 文件
 #--config:指定kubelet配置文件的路径,启动kubelet时将从此文件加载其配置
 #--cert-dir:指定master颁发的kubelet证书生成目录
 #--pod-infra-container-image:指定Pod基础容器(Pause容器)的镜像。Pod启动的时候都会启动一个这样的容器,每个pod之间相互通信需要Pause的支持,启动Pause需要Pause基础镜像
 #----------------------
 #创建kubelet配置文件(该文件实际上就是一个yml文件,语法非常严格,不能出现tab键,冒号后面必须要有空格,每行结尾也不能有空格)
 cat >/opt/kubernetes/cfg/kubelet.config <<EOF
 kind: KubeletConfiguration
 apiVersion: kubelet.config.k8s.io/v1beta1
 address: ${NODE_ADDRESS}
 port: 10250
 readOnlyPort: 10255
 cgroupDriver: cgroupfs
 clusterDNS:
 - ${DNS_SERVER_IP} 
 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
 #PS:当命令行参数与此配置文件(kubelet.config)有相同的值时,就会覆盖配置文件中的该值。
 #----------------------
 #创建 kubelet.service 服务管理文件
 cat >/usr/lib/systemd/system/kubelet.service <<EOF
 [Unit]
 Description=Kubernetes Kubelet
 After=docker.service
 Requires=docker.service
 [Service]
 EnvironmentFile=/opt/kubernetes/cfg/kubelet
 ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
 Restart=on-failure
 KillMode=process
 [Install]
 WantedBy=multi-user.target
 EOF
 systemctl daemon-reload
 systemctl enable kubelet
 systemctl restart kubelet
复制代码


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
运维 Dubbo Cloud Native
Dubbo 云原生重构出击:更快部署、更强控制台、更智能运维
Apache Dubbo 最新升级支持云原生,提供一键部署微服务集群与全新可视化控制台,提升全生命周期管理体验,助力企业高效构建云原生应用。
288 25
|
3月前
|
运维 Kubernetes API
解决Kubernetes集群中master节点无法与node节点通信的策略。
这些策略不仅需要执行命令来获取信息,更要深入理解集群组件如何交互,以便进行准确的故障定位与修复。一条一条地排查,并适时回顾配置文件,证书有效性等,通常可以找到问题所在。给出的命令需要根据具体环境的配置进行适当的修改。故障排除往往是一个细致且需求反复验证的过程,但遵循上述策略可以高效定位大部分通信故障的原因。
273 12
|
3月前
|
Kubernetes 网络协议 API
在k8s集群中解决master节点与node通信问题
整个排查和解决流程需要综合应用以上方法,以及根据具体情况调整排查顺序或应用其他技术细节。为保证解决方案的实用性和有效性,还需紧跟Kubernetes社区的最新动态和最佳实践。在实际操作过程中,应记录所采取的步骤和观察到的系统响应,以便在遇到类似问题时能够快速定位和解决。
327 8
|
4月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
181 1
|
7月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
497 17
|
8月前
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
7月前
|
数据库
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
|
3月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
903 11
|
8月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。

热门文章

最新文章