kubernetes调度基础
# kubernetes调度基础
# 1. 命名空间
命名空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。
命名空间作用域仅针对带有命名空间的对象 (opens new window), (例如 Deployment、Service 等),这种作用域对集群范围的对象 (例如 StorageClass、Node、PersistentVolume 等)不适用。
简单来说,通过命名空间我们可以将同一集群中的资源分为开发,测试,正式环境,并且通过区分命名空间可以包含同名的资源。
# 1.1. 列出命名空间
使用以下命令来列出集群中的所有命名空间:
kubectl get namespaces
使用以下命令来列出集群中的指定命名空间的所有pod:
kubectl get pods -n <NAMESPACE>
我们可以通过 -n
或者 --namespace
指定想查看的命名空间。
# 1.2. 切换命令行的命名空间
在新版本的 Kubernetes 中,kubectl
的默认命名空间已经不再是 default
,而是用户的当前命名空间。这是因为 Kubernetes 强烈建议您在不同的命名空间中隔离应用程序和资源,因此 kubectl
默认使用用户当前的命名空间来提高生产力。
使用以下命令来查看当前所在的命名空间:
kubectl config view --minify --output 'jsonpath={..namespace}'
使用以下命令来切换命令行的命名空间:
kubectl config set-context --current --namespace=<NAMESPACE>
# 1.3. 创建命名空间
# 1.3.1. 通过文件创建
可以通过自定义yaml文件进行创建命名空间:
apiVersion: v1
kind: Namespace
metadata:
name: test
2
3
4
使用以下命令来通过文件创建test命名空间:
kubectl create -f test.yaml
# 1.3.2. 通过命令行创建
也可以使用以下命令通过命令行创建命名空间:
kubectl create namespace test
# 1.4. 删除命名空间
删除命名空间
当删除整个命名空间时,Pod将会伴随命名空间自动删除,可以使用以下命令删除命名空间:
kubectl delete namespace test
删除命名空间中的Pod
使用--all
选项删除对应命名空间中的所有Pod:
kubectl delete pod --all -n test
删除命名空间中的所有资源(几乎)
删除当前命名空间中的所有资源,包括Deployment、ReplicaSet、pod等,以及我们创建的所有service,但是不包含集群范围内的对象,如PersistentVolume:
kubectl delete all --all -n test
# 2. 标签和注解
标签(Labels) 是附加到 Kubernetes 对象 (opens new window)(比如 Pod)上的键值对。
在部署实际应用程序时,随着pod数量的增加,我们就需要一种标准,而标签可以将Pod组织成群体的方式,仅通过一次操作对某一个组的资源进行操作,如Pod等等。
标签是不仅可以组织pod,也可以组织其他所有的Kubernetes资源。
# 2.1. 创建/修改标签
# 2.1. 通过文件创建/修改
在之前的Pod文章中,我们创建Pod时通过 metadata.labels
指定了一些标签:
labels: # 可选,标签选择器,一般用于Selector
app: nginx
role: frontend # 可选,标签,可以写多个
2
3
Pod创建完成后,通过以下命令查看所有Pod的标签:
kubectl get pod --show-labels
# 2.1. 通过命令行创建/修改
也可以在现有pod上进行添加标签:
kubectl label pod nginx env=test
修改标签:
kubectl label pod nginx env=prod --overwrite
查看标签时可以通过 -L
指定标签作为显示的一列:
kubectl get pod -L env,app
# 2.2. 标签选择器
标签选择器主要用于资源的匹配,只有符合条件的资源才会被调用或使用,可以使用该方式对集群中的各类资源进行分配。
可以使用 =
、==
和 !=
三种运算符进行匹配,并通过 ,
进行过滤。
也可以使用 in
、notin
和 exists
三种语句进行过滤,本质上两种匹配方式区别不大。
查找标签key为 ENV
值等于 prod
并且标签key为 app
值等于 nginx
的资源:
kubectl get pods -l 'ENV=prod,app=nginx' --show-labels
查找标签key为 ENV
值等于 prod
或者 test
的资源:
kubectl get pods -l 'ENV in (prod,test)' --show-labels
# 2.3. 注解
使用 Kubernetes 注解为对象 (opens new window)附加任意的非标识的元数据。
注解并不是为了保存标识信息而存在的,可以通过对每个pod或其他API对象添加注解来为其添加说明,以便每个使用该集群的人都可以快速查找有关每个单独对象的信息。
通过之前创建的nginxPod查看注解:
kubectl get pod nginx -o yaml | grep annotations -A 5
Pod在创建时会自动添加一些注解。我们也可以手动添加注解:
kubectl annotate pod nginx imageregistry: "https://hub.docker.com/"
再次查看注解,发现已经成功添加。
# 3. ReplicationController和ReplicaSet
# 3.1. ReplicationController(已弃用)
ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态。换句话说,ReplicationController 确保一个 Pod 或一组同类的 Pod 总是可用的。
ReplicationController总是会保障Pod的数量达到期望值,Pod 数量过多时,ReplicationController 会终止多余的 Pod。当 Pod 数量太少时,ReplicationController 将会启动新的 Pod。
新建 ReplicationController.yml
如下:
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用kubectl apply命令从YAML文件创建ReplicationController:
kubectl apply -f ReplicationController.yml
查看ReplicationController:
kubectl get replicationcontrollers
- DESIRED:用户期望的Pod副本个数(spec.replicas的值)。
- CURRENT:当前处于Running状态的Pod的个数。
- READY:当前已经可用的Pod的个数,即健康检查处于正确状态的Pod的个数。
# 3.2. ReplicaSet
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
ReplicaSet的作用与ReplicationController相同,都是保障Pod的数量达到期望值,但是两者区别就是ReplicaSet支持更强大的标签选择器。
新建 ReplicaSet.yml
如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
同样使用相同的命令进行创建以及查看ReplicaSet,发现与ReplicationController并没有什么区别,但是支持更强大的标签选择器可以通过matchExpressions进行多个资源的匹配。
selector:
matchLabels:
app: nginx
matchExpressions:
- { key: ENV, operator: In, values: [test] }
- { key: app, operator: NotIn, values: [redis] }
2
3
4
5
6
matchExpressions其中包含数组,而数组中又分为map,每一个map的key的作用跟之前所说的标签选择器中的作用相同,其中operator字段略有不同,共分为以下4种情况:
- In:label的值在某个列表中
- NotIn:label的值不在某个列表中
- Exists:某个label存在
- DoesNotExist:某个label不存在
需要注意的是,在selector中,必须同时满足matchLabels和matchExpressions的条件才能匹配到对应的资源。
参考文章及书籍: