零基础搭建 Kubernetes 集群
1、简介
在数字化时代,容器技术已经变成了软件开发和部署的标准,而在众多容器管理工具中,Kubernetes(简称为 K8s)凭借其高效的资源管理、弹性伸缩和自我修复的能力,成为了行业内的佼佼者。
Kubernetes 基础概念
Kubernetes 是一个开源平台,它允许你以容器为单位,自动部署、扩展及管理应用程序。想象一下,如果你的应用突然火了,流量激增,Kubernetes 可以自动帮你扩展服务;而当流量减少时,它也会智能缩减资源使用。
为什么选择 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 集群的架构对于我们搭建和维护集群至关重要。
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
bash# 更新系统 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 节点
bashsudo 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 节点上,运行以下命令查看所有节点的状态:
bashkubectl get nodes
这个命令会列出集群中所有的节点,并显示它们的状态。如果一切顺利,你应该能看到你的 Worker 节点状态为
Ready
。当然可以!假设你已经跟随上述步骤成功地将 Worker 节点加入到集群中,运行
kubectl get nodes
命令之后,你可能会看到类似于下面的输出:plaintextNAME 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 : 显示节点的角色,比如
master
或worker
;如果为空,则默认为worker
。AGE: 节点加入集群的时间。
VERSION: 节点上运行的 Kubernetes 版本。
这个输出告诉我们,集群中有一个 Master 节点和两个 Worker 节点,它们都已经准备就绪,可以开始部署应用程序了,这样,我们的 Kubernetes 集群就算是搭建成功了!
5、部署Pod网络
让 Kubernetes 集群节点彼此通信的关键在于 Pod 网络,每个 Pod 都应该能够连接其他 Pod,无论它们在哪个节点上,为此,我们需要为集群安装一个网络插件。
选择合适的网络插件
有多种网络插件可供选择,例如 Calico、Flannel、Weave Net 等,每种插件都有自己的特点,你可以根据自己的需求选择合适的。
这里以 Calico 为例,部署命令可能如下:
bash
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
运行该命令后,集群会下载 Calico 组件并部署在集群中,命令执行成功后,你可能看不到立即的输出,但是你可以通过运行以下命令检查 Pod 网络的部署状态:
bash
kubectl get pods --all-namespaces
这个命令会显示所有命名空间的 Pods,其中包括 Calico 网络插件的 Pods。如果一切正常,你将看到类似于以下的输出:
plaintext
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:
bash
kubectl create deployment nginx --image=nginx
执行该命令后,Kubernetes 会创建一个名为 nginx
的 Deployment,并从 Docker Hub 拉取最新的 NGINX 镜像。这条命令的输出会是:
plaintext
deployment.apps/nginx created
然后,你可以通过下面的命令检查 Pod 的状态:
bash
kubectl get pods
在几秒钟之后,你应该会看到 NGINX Pod 的状态变为 Running
:
plaintext
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-9vldk 1/1 Running 0 30s
部署 Service 来暴露应用
为了能够从集群外部访问这个 NGINX 应用,我们需要创建一个 Service:
bash
kubectl expose deployment nginx --port=80 --type=NodePort
执行该命令后,Kubernetes 会创建一个 Service 来暴露 NGINX Deployment。这条命令的输出会是:
plaintext
service/nginx exposed
使用以下命令查找暴露的 NGINX Service 的外部端口:
bash
kubectl get service nginx
输出会显示 NodePort 的值,类似于:
plaintext
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 用户界面。你可以用它来部署容器化应用到集群中,也可以对它们进行故障排除,以及管理集群资源。它允许用户配置和管理应用以及查看各种信息。
安装 Kubernetes Dashboard
首先,你需要部署 Dashboard UI。可以通过下面的命令来创建 Dashboard:
bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
运行命令后,系统可能不会立刻返回信息,但你可以运行下面的命令来检查 Dashboard 的部署状态:
bash
kubectl get pods --namespace kubernetes-dashboard
等待所有的 Pods 状态为 Running
。输出将类似于:
plaintext
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,你将需要创建一个代理服务器。可以使用下面的命令:
bash
kubectl proxy
这条命令会启动一个代理服务器,允许你通过浏览器直接访问 Dashboard。
现在,你可以在浏览器中输入以下 URL 来访问 Dashboard UI:
plaintext
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
默认情况下,你可能还需要一个令牌(Token)来登录。你可以通过以下命令来获取一个令牌:
bash
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 集群。
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程i