搭建Kubernetes容器集群管理系统
1、Kubernetes 概述
Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、劢态扩缩容等功能套件。 基于容器的云平台
Kubernetes 基于 docker 容器的云平台,简写成: k8s 。
openstack 基于 kvm 虚拟机云平台
官网:https://kubernetes.io/
Kubernetes 的架构设计图:
2、Kubernetes 常见组件介绍
1、master: kubernetes 管理结点
2、apiserver : 提供接口服务,用户通过 apiserver 来管理整个容器集群平台。API Server 负责和 etcd 交互(其他组件丌会直接操作 etcd,只有 API Server 这么做),整个 kubernetes 集群的所有的交互都是以 API Server 为核心的。
如:A、所有对集群迚行的查询和管理都要通过 API 来进行 2、所有模块之间并不会互相调用,而是通过和 API Server 打交道来完成自己那部分的工作 、API Server提供的验证和授权保证了整个集群的安全
3、scheduler kubernetes:调度服务
4、Replication Controllers:复制,保证 pod 的高可用。
Replication Controller 是 Kubernetes 系统中最有用的功能,实现复制多个 Pod 副本,往往一个应用需要多个 Pod 来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过 Replication Controller 可以保证在其它宿主机吭用同等数量的 Pod。Replication Controller 可以通过 repcon 模板来创建多个 Pod 副本,同样也可以直接复制已存在 Pod,需要通过 Label selector 来
关联。
接下介绍,从下往上说,从你最熟悉的知识开始
5、minion : 真正运行容器 container 的物理机。 kubernets 中需要很多 minion 机器,来提供运算。
6、container : 容器 ,可以运行服务和程序
7、Pod :在 Kubernetes 系统中,调度的最小颗粒丌是单纯的容器,而是抽象成一个 Pod,Pod是一个可以被创建、销毁、调度、管理的最小的部署单元。pod 中可以包括一个戒一组容器。
8、Kube_proxy 代理 做端口转发,相当于 LVS-NAT 模式中的负载调度器器
Proxy 解决了同一宿主机,相同服务端口冲突的问题,还提供了对外服务的能力,Proxy 后端使用了随机、轮循负载均衡算法。
8、etcd etcd 存储 kubernetes 的配置信息,可以理解为是 k8s 的数据库,存储着 k8s 容器云平台中所有节点、pods、网络等信息。
互动: linux 系统中/etc 目录作用什么,存配置文件。 所以 etcd(daemon)是一个存储配置文件的后台服务。
接下几个名词不在图片中
9、Services : Services 是 Kubernetes 最外围的单元,通过虚拟一个访问 IP 及服务端口,可以访问我们定义好的 Pod 资源,目前的版本是通过 iptables 的 nat 转发来实现,转发的目标端口为Kube_proxy 生成的随机端口。
10、Labels 标签
Labels 是用于区分 Pod、Service、Replication Controller 的 key/value 键值对,仅使用在Pod、Service、 Replication Controller 之间的关系识别,但对这些单元本身迚行操作时得使用 name标签。
11、Deployment Deployment [dɪ ɪ'pl ɔɪmə ənt] 部署
Kubernetes Deployment 用于更新 Pod 和 Replica Set(下一代的 Replication Controller)的方法,你可以在 Deployment 对象中只描述你所期望的理想状态(预期的运行状态),Deployment 控制器会将现在的实际状态转换成期望的状态。例如,将所有的 webapp:v1.0.9 升级成 webapp:v1.1.0,只需创建一个 Deployment,Kubernetes 会按照 Deployment 自劢迚行升级。通过 Deployment 可以用来创建新的资源。如:pod,替换已经存在的资源等。
Deployment 可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。
12、Kubelet : Kubelet 和 Kube-proxy 都运行在 minion 节点上。
Kube-proxy 实现 Kubernetes 网络相关内容。
Kubelet 组件管理 Pod、Pod 中容器及容器的镜像和卷等信息。
总结: 总结各组件之间的关系
1、Kubernetes的架构由一个master和多个minion组成,master通过api提供服务,接受kubectl的请求来调度管理整个集群。 kubectl: 是 k8s 平台的一个管理命令。
2、Replication controller 定义了多个 pod 戒者容器需要运行,如果当前集群中运行的 pod 或容器达不到配置的数量,replication controller 会调度容器在多个 minion 上运行,保证集群中的 pod 数量。
3、service 则定义真实对外提供的服务,一个 service 会对应后端运行的多个 container。
4、Kubernetes 是个管理平台,minion 上的 proxy 拥有提供真实服务公网 IP。客户端访问kubernetes 中提供的服务,是直接访问到 kube-proxy 上的。
5、在 Kubernetes 中 pod 是一个基本单元,一个 pod 可以是提供相同功能的多个 container,这些容器会被部署在同一个 minion 上。minion 是运行 Kubelet 中容器的物理机。minion 接受 master的指令创建 pod 或者容器。
3、搭建 Kubernetes 容器集群管理系统
1.平台版本说明:
节点角色 IP 地址 CPU 内存
master 192.168.10.71 4 核 1GB
node1(minion1) 192.168.10.72 4 核 1GB
node2(minion2) 192.168.10.73 4 核 1GB
etcd 192.168.10.74 4 核 1GB
注: 正常需要 4 台机器,如果你内存不够,master 和 etcd 可以运行在同一台机器上。
2.系统的配置(所有机器)
关闭selinux
1 2 3 4 5 | # 临时关闭 $ setenforce 0 # 永久关闭 $ vim /etc/selinux/config SELINUX=disabled |
关闭且禁用防火墙
1 2 | $ systemctl stop firewalld $ systemctl disable firewalld |
修改hostname
1 2 3 4 5 6 7 | vi /ect/hostname # 四台机器分别修改为 master node1 node2 etcd |
修改hosts文件
1 2 3 4 5 6 7 8 | $ vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.71 master 192.168.10.72 node1 192.168.10.73 node2 192.168.10.74 etcd |
更新yum
1 | $ yum update -y |
安装相关组件
1 | $ yum install -y etcd kubernetes ntp flannel |
3.etcd服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 修改配置文件 $ vim /etc/etcd/etcd .conf ETCD_NAME=default ETCD_DATA_DIR= "/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS= "http://localhost:2379,http://192.168.10.74:2379" ETCD_ADVERTISE_CLIENT_URLS= "http://192.168.10.74:2379" # 启动服务 $ systemctl start etcd $ systemctl enable etcd #检查etcd cluster状态 $ etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http: //192 .168.10.74:2379 cluster is healthy # 设置一个key,下面会用到 etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}' |
4.master服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 配置kube-apiserver配置文件 $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR= "--logtostderr=true" KUBE_LOG_LEVEL= "--v=0" KUBE_ALLOW_PRIV= "--allow-privileged=false" KUBE_MASTER= "--master=http://192.168.10.71:8080" $ vim /etc/kubernetes/apiserver KUBE_API_ADDRESS= "--insecure-bind-address=0.0.0.0" KUBE_ETCD_SERVERS= "--etcd-servers=http://192.168.10.74:2379" KUBE_SERVICE_ADDRESSES= "--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL= "--admission-control=AlwaysAdmit" KUBE_API_ARGS= "" #配置kube-scheduler配置文件,此处可以不需要配置 vim /etc/kubernetes/scheduler KUBE_SCHEDULER_ARGS= "--address=0.0.0.0" # 启动服务 systemctl start kube-apiserver kube-controller-manager kube-scheduler systemctl enable kube-apiserver kube-controller-manager kube-scheduler systemctl status kube-apiserver kube-controller-manager kube-scheduler |
5.node1节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 配置node1网络 $ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS= "http://192.168.10.74:2379" FLANNEL_ETCD_PREFIX= "/k8s/network" FLANNEL_OPTIONS= "--iface=ens33" # ens是当前可用上网的网卡名称,此处是多个网卡时需要指定,不然不需要指定 # 配置node1 kube-proxy $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR= "--logtostderr=true" KUBE_LOG_LEVEL= "--v=0" KUBE_ALLOW_PRIV= "--allow-privileged=false" KUBE_MASTER= "--master=http://192.168.10.71:8080" # 配置node1 kubelet $ vim /etc/kubernetes/kubelet KUBELET_ADDRESS= "--address=127.0.0.1" KUBELET_HOSTNAME= "--hostname-override=node1" KUBELET_API_SERVER= "--api-servers=http://192.168.10.71:8080" KUBELET_POD_INFRA_CONTAINER= "--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS= "" # 启动node1服务 systemctl start flanneld kube-proxy kubelet systemctl enable flanneld kube-proxy kubelet systemctl status flanneld kube-proxy kubelet |
6.node2节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 配置node2网络 $ vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS= "http://192.168.10.74:2379" FLANNEL_ETCD_PREFIX= "/k8s/network" FLANNEL_OPTIONS= "--iface=ens33" # ens是当前可用上网的网卡名称,此处是多个网卡时需要指定,不然不需要指定 # 配置node2 kube-proxy $ vim /etc/kubernetes/config KUBE_LOGTOSTDERR= "--logtostderr=true" KUBE_LOG_LEVEL= "--v=0" KUBE_ALLOW_PRIV= "--allow-privileged=false" KUBE_MASTER= "--master=http://192.168.10.71:8080" # 配置node2 kubelet $ vim /etc/kubernetes/kubelet KUBELET_ADDRESS= "--address=127.0.0.1" KUBELET_HOSTNAME= "--hostname-override=node1" KUBELET_API_SERVER= "--api-servers=http://192.168.10.71:8080" KUBELET_POD_INFRA_CONTAINER= "--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS= "" # 启动node1服务 systemctl start flanneld kube-proxy kubelet systemctl enable flanneld kube-proxy kubelet systemctl status flanneld kube-proxy kubelet |
7.测试
1 2 3 4 | [root@xuegod71 ~] # kubectl get nodes NAME STATUS AGE node1 Ready 19s node2 Ready 18s |
详细可以参考:https://www.cnblogs.com/byron0918/p/8728876.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南