3.2 YAML或json描述文件创建pod

3.2.2 为pod创建一个简单YAML描述文件

代码清单 3.2 kubia-manual.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: docker.artnj.test.com.cn/cci/kubia:v3
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

注意:containerPort是容器的端口,详情参见《【K8S】配置中的port、targetPort、nodePort和containerPort区别》

执行创建脚本:
kubectl create -f kubia-manual.yaml

$ kubectl create -f kubia-manual.yaml
pod/kubia-manual created

查看创建的pod

$ kubectl get pod
NAME           READY   STATUS              RESTARTS   AGE
kubia-manual   0/1     ContainerCreating   0          23s
$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
kubia-manual   1/1     Running   0          27s

查了2次,第一次显示仍然为ContainerCreating ,第二次显示Running

kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP            NODE                     NOMINATED NODE   READINESS GATES
kubia-manual   1/1     Running   0          4m30s   172.30.4.57   2059-8086-8311-272--17   <none>           <none>

3.2.5 向pod发送请求

在前一章中,使用kubectl expose命令创建了一个service,以便在外部访问该pod。由于有一整章专门介绍service,本章不打算使用该方法,此外,还有其他连接到pod 以进行测试和调试的方法,其中之一就是通过端口转发。

通过kubectl port-forward 负责转发。

开启一个客户端:

[root]$  kubectl port-forward kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080   '显示开启转发服务'
Forwarding from [::1]:8888 -> 8080
Handling connection for 8888      '当有请求过来时,会打印'

在另一个客户端:

[root]$ curl localhost:8888
This is v3 running in pod kubia-manual     '成功访问Pod内的容器'

port-forward 依赖socat,如果没有,则需要安装,参见《socat下载安装(转发数据)》

$ kubectl port-forward kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080      '假象,此时其实是不生效的'
Forwarding from [::1]:8888 -> 8080
Handling connection for 8888      '当访问8888端口时,触发失败,包括下行内容'
E0326 18:59:22.365861    4930 portforward.go:391] an error occurred forwarding 8888 -> 8080: error forwarding port 8080 to pod 78bbe68ed5001848011a88394db32614bb975ccd5ad7eb13f81adeebde719136, uid : unable to do port forwarding: socat not found.

3.3 使用标签祖组织pod

3.3.2 创建pod时指定标签

kubia-manual-with-labels.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  #labels标签父标签
  labels:
    creation_method: manual
    env: prod
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

kubectl get pods 命令默认不会列出任何标签,可以使用--show-labels来查看:

$ kubectl get pod --show-labels
NAME            READY   STATUS    RESTARTS   AGE   LABELS
kubia-manual    1/1     Running   0          23h   creation_method=manual,evn=prod
kubia-manual2   1/1     Running   0          31m   <none>

在这里插入图片描述

kubia-manual带有标签,而kubia-manual2一个标签都没有

在查看时,-l 可以进行过滤,仅显示带指定标签的pod:

kubectl get pod -l app=prod
NAME            READY   STATUS    RESTARTS   AGE   
kubia-manual    1/1     Running   0          23h   

由于kubia-manual才带有app标签且值为prod,因此kubia-manual2没显示出来。

3.5 使用标签和选择器来约束pod调度

标签可以加在任何k8s对象上,包括节点

命令参见《kubectl label命令(对node添加、删除label)》

3.5.2 调度到一个特定节点

注意:nodeSelector标签key/value形式,需要对value加引号!而pod自身加标签,不需要引号

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  nodeSelector:
   install_node: "true"
  containers:
  - image: docker.artnj.test.com.cn/cci/kubia:v3
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

核心参数:

  nodeSelector:
   install_node: "true"    '注意必须加引号'

执行创建脚本:
kubectl create -f kubia-manual.yaml

$ kubectl create -f kubia-manual.yaml
pod/kubia-manual created

附操作过程:

kubectl get nodes     //查看全部节点
kubectl get nodes -l install_node=true   //查看全部节点,并且对标签install_node=true   进行过滤

kubectl label node 194.246.9.5 install_node=true   //对node添加标签

kubectl label nodes 194.246.9.27  install_node- //删除label 
Logo

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

更多推荐