基础 Kubernetes (k8s) 教程 - ChatGPT 翻译
原文地址
基础 Kubernetes (k8s) 教程
在本教程中,你将学习到基本的 Kubernetes 命令,如何启动简单的 Pod 和部署(Deployment),以及如何与集群进行交互,以查询集群状态和你在集群中运行的进程状态。你还将看到第一个 YAML 文件示例。
❓ 提示:在这些教程中,你可能会看到一个红色的 ❓ 标记。这是一个让你暂停思考或回答快速自我评估问题的机会,有助于你更深入地理解材料。
❗ 提示:你也可能会看到 ❗ 标记,后面跟着提示或重要信息,这些信息可以帮助你或者是使用 Nautilus 时要记住的重要事项。
前提条件
本部分假设你已经完成了快速入门部分。
学习目标
- 你将了解 Kubernetes 命令的基本格式。
- 你将能够使用 Kubernetes 命令与集群进行交互。
- 你将对 YAML 有基本的理解,并能够使用它来创建一个简单的 Pod。
- 你将理解 Pod 和部署(Deployment)之间的区别。
- 你将对 Pod 的“无状态”性质有基本的理解,并了解如何使用部署(Deployment)来为你的 Pod 或软件容器(在 Pod 内运行)指定理想状态。
❗ 设置命名空间
由于你只拥有在你所属命名空间中运行的权限,因此你必须指定你的命名空间。在本教程中,建议你使用以下命令全局设置你的命名空间:
kubectl config set-context nautilus --namespace=<the_namespace>
有些用户可能会同时在多个命名空间中操作,Kubernetes 允许你在每个 kubectl
命令中通过添加 -n <a_namespace>
指定命名空间,而不论你是否已如上所述设置了上下文。大多数用户会为自己设置上下文,只有在必要时才偏离常规,而不是每次都指定。
探索系统
现在你了解了如何设置命名空间,让我们开始探索系统。
列出集群节点
Nautilus 集群分布广泛且高度异构。你可以通过键入以下命令来了解系统中节点的类型:
kubectl get nodes
请注意:你可能无法访问列出的所有节点,因为有些节点是保留的。
列出你命名空间中运行的进程
我们将检查以下三类进程:
- Pod
- 部署(Deployment)
- 服务(Service)
在 Kubernetes 中列出运行的类别遵循类似的格式:
kubectl get <category>
现在你的命名空间中可能没有运行任何东西,这些命令将返回 “No resources found in ...
列出 Pods
列出命名空间中的所有 Pods:
kubectl get pods
列出 Deployments
列出命名空间中的所有部署:
kubectl get deployments
列出 Services
列出命名空间中的所有服务:
kubectl get services
使用 YAML 设置你的第一个 Pod
让我们创建一个简单的通用 Pod,然后登录到其中。
一个简单的 YAML 文件
通过复制粘贴以下内容来创建 pod1.yaml
文件:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: mypod
image: ubuntu
resources:
limits:
memory: 100Mi
cpu: 100m
requests:
memory: 100Mi
cpu: 100m
command: ["sh", "-c", "echo 'I am a new pod' && sleep infinity"]
提醒:在 YAML 中,缩进很重要,就像在 Python 中一样。
❗ 在 Unix 中创建文件的简单方法
在 Unix 中有很多方法可以创建文件并将数据写入其中。最简单的方法之一是使用以下命令重定向标准输入:
cat > <name_of_new_file>
你可以在命令行界面中粘贴任何复制的文本或直接输入。一旦完成,你可以通过按 Control-C
退出输入流。这样做不会离开命令行界面。试试将上面的 pod1.yaml
示例复制,并使用 Unix cat
命令将其粘贴到一个新文件中。
动态创建 YAML 文件
或者,如果你不想创建一个文件,并且使用的是类 Unix 系统,你可以像这样动态创建 YAML 文件:
kubectl create -f - << EOF
<contents you want to deploy>
EOF
启动一个简单的 Pod
确保你在与 pod1.yaml
文件相同的文件目录中,输入以下命令:
kubectl create -f pod1.yaml
几秒钟后(Pod 正在创建中),看看你能否找到它:
kubectl get pods
请注意:你可能还会看到其他 Pod。
如果它还没有进入 Running
状态,你可以通过列出你命名空间中的事件来检查发生了什么:
kubectl get events --sort-by=.metadata.creationTimestamp
Pod 的事件和其他有用信息可以在 describe
中查看:
kubectl describe pod test-pod
❓ test-pod
的名称是从哪里来的?查看 pod1.yaml
文件寻找答案。
如果 Pod 处于 Running
状态,我们可以检查它的日志:
kubectl logs test-pod
让我们登录到 Pod 中:
kubectl exec -it test-pod -- /bin/bash
❗ 操作系统和命令行解释器之间的关系
此命令的最后部分指定 bash
可能会改变,取决于我们选择的操作系统。在部署除 Ubuntu 以外的操作系统时请记住这一点。
❓ 你成功登录到你的 Pod 吗?
如果是,你现在就在 Pod(中的容器)内!
❓ 感觉和常规的专用节点有区别吗?
试着用 cat
命令创建一些目录和一些带有内容的文件(比如 "Hello world"),尽情发挥你的创造力。
检查 Pod 的网络
Kubernetes Pod 内的网络对于在同一 Pod 内的容器之间的通信以及与其他 Pod 和外部服务的连接至关重要。了解 Pod 内部的网络是如何工作的,对于在 Kubernetes 环境中有效地构建和部署应用程序非常重要。因此,让我们通过登录到简单的 Pod 中来检查网络是如何配置的。
❓ 我们的 Pod 中是否安装了检查网络所需的工具?
记住在 Kubernetes 中运行的 Pod 是“无状态的”,由于我们在启动简单的 Pod 示例时没有指定任何软件包,我们需要做一些工作才能查看网络。
在我们的初始 Pod 中没有包含 ifconfig
包;所以让我们安装它。
首先,确保我们的安装工具是最新的:
apt update
现在,我们可以使用 apt
来安装必要的网络工具:
apt install net-tools
现在检查网络:
ifconfig -a
❓ 你发现了什么?输出看起来像你预期的吗?
最后,让我们退出 Pod 并通过在 Pod 的命令行界面中输入 exit
命令,或者使用键盘快捷键 Control-D
来继续。
测试无状态性
为了证明 Pod 确实是无状态的,我们将关闭简单的 Pod,并重复创建它,然后再次查看它。
关闭原始 Pod
让我们使用 kubectl
手动关闭 Pod:
kubectl delete -f pod1.yaml
这可能需要一些时间,因为系统将优雅地删除 Pod。几秒钟后,检查它是否真的消失了:
kubectl get pods
❓ 它消失了吗?
如果是,让我们再次创建它:
kubectl create -f pod1.yaml
❗ 从 CLI 访问之前的命令
大多数命令行界面都会存储你输入的最近命令。你可以通过使用键盘的“向上箭头”轻松访问它们,这是一种快速重复命令的方法。
再次查看 Pod1.yaml
给系统一点时间来创建新 Pod。
❓ 它的 IP 是否相同?我们可以使用以下命令检查:
kubectl get pod -o wide test-pod
再次登录到 Pod:
kubectl exec -it test-pod -- /bin/bash
❓ 现在网络是什么样子的?
现在,让我们查找你使用 cat
命令创建的文件。它们还在你离开时的位置吗?你创建的文件的状态如何?
❓ **这个练习如何证明“无状态性”?
**
扩展 Kubernetes
使用 YAML 编写和在 Kubernetes 中启动 Pod 是一个良好的开端,但你通常需要让你的 Pods 一起工作或与外部服务进行通信。让我们看看 Kubernetes 提供了哪些帮助。
使用 Deployment 创建 Pod
在 Kubernetes 中,Deployments 提供了一种更高级的抽象,可以管理和扩展 Pod。Deployment 描述了一个期望的状态,Kubernetes 控制器会以声明式方式调整系统的状态以匹配期望状态。这意味着,如果 Pod 失败或被删除,Deployment 会自动重新创建它们。Deployment 还提供了滚动更新和回滚功能。
创建 Deployment 的 YAML 文件
创建一个名为 deployment.yaml
的新 YAML 文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
在这个 YAML 文件中,我们创建了一个名为 nginx-deployment
的 Deployment,它会启动 3 个 Nginx Pod。
启动 Deployment
使用以下命令启动 Deployment:
kubectl apply -f deployment.yaml
检查 Deployment 状态:
kubectl get deployments
检查 Pod 状态:
kubectl get pods
❓ 你能看到 3 个 Nginx Pod 吗?
总结
在本教程中,你学到了如何使用 kubectl
命令与 Kubernetes 集群进行交互,如何使用 YAML 文件创建 Pod,以及如何使用 Deployment 来管理 Pod。你还了解了 Pod 的无状态性质以及如何扩展 Kubernetes 功能。
现在你已经掌握了 Kubernetes 的基本概念,接下来可以探索更高级的主题,比如服务(Service)、持久化存储、ConfigMaps 和 Secrets、Helm Chart 等等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)