基础 Kubernetes (k8s) 教程 - ChatGPT 翻译

原文地址

基础 Kubernetes (k8s) 教程

在本教程中,你将学习到基本的 Kubernetes 命令,如何启动简单的 Pod 和部署(Deployment),以及如何与集群进行交互,以查询集群状态和你在集群中运行的进程状态。你还将看到第一个 YAML 文件示例。

❓ 提示:在这些教程中,你可能会看到一个红色的 ❓ 标记。这是一个让你暂停思考或回答快速自我评估问题的机会,有助于你更深入地理解材料。

❗ 提示:你也可能会看到 ❗ 标记,后面跟着提示或重要信息,这些信息可以帮助你或者是使用 Nautilus 时要记住的重要事项。

前提条件

本部分假设你已经完成了快速入门部分。

学习目标

  1. 你将了解 Kubernetes 命令的基本格式。
  2. 你将能够使用 Kubernetes 命令与集群进行交互。
  3. 你将对 YAML 有基本的理解,并能够使用它来创建一个简单的 Pod。
  4. 你将理解 Pod 和部署(Deployment)之间的区别。
  5. 你将对 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 等等。

posted @ 2024-08-31 22:27  sq-Feng  阅读(6)  评论(0编辑  收藏  举报