资源清单

写资源清单的时候使用命令查询帮助,

kubectl explain pod

需要查询pod中的特定内容时中间用.连接例如我们查看pod中的spec都有什么,就可以用

kubectl explain pod.spec

写到哪,查到哪,但是要注意,写的时候查看到后面有-required-这个参数的时候那就代表,这一单元中这个参数是必须的,例如

kubectl explain pod.spec
containers	<[]Object> -required-
     List of containers belonging to the pod. Containers cannot currently be
     added or removed. There must be at least one container in a Pod. Cannot be
     updated.

这就说明containers这个模块是必须要存在的。
一个模块中有很多东西
例如写一个pod.ymal 文件

apiVersion: v1##版本
kind: Pod##控制器类型
metadata:##元数据
  name: demo##元数据名称
  labels:##标签
     app: demo ##标签采用健值对的方式
spec:##控制容器
  containers:
  - name: demo ##容器名称
  - image: nginx ##指定镜像

文件编写完成后创建pod,

[kubeadm@server1 ~]$ kubectl create -f pod.yaml 
pod/demo created
[kubeadm@server1 ~]$ kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          41s

这样就已经运行起来了,刚刚我们写的文件控制器类型为自主型的pod,kind: Pod因为没有控制器,所以可以直接将pod进行删除,他并不会再次创建。

[kubeadm@server1 ~]$ kubectl delete pod demo 
pod "demo" deleted
[kubeadm@server1 ~]$ kubectl get pod
No resources found in default namespace.

其实一个containers中可以运行多个容器,但是如果给的内容相同那么就会产生一个问题,那就是资源争抢。所以尽量不要这么干。
可以使用不同的镜像,两个镜像中的不管是端口还是网络不重和的镜像来操作。
比如

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    app: demo
spec:
  containers:
  - name: vm1
    image: nginx
  - name: vm2
    image: redis

镜像一个使用nginx一个使用redis,设置完成后进行创建

[kubeadm@server1 ~]$ kubectl create -f pod.yaml 
pod/demo created
[kubeadm@server1 ~]$ kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   2/2     Running   0          48s

这样创建出来的就没有资源的争抢,可以顺利运行。
不想要这个pod还可以直接使用命令,直接删除文件中配置的容器。

[kubeadm@server1 ~]$ kubectl delete -f pod.yaml 
pod "demo" deleted

标签

但是在创建之后有一个问题如下:

[kubeadm@server1 ~]$ kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo   2/2     Running   0          39s   10.244.3.6   server4   <none>           <none>

我们发现这些镜像全部都运行在server4上,当我们想进行调度的时候那这应该如何是好?那么就需要使用标签了。在上面的文件中我们已经设置了标签,app: demo,那么要如何使用。
首先可以看看每个pod上的标签是什么,使用命令

[kubeadm@server1 ~]$ kubectl get pod --show-labels 
NAME   READY   STATUS    RESTARTS   AGE     LABELS
demo   2/2     Running   0          4m54s   app=demo

还有一种过滤的方法,这种方法适用于标签数量比较少的时候。

[kubeadm@server1 ~]$ kubectl get pod -l app
NAME   READY   STATUS    RESTARTS   AGE
demo   2/2     Running   0          6m27s
[kubeadm@server1 ~]$ kubectl get pod -L app
NAME   READY   STATUS    RESTARTS   AGE     APP
demo   2/2     Running   0          6m32s   demo

可以看到最后显示的就是一个标签。上面我们也提到了一个东西,在标签不多的时候可以使用过滤,但是仔细想想,标签的多或者少可以指定么?当然可以。我们给pod再加一个版本信息的标签,可以使用

[kubeadm@server1 ~]$ kubectl label pod demo version=v1
pod/demo labeled
[kubeadm@server1 ~]$ kubectl get pod --show-labels 
NAME   READY   STATUS    RESTARTS   AGE   LABELS
demo   2/2     Running   0          11m   app=demo,version=v1

这样标签又添加上去一个。当标签打错了我们也是可以进行修改的。

[kubeadm@server1 ~]$ kubectl label pod demo app=nginx --overwrite  
pod/demo labeled
##将名为demo的pod的标签app修改为nginx,注意后面必须加overwrite,因为原始的标签还在,我们需要将其覆盖
[kubeadm@server1 ~]$ kubectl get pod --show-labels 
NAME   READY   STATUS    RESTARTS   AGE   LABELS
demo   2/2     Running   0          15m   app=nginx,version=v1

那标签的作用,或者说如何使用来控制资源分配。
首先给节点也打上标签,接着给配置文件里面添加标签的标识,再运行读取文件并运行就会跑到我们设置的结点上运行了。

[kubeadm@server1 ~]$ kubectl label nodes server3 disktype=ssd
node/server3 labeled
[kubeadm@server1 ~]$ kubectl  get nodes -L disktype
NAME      STATUS   ROLES    AGE    VERSION   DISKTYPE
server1   Ready    master   2d1h   v1.17.3   
server3   Ready    <none>   2d1h   v1.17.3   ssd
server4   Ready    <none>   2d1h   v1.17.3   

[kubeadm@server1 ~]$ vim pod.yaml
kind: Pod
metadata:
  name: demo
  labels:
    app: demo
spec:
  containers:
  - name: vm1
    image: nginx
  - name: vm2
    image: redis
  nodeSelector:
    disktype: ssd

[kubeadm@server1 ~]$ kubectl create -f pod.yaml
[kubeadm@server1 ~]$ kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo   2/2     Running   0          47s   10.244.2.5   server3   <none>           <none>

总的来说

标签添加:
kubectl label nodes kube-node/pod label_name=label_value
标签删除:
##删除一个Label,只需在命令行最后指定Label的key名并与一个减号相连即可:
kubectl label nodes/pods pod/node-name label_name- 
查询:
kubectl get pod --show-labels
替换:
##在添加的基础上加上一个--overwrite的参数
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐