【云原生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
复制代码


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
3月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
3月前
|
敏捷开发 Kubernetes Cloud Native
阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理
在多云环境中,阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理。通过容器化、服务网格等技术,实现了应用的一致性与可移植性,简化了多云环境下的资源管理和服务治理,帮助企业应对复杂的云环境挑战,加速数字化转型。
86 5
|
3月前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
4月前
|
Kubernetes Cloud Native 持续交付
云原生技术:重塑现代应用开发与部署模式####
本文深入探讨了云原生技术的核心概念、发展历程及其在现代软件开发和部署中的关键作用。通过分析云原生架构的特点,如容器化、微服务、持续集成与持续部署(CI/CD),以及它如何促进应用的可伸缩性、灵活性和效率,本文旨在为读者提供一个关于云原生技术全面而深入的理解。此外,还将探讨实施云原生策略时面临的挑战及应对策略,帮助组织更好地把握数字化转型的机遇。 ####
|
4月前
|
Cloud Native 持续交付 云计算
云端新纪元:探索云原生技术的奥秘在当今数字化时代,云计算已成为推动企业创新和增长的关键动力。随着云平台的不断成熟,云原生技术应运而生,以其独特的优势引领着一场新的技术革命。本文将深入探讨云原生的核心概念、主要特点以及它如何改变现代软件开发和部署的方式,为您揭开云原生这一神秘面纱。
云原生是一种构建和运行应用程序的方法,充分利用了云平台的弹性、分布式本质以及声明式基础设施。本文将解析云原生的十二要素,微服务架构的优势,以及容器化、持续集成与持续部署(CI/CD)等核心技术的实践应用。通过深入浅出的方式,让读者理解云原生不仅是一种技术,更是一种文化和方法论,它正在重塑软件开发流程,提高资源利用率和应用系统的可扩展性与容错性。
|
3月前
|
监控 Cloud Native 微服务
云端漫步:探索云原生应用的构建与部署
【10月更文挑战第32天】在数字时代的浪潮中,云原生技术如同一艘航船,承载着企业的梦想驶向未知的海洋。本文将带你领略云原生应用的魅力,从基础概念到实战操作,我们将一步步揭开云原生的神秘面纱,体验它如何简化开发、加速部署,并提升系统的可扩展性与可靠性。让我们一起启航,探索云原生的世界!
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
131 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。

热门文章

最新文章