一、Label(标签)
Label是K8S系统中的另外一个核心概念,一个Label是一个key=value键值对,其中key与value由用户自己指定。Label可以附加到各种资源对象上,例如:Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确定,也可以在对象创建后动态添加或删除。
K8S通过这种方式实现了资源对象的查询和筛选;
Label Selector在K8S中的重要使用场景如下:
- kube-controller进程通过对资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,从而实现Pod副本数量始终符合预期设定的全自动控制流程;
- kube-proxy进程通过Label Selector来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,实现Service的智能负载均衡机制;
- 通过对某些Node定义的特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod”定向调度”的特性;
二、Volume
Volume是Pod中能够被多个容器访问的共享目录。
K8S中的Volume定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下;
K8S中的Volume与Pod的生命周期相同,但与容器的生命周期不想关,当容器终止或者重启时,Volume中的数据也不会丢失的;
K8S中的Volume支持多种类型的文件系统,如:GlusterFS、Ceph;
Volume的使用,需要在Pod上声明一个Volume,然后再容器里应用该Volume
并Mount到容器的某个目录上。
...
spec:
volumes:
-name: datavol
emptyDir: {} // 临时目录,会随着Pod的删除而删除
...
volumeMounts:
volumeMounts:
- mountPath: /mydata-data // 永久保存
name: datavol
...
此外,Volume也可以挂载云路径(有使用的话,去研究吧)
三、Namespace
Namespace用于实现多租户的资源隔离;
K8S集群启动后,会创建一个名为”default”的Namespace,通过如下命令可查看:
$ kubectl get namespace
接下来,如果不特别指明Namespace,用户创建的Pod、RC、Service都会被系统创建到这个名为default的Namespace中;
1、创建Namespace:
apiVersion: v1
kind: Namespace
metadata:
name: development
2、引用Namespace
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
设置namespace之后,使用:
$ kubectl create -f namespace.yaml
$ kubectl get pods // 无法看到创建的pod,因为这个命令只会寻找默认Namespace上的Pod
$ kubectl get pods --namespace=name // 这样查看Pods