教程

Edit This Page

Kubernetes 101

关于 Kubernetes 101,我们将涵盖 kubectl, Pods, Volumes 和多个容器这些内容。

教程目标

准备开始

为了检查版本, 输入 kubectl version.

Kubectl 命令行

与 Kubernetes 进行交互最简单的方法就是通过 kubectl 命令行。

想要了解更多关于 kubectl,包括它的使用、命令和参数,查看 kubectl 概览

想要了解更多关于 kubectl 的安装和配置,查看 安装和设置 kubectl

Pods

在 Kubernetes 中,一组一个或者多个容器被称为 Pod 。在一个 Pod 里的容器是在一起部署的,它们作为一组一起启动、停止和伸缩。

想要了解更多, 查看 Pods

Pod 定义

最简单的 Pod 定义描述了 Deployment 中的单个容器。例如,一个 nginx web 服务器 Pod 可能被定义为:

pods/simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80

Pod 是对预期状态的声明的定义。预期状态在 Kubernetes 模型中是一个非常重要的概念。在这个系统中的很多东西都呈现为预期的状态,Kubernetes 保证现在的状态和预期的状态保持一致。例如,当您创建了一个 Pod 并且声明了将要在里面运行的容器。如果这些容器因为程序故障没有运行,Kubernetes 将继续创建或者重新创建这个 Pod 以使这个 Pod 达到期望状态。这个过程会一直持续直到您删除这个 Pod。

想了解更多信息,请查看 Kubernetes Design Documents and Proposals

Pod 管理

创建一个包含 nginx 服务器的 Pod (simple-pod.yaml):

kubectl create -f https://k8s.io/examples/pods/simple-pod.yaml

列出所有的 Pod:

kubectl get pods

对于大多数服务提供商,Pod IP 无法从外部访问。测试 Pod 是否工作的最简单方法是创建一个 busybox Pod 并且远程执行 exec 命令。有关更多信息,请参阅 获取正在运行的容器的Shell.

如果可以访问 Pod 的 IP,则可以使用端口 80 上的 wget 访问其 http 端点:

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
kubectl delete pod busybox # Clean up the pod we created with "kubectl run"

删除一个名为 nginx 的 Pod:

kubectl delete pod nginx

这对于简单的静态 Web 服务器来说非常棒,但是持久存储呢?

容器文件系统只在容器中存在。因此,如果您的应用程序的状态需要在重定位,重新启动和崩溃中存活,您将需要配置一些持久存储。

在此示例中,您将创建一个具有数据卷的 Redis Pod,并将数据卷挂载到指定的路径。

  1. 定义一个卷:

      volumes:
        - name: redis-storage
          emptyDir: {}
  1. 在容器定义中定义卷挂载:

      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):

pods/storage/redis.yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

其中:

卷类型

有关更多信息,请参阅 .

多个容器

Note: 注意: 以下示例在语法上是正确的,但某些镜像(例如 kubernetes/git-monitor)尚不存在。我们正在努力将这些变成可以工作的示例。

但是,通常您希望有两个不同的容器一起工作。这方面的一个例子是 Web 服务器和一个帮助程序作业,它可以轮询 git 仓库以获取更新:

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 仓库来参数化该容器。

接下来

继续阅读 Kubernetes 201 或者有关完整的应用程序,请参阅 guestbook 示例

反馈