企业级容器技术 k8s 资源清单和标签
资源清单写资源清单的时候使用命令查询帮助,kubectl explain pod需要查询pod中的特定内容时中间用.连接例如我们查看pod中的spec都有什么,就可以用kubectl explain pod.spec写到哪,查到哪,但是要注意,写的时候查看到后面有-required-这个参数的时候那就代表,这一单元中这个参数是必须的,例如kubectl explain pod.sp...
资源清单
写资源清单的时候使用命令查询帮助,
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的参数
更多推荐
所有评论(0)