【1】K8S核心对象之Pod
Pod概念
- Pod是k8s调度的基本单元,它封装了一个或多个容器。Pod中的容器会作为一个整体被k8s调度到一个Node上运行。
- Pod一般代表单个app,由一个或多个关系紧密的容器组成。这些容器拥有共同的生命周期,作为一个整体被编排到Node上。并且它们 共享存储卷、网络和计算资源。
- k8s以Pod为最小单位进行调度等操作。
使用Pod
# Pod模板 pod-go-http.yaml
apiVersion: v1
kind: Pod # 资源类型=pod
metadata:
name: go-http # 需要在当前命名空间中唯一且必须是一个合法DNS子域名
namespace: default # 命名空间,默认是default,可省略
labels: # 为pod定义标签,用来对全部的pod进行区分和选择
app: go
version: v1
spec:
containers: # pod内的容器组,可以定义多个容器
- name: go-http # 容器 名称
image: leigg/hellok8s:v1 # 镜像默认来源为DockerHub
创建和查看pod的相关操作
# 创建pod
kubectl apply -f pod-go-http.yaml
# 查看go-http pod 状态
kubectl get pod go-http -o wide
# 查看全部pods
kubectl get pods -o wide
修改pod
注意点:
- 修改容器配置会触发Pod内的容器重启,Pod本身不会完全重启
- PodSpec中的大部分参数是创建后不可修改的,如果想要修改其他字段,只能在删除Pod后重新创建
修改pod分两种方式:
- 直接修改yaml文件然后再次apply即可,操作省略
- 通过patch命令修改,如下
# 修改镜像版本为v2
$ kubectl patch pod go-http -p '{"spec":{"containers":[{"name":"go-http","image":"leigg/hellok8s:v2"}]}}'
# 查看镜像信息,发现版本已经变了
$ kubectl describe pod go-http |grep Image
Image: leigg/hellok8s:v2
.......
与Pod交互
端口转发
# 这条命令是阻塞的,仅用来调试pod服务是否正常运行,执行后会绑定pod端口3000到master节点的3000端口,只有master节点可以访问,外部无法访问
> kubectl port-forward go-http 3000:3000
# 在master节点上新开会话
> curl http://localhost:3000
[v2] Hello, Kubernetes!
Pod Shell
# go-http容器没有/bin/bash,忽略报错,这里只做介绍
kubectl exec -it go-http -- /bin/bash
# 当Pod内存在多个容器时,通过-c指定进入哪个容器
kubectl exec -it go-http -c go-http -- /bin/bash
其他命令
# 查看日志(stdout/stderr),支持 --tail <lines>
kubectl logs -f go-http
kubectl logs -f go-http --tail 10
# 指定查看某个容器的日志
kubectl logs -f go-http -c go-http
# 删除pod
kubectl delete pod go-http
# 删除配置文件内的全部资源
kubectl delete -f pod-go-http.yaml
Pod与Container的不同
Container (容器) 的本质是进程,而 Pod 是管理这一组进程的资源。
Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。
例子:https://github.com/chaseSpace/k8s-tutorial-cn/blob/main/pod_initContainer.yaml