【云原生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天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
5天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
21 2
|
16天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
74 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
147 17
|
2月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
211 4
|
2月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
989 1
|
2月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
93 3