Kubernetes入门实践(Pods)
为了解决多应用联合运行的问题,同时还要不破坏容器的隔离,就要再对多个容器进行打包。Pod就是对容器的打包,里面的容器可以看成是一个整体,总是能一起调度、一起运行,绝不会出现分离的情况,而Pod属于Kubernetes,可以在不触碰下层容器的情况下任意定制和修改,Kubernetes让Pod去编排容器,然后将Pod作为应用调度部署的最小单位

概括起来,Pod是Kubernetes的调度单位,代表一个或一组容器,所有的Kubernetes功能都必须通过Pod来实现
使用YAML描述Pod
因为Pod是API对象,所以必然也有apiVersion、kind、metadata、spec这四个基本组成部分,对Pod来说apiVersion、kind固定为v1和Pod,而一般来说,metadata里应该有name和labels这两个字段。使用Docker创建容器时,可以不给容器起名字,但在Kubernetes里,Pod必须要有一个名字,这也是Kubernetes里所有资源对象的一个约定
apiVersion: v1da kind: Pod metadata: name: busy-pod labels: owner: test env: demo region: north tier: back
metadata写上name和labels即可,而spec需要管理,维护Pod,其中有许多关键信息,containers是其中最重要的信息
containers是一个数组,其中的每一个元素是一个container对象,也就是容器,同时必须要有一个name表示名字,然后还要有一个image字段来说明它使用的镜像,name和image是必须要指定的
如下编写一段spec
spec: containers: -image: busybox:latest name: busy imagePullPolicy: IfNotPresent env: - name: os value: "ubuntu" - name: debug value: "on" command: - /bin/echo args: - "$(os),$(debug)"
image指定使用镜像busybox:latest,imagePullPolicy拉取策略是IfNotPresent,然后定义了os和debug两个环境变量,command启动命令是/bin/echo,参数中输出刚才定义的环境变量
使用kubectl操作Pod
一系列操作Pod的kubectl命令
创建、删除和输出
apply
和delete
可以创建和删除Pod,使用-f指定YAML文件,也可以直接使用YAML用name字段定义的名称,Kubernetes的Pod在后台运行,所以看不到输出信息,可以使用logs
来展示Pod的标准输出信息
$ minikube kubectl -- apply -f busy-pod.yml $ minikube kubectl -- delete -f busy-pod.yml $ minikube kubectl -- delete pod busy-pod # 指定名字删除
使用logs会将Pod的标准输出信息流展示,展示了command中写入的echo命令的输出:
$ minikube kubectl -- logs busy-pod ubuntu,on
检查状态
使用get pod
可以查看Pod列表和运行状态:
$ minikube kubectl -- get pod NAME READY STATUS RESTARTS AGE busy-pod 0/1 CrashLoopBackOff 3 (31s ago) 71s ngx 1/1 Running 3 (43m ago) 47h
这个busy-pod节点运行的状态是CrashLoopBackOff,可以使用describe
来检查它的详细状态:
minikube kubectl -- describe pod busy-pod Name: busy-pod Namespace: default Priority: 0 Node: minikube/192.168.59.100 Start Time: Sun, 24 Jul 2022 21:11:30 +0800 Labels: env=demo owner=test region=north tier=back Annotations: <none> Status: Running IP: 172.17.0.6 IPs: IP: 172.17.0.6 .... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 6m47s default-scheduler Successfully assigned default/busy-pod to minikube Normal Pulled 5m25s (x5 over 6m46s) kubelet Container image "busybox:latest" already present on machine Normal Created 5m25s (x5 over 6m46s) kubelet Created container busy Normal Started 5m25s (x5 over 6m46s) kubelet Started container busy Warning BackOff 105s (x25 over 6m44s) kubelet Back-off restarting failed container
在末尾的Events部分,显示的是Pod运行过程中的一些关键节点事件,对于这个busy-pod,因为只执行了一条echo命令则退出,而Kubernetes默认重启Pod,所以就会进入一个反复启动停止的状态
交互
cp
命令可以将文件拷贝进Pod中,如下将test.txt拷贝进Pod的tmp目录中:
$ echo 'aaa' > test.txt $ minikube kubectl -- cp test.txt ngx:/tmp
也可以打开一个shell进行命令交互:
$ minikube kubectl -- exec -it ngx -- sh / # ls bin etc mnt run tmp dev home opt sbin usr docker-entrypoint.d lib proc srv var docker-entrypoint.sh media root sys
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?