kubernetes 集群搭建(二进制方式)
Kubernetes 作为当今最流行的容器编排平台,提供了强大的功能来管理和扩展容器化应用。除了使用 kubeadm
等工具简化集群的创建过程外,直接通过二进制文件安装 Kubernetes 组件也是一种常见的方法。这种方式给予用户更多的控制权,并且适用于那些希望深入理解 Kubernetes 内部工作原理的人。本文将详细介绍如何通过二进制方式搭建一个功能齐全的 Kubernetes 集群,并分享一些实用技巧和注意事项。
准备工作
在开始之前,请确保您的环境满足以下条件:
- 操作系统:支持的操作系统包括 Ubuntu、CentOS 等主流 Linux 发行版。
- 硬件要求:至少两台机器(一台作为 Master 节点,另一台或更多作为 Worker 节点),每台机器建议配置至少 2GB RAM 和 2 CPU 核心。
- 网络连接:所有节点之间需要能够互相通信,最好是在同一个局域网内。
- 时间同步:确保所有节点的时间一致,可以安装 NTP 服务来自动同步时间。
- 防火墙设置:根据实际情况调整防火墙规则,允许必要的端口访问(如 6443, 2379-2380, 10250, 10251, 10252 等)。
安装依赖项
在所有节点上执行如下命令以更新软件包列表并安装必要的依赖项:
Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
CentOS
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安装 Docker(使用国内镜像源)
为了加快 Docker 的安装速度,我们将使用阿里云提供的 Docker 源。
Ubuntu/Debian
# 添加阿里云 Docker 源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
CentOS
# 创建或编辑 /etc/yum.repos.d/docker-ce.repo 文件
cat <<EOF | sudo tee /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/\$releasever/\$basearch/stable
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
sudo yum makecache fast
sudo yum install -y docker-ce
启动并启用 Docker 服务:
sudo systemctl start docker
sudo systemctl enable docker
下载 Kubernetes 组件
接下来,在所有节点上下载所需的 Kubernetes 组件(kubelet
、kubectl
、kubeadm
)。虽然我们这里不使用 kubeadm
来初始化集群,但是它仍然可以用于某些辅助操作。我们将从官方 GitHub 发布页面获取这些组件的二进制文件。
下载二进制文件
假设我们要部署 Kubernetes v1.26.0 版本,可以根据官方文档找到对应的发布地址,并下载相应的 tarball 文件。然后解压并将可执行文件放置到 /usr/local/bin
目录下:
# 下载并解压 Kubernetes 二进制文件
wget https://dl.k8s.io/v1.26.0/kubernetes-server-linux-amd64.tar.gz
tar -xvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
sudo cp kubelet kubectl /usr/local/bin/# 设置正确的权限
sudo chmod +x /usr/local/bin/kubelet
sudo chmod +x /usr/local/bin/kubectl
对于 kubectl
,还可以选择将其配置为特定版本,以便与集群保持一致:
sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置 Master 节点
现在我们已经准备好配置 Master 节点了。请登录到您计划用作 Master 的服务器,并执行以下步骤:
初始化 etcd
etcd 是 Kubernetes 的键值存储数据库,用于保存集群状态信息。您可以选择安装独立的 etcd 实例或者使用静态 Pod 来运行 etcd。在这里我们将介绍如何使用静态 Pod 启动 etcd。
首先,创建一个名为 etcd.yaml
的文件来定义 etcd Pod 的配置:
apiVersion: v1
kind: Pod
metadata:name: etcdnamespace: kube-system
spec:hostNetwork: truecontainers:- name: etcdimage: quay.io/coreos/etcd:v3.5.0command:- "/usr/local/bin/etcd"- "--data-dir"- "/var/lib/etcd"- "--advertise-client-urls"- "http://127.0.0.1:2379"- "--listen-client-urls"- "http://0.0.0.0:2379"- "--initial-advertise-peer-urls"- "http://127.0.0.1:2380"- "--listen-peer-urls"- "http://0.0.0.0:2380"- "--initial-cluster"- "default=http://127.0.0.1:2380"- "--initial-cluster-token"- "etcd-cluster-0"- "--initial-cluster-state"- "new"volumeMounts:- mountPath: /var/lib/etcdname: etcd-storagevolumes:- hostPath:path: /var/lib/etcdname: etcd-storage
保存后,使用 kubectl
应用此配置:
kubectl apply -f etcd.yaml --kubeconfig=/etc/kubernetes/admin.conf
配置 API Server
接下来是配置 API Server。同样地,我们需要编写一个 YAML 文件来描述 API Server 的配置。以下是 apiserver.yaml
的示例内容:
apiVersion: v1
kind: Pod
metadata:name: kube-apiservernamespace: kube-system
spec:hostNetwork: truecontainers:- name: kube-apiserverimage: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.0command:- "/usr/local/bin/kube-apiserver"- "--etcd-servers=http://127.0.0.1:2379"- "--service-cluster-ip-range=10.96.0.0/12"- "--insecure-bind-address=0.0.0.0"- "--secure-port=6443"- "--allow-privileged=true"- "--advertise-address=<MASTER_IP>"- "--authorization-mode=Node,RBAC"- "--enable-admission-plugins=NodeRestriction"- "--tls-cert-file=/etc/kubernetes/pki/apiserver.crt"- "--tls-private-key-file=/etc/kubernetes/pki/apiserver.key"- "--client-ca-file=/etc/kubernetes/pki/ca.crt"- "--service-account-key-file=/etc/kubernetes/pki/sa.pub"- "--service-account-signing-key-file=/etc/kubernetes/pki/sa.key"- "--service-account-issuer=https://kubernetes.default.svc.cluster.local"- "--service-account-api-audiences=api"- "--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt"- "--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key"- "--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt"- "--requestheader-allowed-names=front-proxy-client"- "--requestheader-extra-headers-prefix=X-Remote-Extra-"- "--requestheader-group-headers=X-Remote-Group"- "--requestheader-username-headers=X-Remote-User"- "--kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt"- "--kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key"- "--enable-bootstrap-token-auth=true"- "--token-auth-file=/etc/kubernetes/pki/tokens.csv"- "--audit-log-maxage=30"- "--audit-log-maxbackup=3"- "--audit-log-maxsize=100"- "--audit-log-path=/var/log/kube-apiserver/audit.log"volumeMounts:- mountPath: /etc/kubernetes/pkiname: pki- mountPath: /var/log/kube-apiservername: audit-logvolumes:- hostPath:path: /etc/kubernetes/pkiname: pki- hostPath:path: /var/log/kube-apiservername: audit-log
请注意替换 <MASTER_IP>
为实际 Master 节点的 IP 地址。此外,还需要提前生成所需的证书和密钥文件,这可以通过 cfssl
工具来完成。具体步骤可以参考官方文档。
配置其他控制平面组件
除了 API Server 和 etcd 外,Kubernetes 控制平面还包括 Scheduler 和 Controller Manager。它们也可以通过静态 Pod 的方式来配置。这里不再赘述详细的配置文件,因为其结构与上述类似,只是命令参数有所不同。
启动控制平面组件
当所有的控制平面组件配置完毕后,可以使用 kubectl
来启动它们:
kubectl apply -f <component>.yaml --kubeconfig=/etc/kubernetes/admin.conf
等待几分钟直到所有组件都成功启动。
安装 Pod 网络插件
Kubernetes 需要一个 CNI (Container Network Interface) 插件来为 Pods 提供网络连接。有许多不同的 CNI 实现可供选择,例如 Flannel、Calico 等。在这里我们将使用 Flannel 作为示例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
等待几分钟直到所有的 Pod 都变为 Running 状态。
加入 Worker 节点
当 Master 节点成功配置并且 Pod 网络插件已安装后,就可以让其他节点加入集群了。回到 Master 节点上,使用 kubeadm token create
命令生成一个新的加入令牌,然后在每个 Worker 节点上运行如下命令来加入集群:
kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
注意,这个 token 是有时效性的,默认有效期为24小时,如果过期可以重新生成新的 token。
验证集群状态
最后,我们可以使用 kubectl get nodes
来查看当前集群中的所有节点及其状态。理想情况下,你应该看到 Master 和所有 Worker 节点都处于 Ready 状态。
kubectl get nodes
此外,还可以检查 Pod 和 Service 是否正常工作:
kubectl get pods --all-namespaces
kubectl get services --all-namespaces
注意事项
尽管通过二进制方式安装 Kubernetes 提供了更大的灵活性,但在实际应用中也要注意以下几点:
- 安全性:确保正确设置了 RBAC 规则、网络策略等安全措施,防止潜在的安全漏洞。
- 性能优化:合理配置资源限制和请求,避免不必要的浪费或争用。
- 备份恢复:定期备份 etcd 数据库和其他重要配置文件,以便于灾难恢复。
- 监控告警:集成 Prometheus、Grafana 等监控工具,实时掌握集群健康状况。
- 日志管理:采用 ELK Stack 或其他日志聚合方案来集中收集和分析日志信息。
结语
感谢您的阅读!如果您对 Kubernetes 或者二进制方式搭建集群有任何疑问或见解,欢迎继续探讨。
相关文章:
kubernetes 集群搭建(二进制方式)
Kubernetes 作为当今最流行的容器编排平台,提供了强大的功能来管理和扩展容器化应用。除了使用 kubeadm 等工具简化集群的创建过程外,直接通过二进制文件安装 Kubernetes 组件也是一种常见的方法。这种方式给予用户更多的控制权,并且适用于那…...

linux平台RTMP|RTSP播放器如何回调SEI数据?
我们在对接Linux平台RTMP|RTSP播放的时候,有遇到这样的技术需求,合作企业在做无人机视觉分析场景的时候,除了需要低延迟的拿到解码后的RGB|YUV数据,然后投递给他们自己的视觉算法处理模块外,还需要播放器支持SEI的回调…...
Vue uni-app免手动import
unplugin-auto-import 是一个流行的 JavaScript/TypeScript 插件,可以自动导入常用的库、API 或自定义函数,减少手动书写 import 语句的繁琐操作。它常用于 Vue、React 等框架,帮助开发者提高效率和减少样板代码。 核心功能: 自…...
7. 计算机视觉
计算机视觉(Computer Vision,简称 CV)是人工智能(AI)领域中的一个重要分支,旨在使计算机能够像人类一样“看”并理解数字图像或视频。它结合了计算机科学、数学、图像处理、模式识别、机器学习等多个学科&a…...
在服务器进行docker部署频繁提示permission denied
当你频繁遇到permission denied,证明当前用户的权限不够 可以参考如下操作: 1.创建用户组docker sudo groupadd docker把当前用户添加到docker用户组中 sudo usermod -aG docker $USER优点: 可以在不使用sudo的情况下运行docker命令...
c/c++ static
定义 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。修饰普通函数,表明函数的作…...
C#中System.Text.Json:从入门到精通的实用指南
一、引言 在当今数字化时代,数据的高效交换与处理成为软件开发的核心环节。JSON(JavaScript Object Notation)凭借其简洁、轻量且易于读写的特性,已然成为数据交换领域的中流砥柱。无论是前后端数据交互,还是配置文件…...

内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)
内存故障原因与诊断 您是否曾遇到过电脑无法启动、黑屏、死机,或者系统卡顿的情况?这些问题看起来很复杂,实际上大多数都是内存故障引起的。内存是电脑的核心组成部分之一,任何小东西问题都可能导致系统死机,严重时甚…...

[操作系统] 进程状态详解
在操作系统中,进程是程序执行的基本单位,操作系统负责管理进程的生命周期。为了高效地管理进程,操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kerne…...

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…...

【Maui】下拉框的实现,绑定键值对
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MA…...

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)
Profiles Profile 是一个以名称标识的集合,用于管理 密码 和 资源限制。 每个用户都对应一个profiles,可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…...

C语言:位段
位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char (属于整形家族)类型 2. 位段的空间上是按照需要以4个字节( 类型 int )或者1个字节( char )的方式来开辟的。 3. 位段涉及…...

MPLS VPN 原理与配置
一.简介 MPLS,称之为多协议标签交换,在九十年代中期被提出来,用于解决传统IP报文依赖查表转发而产生的瓶颈,现多用于VPN技术,MPLS报头封装在数据链路层之上,网络层之下。本文为结合了华为技术和新华三技术…...

稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应
三菱PLC与AGV机器人搬运车通过稳联技术协议转换网关建立通信 一、现场情况概述 - 三菱PLC:使用CC-Link IE协议进行通信。 - AGV机器人搬运车:使用Modbus TCP协议进行通信。 - 协议转换网关:使用稳联技术的协议转换网关将PLC和AGV连接…...
Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences
Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路2. 代码实现 题目链接:3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路 这一题不需要连续性,因此我们就是考虑取得子串长度为别为1…...
第2章:Python TDD构建Dollar类基础
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
【算法学习笔记】34:扩展欧几里得算法
裴蜀定理 描述 对于任意正整数 a a a、 b b b,一定存在整数系数 x x x, y y y,使得: a x b y g c d ( a , b ) ax by gcd(a, b) axbygcd(a,b) 并且 g c d ( a , b ) gcd(a, b) gcd(a,b)是对于任意的系数 x x x和 y y y放在…...
云原生周刊:K8s 生产环境架构设计及成本分析
开源项目推荐 KubeZoneNet KubeZoneNet 旨在帮助监控和优化 Kubernetes 集群中的跨可用区(Cross-Zone)网络流量。这个项目提供了一种简便的方式来跟踪和分析 Kubernetes 集群中跨不同可用区的通信,帮助用户优化集群的网络架构、提高资源利用…...

WGAN - 瓦萨斯坦生成对抗网络
1. 背景与问题 生成对抗网络(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分:生成器(Generator)和判别器(Discriminator)…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...