零基础搭建 Kubernetes 集群

零基础搭建 Kubernetes 集群

1、简介

在数字化时代,容器技术已经变成了软件开发和部署的标准,而在众多容器管理工具中,Kubernetes(简称为 K8s)凭借其高效的资源管理、弹性伸缩和自我修复的能力,成为了行业内的佼佼者。

Kubernetes 基础概念
Kubernetes 是一个开源平台,它允许你以容器为单位,自动部署、扩展及管理应用程序。想象一下,如果你的应用突然火了,流量激增,Kubernetes 可以自动帮你扩展服务;而当流量减少时,它也会智能缩减资源使用。

&nbsp

为什么选择 Kubernetes

  • 自动化容器部署:自动化的容器部署和回滚机制,让你的服务始终在线。
  • 弹性伸缩:根据流量和负载自动调整资源使用。
  • 服务发现和负载均衡:不需要额外的负载均衡器,Kubernetes 会自动分配网络流量。
  • 自我修复:它会自动替换、重启、重新调度失败的容器。

集群的重要性及其作用
在 K8s 世界里,“集群”是核心概念,一个 K8s 集群由一组工作节点和控制节点组成。
工作节点负责运行容器应用,而控制节点管理工作节点和 Kubernetes 集群的各种操作。

2、准备工作

在开始搭建 Kubernetes 集群之前,我们需要确保所有的前置条件都已满足。

硬件要求

  • Master 节点至少需要 2 vCPU 和 2GB 内存。
  • Worker 节点至少需要 1 vCPU 和 1GB 内存。
  • 网络应该允许节点之间、节点与外部互联网的通信。

环境要求

  • 选择一个支持 Kubernetes 的操作系统,例如 Ubuntu 18.04/20.04、CentOS 7/8,或者是 RHEL 7/8。
  • 确保每个节点的系统时间同步。
  • 关闭 Swap 分区,因为 Kubernetes 推荐使用内存而不是 Swap。

必要的软件工具

  • kubectl:这是 Kubernetes 的命令行工具,让你可以与集群交流。
  • Docker:容器运行时,现在 Kubernetes 也支持其他的容器运行时,如 containerd 或 CRI-O。

现在,我们已经准备好了硬件和软件环境,接下来就是搭建集群的核心步骤了。

3、Kubernetes 集群架构

了解 Kubernetes 集群的架构对于我们搭建和维护集群至关重要。

&nbsp

Master 节点组件说明
Master 节点是集群控制的大脑,它负责整个集群的管理和决策。Master 节点主要包含以下几个关键组件:

  • API Server(kube-apiserver):集群的统一入口,所有的操作请求都会通过 API Server 进行。
  • Scheduler(kube-scheduler):负责调度 Pod 到合适的节点上。
  • Controller Manager(kube-controller-manager):负责管理控制器,处理集群内的常规任务。
  • etcd:保存了整个集群的状态,是所有配置信息和状态信息的存储所在。

Worker 节点组件说明
Worker 节点是集群中的劳动者,它们执行具体的任务,运行应用的容器。

  • kubelet:确保容器运行在 Pod 中。
  • kube-proxy:负责为 Service 提供网络代理。
  • 容器运行时:负责运行容器,Docker 是最常见的选择,但也可以是其他如 containerd 或 CRI-O。

etcd 存储集群状态
etcd 是一个高可用的键值存储,主要用于保存 Kubernetes 的所有数据,是集群的重要组成部分。

接下来我们将进入安装步骤,这是建立集群的最关键阶段。

4、安装步骤

搭建 Kubernetes 集群的第一步是设置 Master 节点。

设置您的 Master 节点

  • 安装 kubeadm、kubelet 和 kubectl

    # 更新系统
    sudo apt-get update && sudo apt-get upgrade -y
    # 安装传输工具
    sudo apt-get install -y apt-transport-https ca-certificates curl
    # 导入 Kubernetes 签名密钥
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    # 添加 Kubernetes APT 仓库
    echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    # 安装 kubeadm, kubelet 和 kubectl
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    # 标记这些包,防止它们被自动更新
    sudo apt-mark hold kubelet kubeadm kubectl
    
  • 初始化 Master 节点

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
    

    在这里,--pod-network-cidr 指定了 Pod 网络的范围,这个需要和稍后我们要安装的 Pod 网络插件的配置相匹配。

初始化完成后,你会得到一个 kubeadm join 命令,这个命令将被用来将新的 Worker 节点加入到集群中。

现在我们的 Master 节点已经设置好了,我们可以开始将 Worker 加入集群了。

将 Worker 节点加入集群

  • 准备 Worker 节点环境
    Worker 节点同样需要安装 Docker、kubelet、kubeadm。

  • 加入集群操作
    在每个 Worker 节点上运行之前在 Master 节点上得到的 kubeadm join 命令。

  • 确认节点加入成功
    回到 Master 节点上,运行以下命令查看所有节点的状态:

    kubectl get nodes
    

    这个命令会列出集群中所有的节点,并显示它们的状态。如果一切顺利,你应该能看到你的 Worker 节点状态为 Ready

    当然可以!假设你已经跟随上述步骤成功地将 Worker 节点加入到集群中,运行 kubectl get nodes 命令之后,你可能会看到类似于下面的输出:

    NAME        STATUS   ROLES    AGE   VERSION
    master      Ready    master   48m   v1.20.1
    worker-01   Ready    <none>   30m   v1.20.1
    worker-02   Ready    <none>   28m   v1.20.1
    

    这里面包含了几列信息:

    NAME: 节点的名字,通常是你在创建云实例时定义的名字或者是局域网内的主机名。

    STATUS: 显示 Ready 表示该节点已经准备好接受 Pods 的运行。

    ROLES: 显示节点的角色,比如 masterworker;如果为空,则默认为 worker

    AGE: 节点加入集群的时间。

    VERSION: 节点上运行的 Kubernetes 版本。

这个输出告诉我们,集群中有一个 Master 节点和两个 Worker 节点,它们都已经准备就绪,可以开始部署应用程序了,这样,我们的 Kubernetes 集群就算是搭建成功了!

&nbsp

5、部署Pod网络

让 Kubernetes 集群节点彼此通信的关键在于 Pod 网络,每个 Pod 都应该能够连接其他 Pod,无论它们在哪个节点上,为此,我们需要为集群安装一个网络插件。

选择合适的网络插件
有多种网络插件可供选择,例如 Calico、Flannel、Weave Net 等,每种插件都有自己的特点,你可以根据自己的需求选择合适的。

这里以 Calico 为例,部署命令可能如下:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

运行该命令后,集群会下载 Calico 组件并部署在集群中,命令执行成功后,你可能看不到立即的输出,但是你可以通过运行以下命令检查 Pod 网络的部署状态:

kubectl get pods --all-namespaces

这个命令会显示所有命名空间的 Pods,其中包括 Calico 网络插件的 Pods。如果一切正常,你将看到类似于以下的输出:

NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-xxxxxxxxxx-xxxxx   1/1     Running   0          5m
kube-system   calico-node-xxxxx                          1/1     Running   0          5m
kube-system   calico-node-yyyyy                          1/1     Running   0          5m
...

6、测试集群

为了验证我们的集群是否能够正常工作,我们可以部署一个简单的测试应用。

部署一个 NGINX 应用
尝试使用以下命令部署一个 NGINX 的 Deployment:

kubectl create deployment nginx --image=nginx

执行该命令后,Kubernetes 会创建一个名为 nginx 的 Deployment,并从 Docker Hub 拉取最新的 NGINX 镜像。这条命令的输出会是:

deployment.apps/nginx created

然后,你可以通过下面的命令检查 Pod 的状态:

kubectl get pods

在几秒钟之后,你应该会看到 NGINX Pod 的状态变为 Running

NAME                     READY   STATUS    RESTARTS   AGE
nginx-86c57db685-9vldk   1/1     Running   0          30s

部署 Service 来暴露应用

为了能够从集群外部访问这个 NGINX 应用,我们需要创建一个 Service:

kubectl expose deployment nginx --port=80 --type=NodePort

执行该命令后,Kubernetes 会创建一个 Service 来暴露 NGINX Deployment。这条命令的输出会是:

service/nginx exposed

使用以下命令查找暴露的 NGINX Service 的外部端口:

kubectl get service nginx

输出会显示 NodePort 的值,类似于:

NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.100.93.21    <none>        80:30820/TCP   115s

现在你可以通过服务分配的 NodePort,从集群外部通过 URL http://<Cluster-IP>:<NodePort> 来访问 NGINX 服务。

配置 Ingress 来进行路由

如果你希望使用域名和路径来访问应用,还可以配置 Ingress 来进行路由,这通常需要一个 Ingress 控制器和一个 Ingress 资源。
Ingress 控制器是集群中的一个 Pod,它负责实现 Ingress,通常用 NGINX 可以作为一个好选择,而 Ingress 资源定义了从外部请求到内部服务的访问规则。

你可以按照官方文档或社区提供的教程来设置你的 Ingress 控制器和资源。

现在,我们已经成功部署并测试了一个基本应用,这验证了我们的 Kubernetes 集群能够运行 Pod 并且对外提供服务。

7、搭建 Dashboard

Kubernetes Dashboard 是一个基于网页的 Kubernetes 用户界面。你可以用它来部署容器化应用到集群中,也可以对它们进行故障排除,以及管理集群资源。它允许用户配置和管理应用以及查看各种信息。

&nbsp

安装 Kubernetes Dashboard

首先,你需要部署 Dashboard UI。可以通过下面的命令来创建 Dashboard:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

运行命令后,系统可能不会立刻返回信息,但你可以运行下面的命令来检查 Dashboard 的部署状态:

kubectl get pods --namespace kubernetes-dashboard

等待所有的 Pods 状态为 Running。输出将类似于:

NAME                                         READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-78c79f97b4-6glb2        1/1     Running   0          2m
dashboard-metrics-scraper-7b59f7d4df-xb8xg   1/1     Running   0          2m

访问 Kubernetes Dashboard

为了访问 Dashboard,你将需要创建一个代理服务器。可以使用下面的命令:

kubectl proxy

这条命令会启动一个代理服务器,允许你通过浏览器直接访问 Dashboard。

现在,你可以在浏览器中输入以下 URL 来访问 Dashboard UI:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

默认情况下,你可能还需要一个令牌(Token)来登录。你可以通过以下命令来获取一个令牌:

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

复制返回的令牌,并在登录界面粘贴它以完成身份验证。

8、搭建注意事项

在搭建 Kubernetes 集群时,你需要注意一些事项:

  • 版本兼容性检查:确保你安装的 Kubernetes 版本与其他组件兼容,比如 Docker 或者网络插件。
  • 安全配置和最佳实践:使用 RBAC(基于角色的访问控制)来控制对集群资源的访问,并在 Pod 中实施安全的容器运行时实践。
  • 资源分配和管理:合理分配资源限制和请求,以保证 Pod 之间的资源分配公平,同时避免资源浪费。
  • 集群日志和监控:部署日志和监控工具如 Prometheus 和 Grafana,以跟踪集群的运行状况。

9、集群的维护和升级

集群的长期健康需要定期的维护和升级。

  • 集群的日常维护:包括监控集群健康、备份 etcd 数据以及清理不必要的资源。
  • 如何升级集群:你可以使用 kubeadm 来升级集群。这通常涉及升级 master 节点上的各种组件,然后逐个升级 worker 节点。

10、问题排查

当集群出现问题时,你需要知道如何进行排查。

  • 常见问题及解决方案:了解一些常见问题的解决方案,比如网络问题、资源不足或配置错误。
  • 如何查看日志和状态:使用 kubectl logs 查看 Pod 日志,使用 kubectl describe 查看 Pod 状态和相关事件。

11、总结

回顾整个搭建过程,从准备工作到问题排查,我们已经覆盖了搭建 Kubernetes 集群所需的所有基础知识。
随着你对 Kubernetes 的不断实践和学习,你将能够更加深入地理解其运作机制,并能更好地管理和维护你的集群。

学习路径推荐:

  • 深入学习 Kubernetes 的文档和案例。
  • 参加社区活动,如 Meetup 等。
  • 不断实践,通过不断的实验来加深对 Kubernetes 的理解。

推荐几个 Kubernetes 学习的文章

  • 01、Kubernetes学习-从零搭建K8S
  • 02、Kubernetes学习-了解k8s的基本组件与概念
  • 03、Kubernetes学习-Pod 的实现原理
  • 04、Kubernetes学习-Kubernetes Service 的实现原理
  • 05、Kubernetes学习-Kubernetes Volume详解
  • 06、Kubernetes学习-Kubernetes Namespace 详解
  • 07、Kubernetes学习-Kubernetes Deployment 的实现原理
  • 08、Kubernetes学习-Kubernetes StatefulSet 实现原理

搭建集群是一个复杂但有趣的过程,希望这篇文章对你有用,能帮助你顺利搭建并运行你自己的 Kubernetes 集群。

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程、分布式运行用例

python多线程 threading模块 多线程实例 # -*- coding: utf-8 -*- # Time : 2024/2/7 15:50 # Author : 居里夫人吃橘子 # File : class01.py # Software: PyCharm import threading from time import sleepdef run(name):print(name 该起床了)sleep(2)print(name …

Linux CentOS系统安装SQL Server并结合内网穿透实现公网访问本地数据

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Ubuntu在终端编辑完配置文件怎么保存退出?

1.退出&#xff0c;按【Ctrlx】&#xff0c;回车键。 2.保存&#xff0c;则先按【Ctrlo】&#xff0c;回车键&#xff0c;再按【Ctrlx】退出

小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】

1025 除数游戏 小艾 和 小鲍 轮流玩游戏&#xff0c;小艾首先开始。 最初&#xff0c;黑板上有一个数字 n 。在每个玩家的回合中&#xff0c;该玩家做出的动作包括&#xff1a; 选择任意 x&#xff0c;使 0 < x < n 和 n % x 0 。将黑板上的数字 n 替换为 n - x 。 此…

Dom节点继承树基本操作

遍历节点树 基于元素节点树的遍历 parcntElcrmcnt -> 返回当前元素的父元秦节点 (IE不兼容)children ->只返回当前元素的元素子节点node.childFlement(ount nodechildren.length当前元素节点的子元素(IE不兼容)firstElementChild->返回的是第一个元素节点(IE不兼容)l…

IDEA-常用插件

1、Mybatis Log Free 当我们使用mybatis log在控制台输出sql 内容&#xff0c;输出内容将语句与参数分开打印&#xff0c;还需要手动将参数替换到指定位置。 使用对应插件后&#xff0c;自动将输出内容组装成完整的可直接执行的SQL 在插件市场 查看对应名称&#xff0c;并安装。…

【数据结构】图的存储与遍历

图的概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E) 图分为有向图和无向图 在有向图中&#xff0c;顶点对<x, y>是有序的&#xff0c;顶点对<x&#xff0c;y>称为顶点x到顶点y的一条边(弧)&#xff0c;<x, y>和&l…

基于微信小程序的校园跑腿系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

IDEA无法下载源代码(Maven无法下载源代码)

问题 这两天在突击SpringBoot&#xff0c;按ctrl打开一个SpringBoot的类想要下载源代码&#xff0c;居然下载不了&#xff0c;右下角弹窗提示无法下载源代码 百度查了查&#xff0c;在本地仓库里下载失败的目录下有个.lastUpdate的文件记录了一些信息 #NOTE: This is a Maven…

算法沉淀——BFS 解决最短路问题(leetcode真题剖析)

算法沉淀——BFS 解决最短路问题&#xff08;leetcode真题剖析&#xff09; 01.迷宫中离入口最近的出口02.最小基因变化03.单词接龙04.为高尔夫比赛砍树 BFS&#xff08;广度优先搜索&#xff09;是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来…

特征提取匹配方案不止SuperPoint

局部特征匹配在计算机视觉领域广泛应用&#xff0c;涵盖图像检索、3D重建和目标识别等领域。然而&#xff0c;由于视点和光照变化等因素&#xff0c;改进匹配的准确性和鲁棒性仍然面临挑战。近年来&#xff0c;深度学习模型的引入引发了对局部特征匹配技术的广泛探索。这些方法…

莱卡云怎么样?简单测评下莱卡云韩国CN2云服务器

莱卡云服务器厂商&#xff0c;国内持证企业服务器商家&#xff0c;运作着香港、美国、韩国、镇江、日本、绍兴、枣庄、等数据中心的云服务器、独立服务器出租、设备托管、CDN等业务。今天为大家带来的是莱卡云韩国CN2服务器的详细评测&#xff0c;该云服务器的数据中心位于韩国…

外汇天眼:Monex计划重新任命八位现任董事,并任命三位新董事

Monex Group, Inc. 今日宣布&#xff0c;公司的提名委员会已决定在2024年6月举行的第20届股东年度大会上提议任命多位候选人加入董事会。 尽管公司认为现任董事熟悉其业务&#xff0c;因此目前尚不是替换他们的时机&#xff0c;但鉴于运营环境的显著变化和管理决策日益困难&…

显微测量|共聚焦显微镜大倾角超清纳米三维显微成像

用于材料科学领域的共聚焦显微镜&#xff0c;基于光学共轭共焦原理&#xff0c;其超高的空间分辨率和三维成像能力&#xff0c;提供了全新的视角和解决方案。 工作原理 共聚焦显微镜通过在样品的焦点处聚焦激光束&#xff0c;在样品表面进行快速点扫描并逐层获取不同高度处清…

与时共进,芯芯向荣丨纷享销客获时创意“最佳合作伙伴”表彰

近日&#xff0c;时创意存储产业园封顶仪式暨成立十五周年庆典在深圳圆满举行。本次盛典以“创意有时 芯芯向RONG”为主题&#xff0c;时创意董事长倪黄忠携全体员工&#xff0c;与政府嘉宾、产业伙伴等1200余人济济一堂&#xff0c;纷享销客也共襄盛举&#xff0c;并荣获【20…

element 表单提交图片(表单上传图片)

文章目录 使用场景页面效果前端代码 使用场景 vue2 element 表单提交图片   1.点击【上传图片】按钮择本地图片&#xff08;只能选择一张图片&#xff09;后。   2.点击图片&#xff0c;支持放大查看。   3.点击【保存】按钮&#xff0c;提交表单。 页面效果 前端代码…

【Jvm】运行时数据区域(Runtime Data Area)原理及应用场景

文章目录 前言&#xff1a;Jvm 整体组成 一.JDK的内存区域变迁Java8虚拟机启动参数 二.堆0.堆的概念1.堆的内存分区2.堆与GC2.1.堆的分代结构2.2.堆的分代GC2.3.堆的GC案例2.4.堆垃圾回收方式 3.什么是内存泄露4.堆栈的区别5.堆、方法区 和 栈的关系 三.虚拟机栈0.虚拟机栈概念…

TrustGeo框架代码构成

该存储库提供了TrustGeo框架的原始PyTorch实现。 一、基础用法 1、需求 Requirements 代码使用python 3.8.13、PyTorch 1.12.1、cudatoolkit 11.6.0和cudnn 7.6.5进行了测试。通过Anaconda安装依赖: # create virtual environment conda create --name TrustGeo python=3.8.…

【C++之语法篇002】

C学习笔记---002 C知识语法篇1、缺省参数1.1、什么是缺省参数?1.2、缺省参数分类1.3、缺省参数的总结 2、函数重载2.1、什么是函数重载?2.2、C支持函数重载?2.3、那么对于函数重载&#xff0c;函数名相同该如何处理?2.4、那么C是如何支持重载&#xff1f; 3、引用3.1、什么…

QGis软件 —— 3、QGis创建形状图层点、通过xlsx及csv加载点

(方式一 ) 通过QGis创建形状图层点 1、如下gif&#xff0c;演示了创建形状图层 2、如下gif&#xff0c;演示了在高德地图上&#xff0c;形状图层上添加点 3、如下gif&#xff0c;演示了对形状图层点查看详细信息 4、如下gif&#xff0c;演示了对形状图层点查看属性表&#xff0…