Kubernetes中文文档

Kubectl CLI and Pods

本文将会介绍到kubectl, pods, volumes和多个containers。

Kubectl CLI

和Kubernetes交互的最简单的方法就是通过kubectl 命令行接口。

更多关于kubectl的信息,包括它的使用、命令行和参数,参见kubectl CLI reference

如果你还没有安装或者配置kubectl,请先进行这些prerequisites,然后再继续。

Pods

在Kubernetes中,一组或者更多的容器叫做一个pod。一个pod中的容器一起部署,一起启动、停止、复制。

详细参见 pods

Pod定义

最简单的pod定义可以通过一个简单的容器的部署来进行描述。比如一个nginx web server pod可以以如下的方式进行定义。

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

Pod的定义实际上一预定状态的一种声明。预定状态在Kubernetes中是一个很重要的概念。许多事情都会向系统展示一个预定状态,Kubernetes的责任就是要确保当前的状态和预定状态一致。比如当你创建了一个Pod,你声明你希望其中的容器可以运行。如果容器没有处于运行状态(比如程序错误等…),Kubernetes会重建它以使它到达预定状态。直到Pod被删除这个过程才会结束。

Pod管理

创建一个有nginx server的Pod (pod-nginx.yaml):

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

列出所有的pod:

$ kubectl get pods

对于大多数提供者,pod IP在外部是不可以访问到的。最简单的的一种方式来测试Pod是否运行就是创建一个busybox pod然后远程地去运行指令 。

假如pod IP是可以访问的,你要能够用curl命令来访问它的80端口:

$ curl http://$(kubectl get pod nginx -o go-template=)

按名字删除Pod:

$ kubectl delete pod nginx

Volumes

对于一个简单的的静态web服务器还好,然而怎么进行持久存储呢?

了解

容器的文件系统生命周期和容器自身的生命周期一样。所以如果你的应用状态需要在迁移、重启和崩溃中可以保存下来,你需要配置持久存储。

比如,我们需要创建一个命令了卷的挂载了存储路径的Redis的Pod。

  1. 定义一个volumes:
volumes:
    - name: redis-persistent-storage
      emptyDir: {}
  1. 在容器定义中定义volumes挂载点:
volumeMounts:
    # name must match the volume name below
    - name: redis-persistent-storage
      # mount path within the container
      mountPath: /data/redis

有持久存储的Redis pod定义(pod-redis.yaml):
pod-redis.yaml

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: {}

说明:

  • The volumeMounts name 指一个具体的挂载点名。
  • The volumeMounts mountPath 是要挂载到容器卷中的路径。

Volumes类型:

  • EmptyDir: 创建一个只要运行在节点上的Pod运行便一直存在的一个目录,然而它可以在容器失效和重启时都可以持续。
  • HostPath: 把存在的目录挂载到节点的文件系统上 (e.g. /var/logs)。

详细参见 volumes

多个Containers容器

说明:下面例子中的语法都是正确的,然而有些镜像(e.g. kubernetes/git-monitor)还不存在。 我们正在努力把这些都变成可以运行的示例。

然而,你常常会需要有两个容器可以一起协同工作。一个示例便是创建一个web server和一个helper任务可以polls git repository来进行更新:

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 server中它被列为只读,因为它并不需要写的权限。

最后,我们也为git-monitor container引入了一个环境变量,这让我们可以用一个我们可以跟踪的特定的git来定义那个容器。

更多讨论:QQ交流群  513817976  入群暗号: kubernetes.org.cn