--- reviewers: - eparis - mikedanese title: Kubernetes 101 content_template: templates/tutorial --- {{% capture overview %}} 关于 Kubernetes 101,我们将涵盖 kubectl, Pods, Volumes 和多个容器这些内容。 {{% /capture %}} {{% capture objectives %}} * `kubectl` 是什么。 * 管理 Pod。 * 创建和挂载卷。 * 在一个 Pod 中创建多个容器。 {{% /capture %}} {{% capture prerequisites %}} * {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} * 为了 kubectl 使用示例能正常工作,请确保您在本地有一个示例目录,可以从 [一个发行版本](https://github.com/kubernetes/kubernetes/releases) 或者最新的 `.yaml` 文件 [这里](https://github.com/kubernetes/website/tree/master/content/en/docs/tutorials) 获取。 {{% /capture %}} {{% capture lessoncontent %}} ## Kubectl 命令行 与 Kubernetes 进行交互最简单的方法就是通过 kubectl 命令行。 想要了解更多关于 kubectl,包括它的使用、命令和参数,查看 [kubectl 概览](/docs/reference/kubectl/overview/)。 想要了解更多关于 kubectl 的安装和配置,查看 [安装和设置 kubectl](/docs/tasks/tools/install-kubectl/)。 ## Pods 在 Kubernetes 中,一组一个或者多个容器被称为 _Pod_ 。在一个 Pod 里的容器是在一起部署的,它们作为一组一起启动、停止和伸缩。 想要了解更多, 查看 [Pods](/docs/concepts/workloads/pods/pod/)。 #### Pod 定义 最简单的 Pod 定义描述了 Deployment 中的单个容器。例如,一个 nginx web 服务器 Pod 可能被定义为: {{< codenew file="pods/simple-pod.yaml" >}} Pod 是对预期状态的声明的定义。预期状态在 Kubernetes 模型中是一个非常重要的概念。在这个系统中的很多东西都呈现为预期的状态,Kubernetes 保证现在的状态和预期的状态保持一致。例如,当您创建了一个 Pod 并且声明了将要在里面运行的容器。如果这些容器因为程序故障没有运行,Kubernetes 将继续创建或者重新创建这个 Pod 以使这个 Pod 达到期望状态。这个过程会一直持续直到您删除这个 Pod。 想了解更多信息,请查看 [Kubernetes Design Documents and Proposals](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/README.md)。 #### Pod 管理 创建一个包含 nginx 服务器的 Pod ([simple-pod.yaml](/examples/pods/simple-pod.yaml)): ```shell kubectl create -f https://k8s.io/examples/pods/simple-pod.yaml ``` 列出所有的 Pod: ```shell kubectl get pods ``` 对于大多数服务提供商,Pod IP 无法从外部访问。测试 Pod 是否工作的最简单方法是创建一个 busybox Pod 并且远程执行 exec 命令。有关更多信息,请参阅 [获取正在运行的容器的Shell](/docs/tasks/debug-application-cluster/get-shell-running-container/). 如果可以访问 Pod 的 IP,则可以使用端口 80 上的 wget 访问其 http 端点: ```shell kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1 --env "POD_IP=$(kubectl get pod nginx -o go-template='{{.status.podIP}}')" u@busybox$ wget -qO- http://$POD_IP # Run in the busybox container u@busybox$ exit # Exit the busybox container ``` ```shell kubectl delete pod busybox # Clean up the pod we created with "kubectl run" ``` 删除一个名为 nginx 的 Pod: ```shell kubectl delete pod nginx ``` #### 卷 这对于简单的静态 Web 服务器来说非常棒,但是持久存储呢? 容器文件系统只在容器中存在。因此,如果您的应用程序的状态需要在重定位,重新启动和崩溃中存活,您将需要配置一些持久存储。 在此示例中,您将创建一个具有数据卷的 Redis Pod,并将数据卷挂载到指定的路径。 1. 定义一个卷: ```yaml volumes: - name: redis-storage emptyDir: {} ``` 1. 在容器定义中定义卷挂载: ```yaml volumeMounts:  # name must match the volume name defined in volumes  - name: redis-storage # mount path within the container mountPath: /data/redis ``` 以下是具有持久存储卷的 Redis Pod 定义的示例 ([redis.yaml](/examples/pods/storage/redis.yaml)): {{< codenew file="pods/storage/redis.yaml" >}} 其中: - `volumeMounts` `name` 是特定 `volumes` `name` 的引用。 - `volumeMounts` `mountPath` 是在容器中挂载卷的路径。 ##### 卷类型 - **EmptyDir**: 只要 Pod 在节点上运行,就会创建一个新目录,但它可以在容器故障和重新启动之间保持不变。 - **HostPath**: 在节点的文件系统上安装现有目录。例如 (`/var/logs`). 有关更多信息,请参阅 [卷](/docs/concepts/storage/volumes/). #### 多个容器 {{< note >}} **注意:** 以下示例在语法上是正确的,但某些镜像(例如 kubernetes/git-monitor)尚不存在。我们正在努力将这些变成可以工作的示例。 {{< /note >}} 但是,通常您希望有两个不同的容器一起工作。这方面的一个例子是 Web 服务器和一个帮助程序作业,它可以轮询 git 仓库以获取更新: ```yaml apiVersion: v1 kind: Pod metadata: name: www spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /srv/www name: www-data readOnly: true - name: git-monitor image: kubernetes/git-monitor env: - name: GIT_REPO value: http://github.com/some/repo.git volumeMounts: - mountPath: /data name: www-data volumes: - name: www-data emptyDir: {} ``` 请注意,我们在此处还添加了一个卷。在这种情况下,卷安装在两个容器中。它在 Web 服务器容器的情况下标记为 `readOnly`,因为它不需要写入目录。 最后,我们还向 `git-monitor` 容器引入了一个环境变量,它允许我们使用我们想要跟踪的特定 git 仓库来参数化该容器。 {{% /capture %}} {{% capture whatsnext %}} 继续阅读 [Kubernetes 201](/docs/tutorials/k8s201/) 或者有关完整的应用程序,请参阅 [guestbook 示例](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/) {{% /capture %}}