Kubernetes 101 内容涵盖 kubectl, pods, volumes多容器的知识。 学习时注意区分各个概念与 Docker 概念的对应关系和差异。

大致的知识树如下:

  • Kubernetes 101 - Kubectl CLI and Pods
    • Kubectl CLI
    • Pods
      • Pod Definition
      • Pod Management
      • Volumes
      • Volume Types
      • Multiple Containers

Kubectl CLI

与 Kubernetes 交互最便捷的方式是实用 kubectl 命令行。

kubectl 的详细用法、命令和参数,可以查看:kubectl CLI reference

Pods

Pod 是 kubernetes 管理的基本单位。

在 Kubernetes 里,一个或多个容器的群组叫做 podpod 中的容器同时部署,作为一组整体来启动、停止和复制。 Pod 详解

Pod Definition

最简单的 pod 定义可以描述单个容器的部署。

例如,一台 nginx 服务器的 pod 定义

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

Pod 定义pod defination) 是对期望状态desired state)的声明。

期望状态是 Kubernetes 模型中很重要的概念。 Kubernetes 的职责是确保当前状态符合期望状态

例如,创建 Pod 时声明其中的容器处于 running 状态。 如果容器恰好没有运行(由于程序失败或其它原因),Kubernetes 为了达到期望状态,将持续(重新)创建它们。 除非 Pod 被删除,Kubernetes 不会停止。

Pod Management

创建刚才定义的包含 nginx 容器的 pod:

$ kubectl create -f docs/user-guide/walkthrough/pod-nginx.yaml

列出所有 pod:

$ kubectl get pods

如果 IP 能通,可以访问到 80 端口:

$ curl http://$(kubectl get pod nginx -o=template -t={{.status.podIP}})

大部分 provider 中,外部不能访问 pod 的 IP。 最简单的方式是创建一个 busybox pod,通过它远程运行命令。 参考:command execution documentation

删除指定名字的 pod:

$ kubectl delete pod nginx

Volumes

上面是一个简单的 web 服务器,容器中文件系统的生命周期和容器本身相同。 如果应用需要在迁移、重启和崩溃后仍然保存状态,就需要配置持久存储。

举个例子,创建一个 Redis pod,包含一个命名 volume,和定义了这个 volume 目标路径的 volume 挂载

1) 定义 volume

volumes:
- name: redis-persistent-storage
  emptyDir: {}

2) 在容器定义内部定义 volume 挂载:

volumeMounts:
# name must match the volume name below
- name: redis-persistent-storage
  # mount path within the container
  mountPath: /data/redis

带持久存储的 Redis pod 完整配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-persistent-storage
      mountPath: /data/redis
  volumes:
  - name: redis-persistent-storage
    emptyDir: {}
  • volume 挂载的名字指向一个空目录 volume。
  • volume 挂载的路径指向空目录 volume 挂载到容器内的路径。

Volume Types

  • EmptyDir: 创建一个目录,容器失败和重启后仍然可用。
  • HostPath: 挂载主机节点上已有的目录(如 /var/logs)。

Multiple Containers

然而,我们经常希望两个不同的容器共同工作。

举个例子,启动一个 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: {}

这里使用了一个 volume。 此 volume 挂载到两个容器中。

在 web 服务器的容器中,volume 标记为 readOnly,因为不需要写入此目录。

还在 git-monitor 容器中引入了一个环境变量,可以给容器传参数,指定 git 仓库地址。

NEXT

Kubernetes 201 / en