Kubernetes,简称 K8S,是一个用于自动部署、扩展和管理容器化应用程序的开源系统。它最初由 Google 开发,基于其内部使用的大规模容器编排工具 Borg,后来由 Google 捐赠给 Cloud Native Computing Foundation (CNCF) 并开源。Kubernetes 的名称来源于希腊语,意为“舵手”或“飞行员”,象征着它在容器化应用管理中的引导作用。
作用:
- 自动化部署: 自动将应用程序部署到集群中的多个节点上。
- 扩展管理: 根据需求自动扩展或缩减应用程序的实例数量。
- 容器编排: 管理多个容器化应用程序的集群,确保它们在不同节点上高效运行。
官网:
- 英文:https://kubernetes.io
- 中文:https://kubernetes.io/zh-cn/docs
GitHub:
- https://github.com/kubernetes/kubernetes
版本更新:
Kubernetes 大约每季度发布一个新版本,版本号如 1.12, 1.15, 1.17, 1.18, 1.20, 1.22, 1.24, 1.28 等。
传统的后端部署方式通常需要手动将应用程序包部署到服务器上,并通过脚本启动和管理服务。这种方式在面对高并发请求时,需要运维人员手动扩展服务器和部署服务,效率低下且容易出错。
Kubernetes 解决了以下痛点:
- 集群管理: 单机使用 Docker 无法有效管理大规模集群。
- 管理成本: 随着容器数量的增加,手动管理成本急剧上升。
- 容灾与自愈: 缺乏有效的容灾和自愈机制。
- 大规模调度: 没有预设的编排模板,无法快速大规模调度容器。
- 配置管理: 缺乏统一的配置管理中心工具。
- 生命周期管理: 没有容器生命周期的管理工具。
- 图形化管理: 缺乏图形化的运维管理工具。
Kubernetes 的主要功能:
- 容器化应用管理: 使用 Docker 等容器技术对应用程序进行打包、实例化和运行。
- 集群管理: 以集群的方式运行和管理跨机器的容器。
- 跨机器通讯: 解决 Docker 跨机器容器之间的通讯问题。
- 自我修复: 通过自我修复机制确保容器集群始终运行在用户期望的状态。
1. 弹性伸缩
Kubernetes 支持根据命令、UI 或基于 CPU 使用情况自动快速扩容和缩容应用程序实例。这确保了在业务高峰期的高可用性,并在业务低峰期回收资源,以最小成本运行服务。
示例:
- 假设有 2 台机器提供 Web 服务,当网站高并发时,系统资源占比达到一定阈值,Kubernetes 会自动扩展机器数量,例如增加到 10 台。
- 一旦并发量下降,Kubernetes 会自动回收资源,减少到 1 台机器。
2. 自我修复
Kubernetes 在节点故障时会重新启动失败的容器,替换和重新部署,确保预期的副本数量。它还会杀死健康检查失败的容器,并在容器未准备好之前不会处理客户端请求,确保线上服务不中断。
示例:
- 假设有 2 台业务机器,IP 分别为 172.16.0.2 和 172.16.0.10。如果 172.16.0.2 故障,用户期望值是 1 台机器运行,Kubernetes 会自动重新拉起一台机器,确保始终有 1 台机器在运行。
3. 服务发现和负载均衡
Kubernetes 为多个容器提供一个统一访问入口(内部 IP 地址和一个 DNS 名称),并且负载均衡关联的所有容器,使得用户无需考虑容器 IP 问题。
4. 自动发布(默认滚动发布模式)和回滚
Kubernetes 采用滚动更新策略更新应用,一次更新一个或部分 Pod,而不是同时删除所有 Pod。如果更新过程中出现问题,Kubernetes 将回滚更改,确保升级不影响业务。
示例:
- 假设有 3 台 Nginx 服务器,版本为 1.20。在进行版本升级时,Kubernetes 会先更新一台服务器到 1.24 版本,另外两台继续对外提供服务。一旦更新成功,再逐步更新其他服务器。
5. 集中化配置管理和密钥管理
Kubernetes 管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在 Kubernetes 中,方便应用程序使用。
6. 存储编排,支持外挂存储并对外挂存储资源进行编排
Kubernetes 支持挂载外部存储系统,无论是来自本地存储、公有云(如 AWS),还是网络存储(如 NFS、Glusterfs、Ceph),都可以作为集群资源的一部分使用,极大提高存储使用灵活性。
7. 任务批处理运行
Kubernetes 提供一次性任务和定时任务,满足批量数据处理和分析的场景。
Kubernetes (K8S) 采用的是主从设备模型(Master-Slave 架构),其中 Master 节点负责集群的调度、管理和运维,而 Slave 节点(也称为 Worker Node 节点)是集群中的计算工作负载节点。每个 Node 都会被 Master 分配一些工作负载。
Master 节点:Master 节点是整个集群的大脑,负责集群的调度、管理和运维。Master 组件可以在集群中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器,以确保其高可用性和稳定性。
Worker Node 节点:Worker Node 节点是集群中的计算工作负载节点。每个 Node 都会被 Master 分配一些工作负载。当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。
核心组件:
----- Master 组件 -----
Kube-apiserver
- 作用: 用于暴露 Kubernetes API,任何资源请求或调用操作都是通过 kube-apiserver 提供的接口进行。
- 功能: 以 HTTP Restful API 提供接口服务,所有对象资源的增删改查和监听操作都交给 API Server 处理后再提交给 Etcd 存储。
- 理解: API Server 是 K8S 的请求入口服务,负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具),然后根据用户的具体请求,去通知其他组件干活。
Kube-controller-manager
- 作用: 运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。
- 功能: 由一系列控制器组成,通过 API Server 监控整个集群的状态,并确保集群处于预期的工作状态。
主要控制器:
- Node Controller(节点控制器): 负责在节点出现故障时发现和响应。
- Replication Controller(副本控制器): 负责保证集群中一个 RC 所关联的 Pod 副本数始终保持预设值。
- Endpoints Controller(端点控制器): 填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。
- Service Account & Token Controllers(服务帐户和令牌控制器): 为新的命名空间创建默认帐户和 API 访问令牌。
- ResourceQuota Controller(资源配额控制器): 确保指定的资源对象在任何时候都不会超量占用系统物理资源。
- Namespace Controller(命名空间控制器): 管理 namespace 的生命周期。
- Service Controller(服务控制器): 属于 K8S 集群与外部的云平台之间的一个接口控制器。
Kube-scheduler
- 作用: 是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。
- 功能: 通过预选策略(predicate)和优选策略(priorities)选择最合适的 Node 节点来部署 Pod。
----- 配置储存中心 -----
Etcd
- 作用: K8S 的存储服务,etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置。
- 功能: K8S 中仅 API Server 才具备读写权限,其他组件必须通过 API Server 的接口才能读写数据。
----- Node 组件 -----
Kubelet
- 作用: Node 节点的监视器,以及与 Master 节点的通讯器。
- 功能: 定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
- 理解: Kubelet 从 Master 节点获取自己节点上 Pod 的期望状态,直接跟容器引擎交互实现容器的生命周期管理,管理镜像和容器的清理工作。
Kube-Proxy
- 作用: 在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作。
- 功能: 负责写入规则至 iptables、ipvs 实现服务映射访问,维护虚拟的 Pod 集群网络。
Docker 或 Rocket
- 作用: 容器引擎,运行容器,负责本机的容器创建和管理工作。
Kubernetes (K8S) 是一个高度自动化的资源控制系统,通过跟踪对比 etcd 存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。Kubernetes 包含多种类型的资源对象,如 Pod、Label、Service、Replication Controller 等,这些资源对象可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。
Pod
Pod 是 Kubernetes 创建或部署的最小/最简单的基本单位,一个 Pod 代表集群上正在运行的一个进程。一个 Pod 由一个或多个容器组成,Pod 中容器共享网络、存储和计算资源,在同一台 Docker 主机上运行。
特点:
- 一个 Pod 里可以运行多个容器,这种模式称为边车模式(SideCar)。
- 同一个 Pod 之间的容器可以通过 localhost 互相访问,并且可以挂载 Pod 内所有的数据卷。
- 不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。
Pod 控制器
Pod 控制器 是 Pod 启动的一种模板,用来保证在 Kubernetes 里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。
常见的 Pod 控制器:
- Deployment: 无状态应用部署。Deployment 的作用是管理和控制 Pod 和 ReplicaSet,管控它们运行在用户期望的状态中。
- ReplicaSet: 确保预期的 Pod 副本数量。ReplicaSet 的作用就是管理和控制 Pod,管控它们好好干活。但是,ReplicaSet 受控于 Deployment。
- Daemonset: 确保所有节点运行同一类 Pod,保证每个节点上都有一个此类 Pod 运行,通常用于实现系统级后台任务。
- Statefulset: 有状态应用部署。
- Job: 一次性任务。根据用户的设置,Job 管理的 Pod 把任务成功完成就自动退出了。
- Cronjob: 周期性计划性任务。
Label
Label 是 Kubernetes 特色的管理方式,便于分类管理资源对象。Label 可以附加到各种资源对象上,例如 Node、Pod、Service、RC 等,用于关联对象、查询和筛选。
特点:
- 一个 Label 是一个 key-value 的键值对,其中 key 与 value 由用户自己指定。
- 一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象中,也可以在对象创建后动态添加或者删除。
- 可以通过给指定的资源对象捆绑一个或多个不同的 Label,来实现多维度的资源分组管理功能。
Label 选择器(Label selector)
Label 选择器 用于查询和筛选拥有某些 Label 的资源对象。标签选择器目前有两种:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)。
Service
Service 是 Kubernetes 中用于解决 Pod IP 地址动态变化问题的核心概念。Service 可以看作一组提供相同服务的 Pod 的对外访问接口、流量均衡器。
特点:
- Service 作用于哪些 Pod 是通过标签选择器来定义的。
- 每个 Service 都有一个固定的虚拟 IP(Cluster IP),自动并且动态地绑定后端的 Pod,所有的网络请求直接访问 Service 的虚拟 IP,Service 会自动向后端做转发。
- Service 除了提供稳定的对外访问方式之外,还能起到负载均衡(Load Balance)的功能,自动把请求流量分布到后端所有的服务上,Service 可以做到对客户透明地进行水平扩展(scale)。
Ingress
Ingress 是 Kubernetes 集群的接入层,负责集群内外通讯。Ingress 是 Kubernetes 集群里工作在 OSI 网络参考模型下,第7层的应用,对外暴露的接口,典型的访问方式是 http/https。
特点:
- Service 只能进行第四层的流量调度,表现形式是 ip+port。Ingress 则可以调度不同业务域、不同 URL 访问路径的业务流量。
- 客户端请求通过 Ingress 转发到 Service,再由 Service 转发到 Pod。
Name
Name 是 Kubernetes 内部资源对象的标识符。每种资源对象都应该有自己的名称,通常定义在资源的元数据信息里。在同一个 namespace 空间中必须是唯一的。
Namespace
Namespace 是为了把一个 Kubernetes 集群划分为若干个资源不可共享的虚拟集群组而诞生的。不同 Namespace 内的资源名称可以相同,相同 Namespace 内的同种资源,名称不能相同。
特点:
- 合理的使用 Kubernetes 的 Namespace,可以使得集群管理员能够更好的对交付到 Kubernetes 里的服务进行分类管理和浏览。
- Kubernetes 里默认存在的 Namespace 有:default、kube-system、kube-public 等。
- 查询 Kubernetes 里特定资源要带上相应的 Namespace。
Minikube
Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
部署地址:
Kubeadmin
Kubeadmin也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相对简单。
二进制安装部署
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#根据规划设置主机名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02#在master添加hosts
cat >> /etc/hosts << EOF
192.168.192.80 master01
192.168.192.60 node01
192.168.192.70 node02
EOF
#调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
//所有 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
yum install -y docker-ce docker-ce-cli containerd.io
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
etcd 作为服务发现系统,有以下的特点:
简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
安全:支持SSL证书验证
快速:单实例支持每秒2k+读操作
可靠:采用raft算法,实现分布式系统数据的可用性和一致性
etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信(这两个端口已经被IANA(互联网数字分配机构)官方预留给etcd)。 即etcd默认使用2379端口对外为客户端提供通讯,使用端口2380来进行服务器间内部通讯。
etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。
---------- 准备签发证书环境 ----------
CFSSL 是 CloudFlare 公司开源的一款 PKI/TLS 工具。 CFSSL 包含一个命令行工具和一个用于签名、验证和捆绑 TLS 证书的 HTTP API 服务。使用Go语言编写。
CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:
1、client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
2、server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
3、peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。
这里全部都使用同一套证书认证。
//在 master01 节点上操作
#准备cfssl证书生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl*
cfssl:证书签发的工具命令
cfssljson:将 cfssl 生成的证书(json格式)变为文件承载式证书
cfssl-certinfo:验证证书的信息
cfssl-certinfo -cert <证书名称> #查看证书的信息
生成Etcd证书
mkdir /opt/k8s
cd /opt/k8s/
#上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中
chmod +x etcd-cert.sh etcd.sh
#创建用于生成CA证书、etcd 服务器证书以及私钥的目录
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
#上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
https://blog.csdn.net/Jin_0612_/article/details/etcd.sh etcd01 192.168.192.80 etcd02=https://192.168.192.60:2380,etcd03=https://192.168.192.70:2380
#进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
#可另外打开一个窗口查看etcd进程是否正常
ps -ef | grep etcd
#把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ root@192.168.192.60:/opt/
scp -r /opt/etcd/ root@192.168.192.70:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.192.60:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.192.70:/usr/lib/systemd/system/
//在 node01 节点上操作
vim /opt/etcd/cfg/etcd
#启动etcd服务
systemctl start etcd
systemctl enable etcd systemctl enable --now etcd
systemctl在enable、disable、mask子命令里面增加了--now选项,可以激活同时启动服务,激活同时停止服务等。systemctl status etcd
//在 node02 节点上操作
vim /opt/etcd/cfg/etcd
#启动etcd服务
systemctl start etcd
systemctl enable etcd
systemctl status etcd
#检查etcd群集状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.192.80:2379,https://192.168.192.,https://192.168.192.70:2379" endpoint health --write-out=table
--cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
cluster-health:检查etcd集群的运行状况
//在 master01 节点上操作
#上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#创建用于生成CA证书、相关组件的证书和私钥的目录
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
https://blog.csdn.net/Jin_0612_/article/details/k8s-cert.sh #生成CA证书、相关组件的证书和私钥
#上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
#复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权
cd /opt/k8s/
vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
chmod +x token.sh
https://blog.csdn.net/Jin_0612_/article/details/token.sh
#二进制文件、token、证书都准备好后,开启 apiserver 服务
cd /opt/k8s/
https://blog.csdn.net/Jin_0612_/article/details/apiserver.sh 192.168.192.80 https://192.168.192.80:2379,https://192.168.192.60:2379,https://192.168.192.70:2379
netstat -natp | grep 6443 #安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证
#启动 scheduler 服务
cd /opt/k8s/
https://blog.csdn.net/Jin_0612_/article/details/scheduler.sh
ps aux | grep kube-scheduler
#启动 controller-manager 服务
https://blog.csdn.net/Jin_0612_/article/details/controller-manager.sh
ps aux | grep kube-controller-manager
#通过kubectl工具查看当前集群组件状态
kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
//在所有 node 节点上操作
#创建kubernetes工作目录
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
//在 master01 节点上操作
#把 kubelet、kube-proxy 拷贝到 node 节点
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.192.60:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.192.70:/opt/kubernetes/bin/
#上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。
mkdir /opt/k8s/kubeconfigcd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
https://blog.csdn.net/Jin_0612_/article/details/kubeconfig.sh 192.168.192.80 /opt/k8s/k8s-cert/
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.192.60:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.192.70:/opt/kubernetes/cfg/
//在 node01 节点上操作
#启动 kubelet 服务
cd /opt/
https://blog.csdn.net/Jin_0612_/article/details/kubelet.sh 192.168.10.18
ps aux | grep kubelet
//在 master01 节点上操作,通过 CSR 请求
#检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 12s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
#Approved,Issued 表示已授权 CSR 请求并签发证书
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 2m5s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
#查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady
kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.192.60 NotReady <none> 108s v1.20.11
// node2与node1相同操作
//在 node01 节点上操作
#加载 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
#启动proxy服务
cd /opt/
https://blog.csdn.net/Jin_0612_/article/details/proxy.sh 192.168.192.60
ps aux | grep kube-proxy
//在 node01 节点上操作
#上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
cd /opt/
docker load -i flannel.tar
//在 master01 节点上操作
#上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
kubectl apply -f kube-flannel.yml
到此这篇kubelet的作用(kubelet csi)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-hjtc7 1/1 Running 0 7skubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.10.18 Ready <none> 81m v1.20.11
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/30794.html