K8s 入门教程:从零开始学习 Kubernetes
1. 简介
1.1 什么是 Kubernetes?
Kubernetes(通常简称为 K8s)是一个开源的容器编排平台,由 Google 设计并捐赠给云原生计算基金会(CNCF)孵化。它可以自动化容器化应用程序的部署、扩展和管理。
使用 Kubernetes,你可以:
- 自动化部署:快速、可预测地部署应用程序。
- 弹性伸缩:根据负载动态地扩展或缩减应用程序。
- 服务发现和负载均衡:自动管理容器之间的网络流量。
- 自我修复:自动替换、重启或重新调度失败的容器。
- 滚动更新和回滚:逐步更新应用程序,并在出现问题时自动回滚。
1.2 为什么需要 Kubernetes?
在现代的云原生应用中,容器技术(如 Docker)被广泛使用。当应用程序规模变大,容器数量增多时,手动管理这些容器变得非常困难。Kubernetes 提供了一个强大的平台来解决这些问题,让开发者可以专注于业务逻辑,而不是底层的部署和管理细节。
2. 核心概念
在开始之前,你需要了解一些 Kubernetes 的核心概念:
- Cluster (集群):一个 Kubernetes 集群由一组工作机器组成,称为 Nodes (节点)。这些节点运行容器化的应用程序。集群至少有一个 Worker Node (工作节点) 和一个 Master Node (主节点)。
- Node (节点):一个节点是 Kubernetes 中的一台工作机器,可以是虚拟机或物理机。每个节点都包含运行 Pods 所需的服务。
- Pod:Pod 是 Kubernetes 中可以创建和管理的最小部署单元。一个 Pod 可以包含一个或多个容器,这些容器共享存储、网络和运行规范。
- Deployment (部署):一个 Deployment 提供了对 Pod 和 ReplicaSet (副本集) 的声明式更新。你可以在 Deployment 中描述应用程序的期望状态,Kubernetes 会负责将其变为现实。
- Service (服务):Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。通过 Service,你可以为应用程序提供一个稳定的入口点,而无需关心后端 Pod 的具体 IP 地址。
- ReplicaSet (副本集):确保在任何给定时间都有指定数量的 Pod 副本在运行。通常,我们不直接使用 ReplicaSet,而是通过 Deployment 来管理。
3. 准备工作
3.1 安装 kubectl
kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。
- Windows:
- 可以使用包管理器
Chocolatey或Scoop安装。 choco install kubernetes-cli或scoop install kubectl
- 可以使用包管理器
- macOS:
brew install kubectl
- Linux:
- 可以通过
snap或apt/yum安装。 sudo snap install kubectl --classic
- 可以通过
安装后,通过 kubectl version --client 验证是否成功。
3.2 安装本地 Kubernetes 集群 (Minikube)
对于初学者来说,在本地搭建一个单节点的 Kubernetes 集群是最好的选择。Minikube 是一个可以让你在本地轻松运行 Kubernetes 的工具。
- 安装 Hypervisor:Minikube 需要一个虚拟机监控程序,如 VirtualBox、Hyper-V 或 Docker Desktop。推荐使用 Docker Desktop,因为它内置了对 Kubernetes 的支持。
- 安装 Minikube:
- Windows:
choco install minikube或scoop install minikube - macOS:
brew install minikube - Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
- Windows:
4. 实践教程:部署你的第一个应用
4.1 启动 Minikube 集群
打开命令行工具,执行以下命令来启动你的本地 Kubernetes 集群:
bash
minikube start --driver=docker
这个过程可能需要几分钟,Minikube 会下载所需的镜像并配置一个单节点的 K8s 集群。
启动后,你可以通过以下命令查看集群状态:
bash
minikube status
kubectl get nodes
你应该能看到一个名为 minikube 的节点,状态为 Ready。
4.2 部署一个应用程序
现在,我们将部署一个简单的 Nginx Web 服务器。
-
创建 Deployment
我们将使用
kubectl create deployment命令来创建一个 Deployment。这个 Deployment 会创建一个 Pod,并在其中运行一个 Nginx 容器。bash
kubectl create deployment nginx-deployment --image=nginxnginx-deployment是我们为 Deployment 指定的名字。--image=nginx指定了要使用的容器镜像。
-
查看 Deployment 和 Pod
部署需要一些时间来拉取镜像和启动容器。你可以通过以下命令查看状态:
“`bash
查看 Deployment
kubectl get deployments
查看 Pod
kubectl get pods
“`当
nginx-deployment的READY状态变为1/1,并且 Pod 的STATUS变为Running时,说明部署成功了。
4.3 将应用程序暴露给外部
默认情况下,Pod 只能在 Kubernetes 集群内部访问。为了从外部访问 Nginx 服务,我们需要创建一个 Service。
-
创建 Service
我们将创建一个
NodePort类型的 Service,它会在节点上打开一个特定的端口,并将流量转发到 Nginx Pod。bash
kubectl expose deployment nginx-deployment --type=NodePort --port=80--type=NodePort指定了 Service 的类型。--port=80指定了 Service 应该监听的端口。
-
查看 Service
bash
kubectl get services你会看到一个名为
nginx-deployment的 Service。记下PORT(S)列中80端口映射到的那个较高的端口号(例如3xxxx)。 -
访问应用程序
现在,我们需要获取 Minikube 集群的 IP 地址,并通过刚刚获取的 NodePort 访问 Nginx。
bash
minikube service nginx-deployment --url这条命令会自动在浏览器中打开 Nginx 的欢迎页面。你也可以手动获取 IP 和端口,然后在浏览器中访问
http://<minikube-ip>:<node-port>。
4.4 扩展应用程序
假设我们的应用访问量增加了,需要扩展实例数量。通过 kubectl scale 命令可以轻松实现。
“`bash
将副本数量扩展到 3 个
kubectl scale deployment nginx-deployment –replicas=3
“`
再次查看 Pods,你会发现现在有 3 个 Nginx Pod 正在运行:
bash
kubectl get pods
Service 会自动将流量负载均衡到这三个 Pod。
4.5 更新应用程序
我们可以使用 kubectl set image 命令来更新应用程序的镜像版本。
bash
kubectl set image deployment/nginx-deployment nginx=nginx:1.21.6
Kubernetes 会执行滚动更新,逐个替换旧的 Pod,确保服务不中断。你可以通过以下命令观察更新过程:
bash
kubectl rollout status deployment/nginx-deployment
4.6 清理资源
完成学习后,你可以删除之前创建的资源,以保持环境整洁。
“`bash
删除 Service
kubectl delete service nginx-deployment
删除 Deployment
kubectl delete deployment nginx-deployment
停止 Minikube 集群
minikube stop
“`
如果想彻底删除 Minikube 集群和所有相关文件:
bash
minikube delete
5. 总结
恭喜你!你已经完成了 Kubernetes 的基本入门。通过这个教程,你学会了:
- Kubernetes 的核心概念。
- 如何使用 Minikube 搭建本地开发环境。
- 如何部署、暴露、扩展和更新一个应用程序。
这只是一个开始。Kubernetes 的世界非常广阔,还有许多高级功能等待你去探索,例如 ConfigMaps (配置管理)、Secrets (敏感信息管理)、Volumes (持久化存储) 和 Ingress (高级路由)。
希望这篇教程能为你打开通往云原生世界的大门!