本文将会介绍到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。
- 定义一个volumes:
volumes:
- name: redis-persistent-storage
emptyDir: {}
- 在容器定义中定义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
登录后评论
立即登录 注册