文章目录
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对象上,包括节点
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