在Minikube中探索应用
Kubernetes Pods概念
当我们 使用Minikube集群部署应用 ,Kubernetes创建了一个承载应用实例的 Pod
。所谓Pod就是Kubernetes抽象出来,用于表示一组包含一个或多个应用容器(例如Docker或rkt),以及一些共享给这些容器的资源。这些资源包括:
共享存储,例如Volume卷
共享网络,具有一个唯一的集群IP地址
有关如何运行每个容器的信息,例如容器镜像的版本或者使用的特殊端口
一个Pod能给一个特定应用 "逻辑主机" 模式,并且可以包含不同的应用容器,例如这些容器有相关性。举例,一个Pod可能会包含运行Node.js应用的容器以及一个将数据发送个Node.js web服务器的容器。
备注
在一个Pod中的所有容器 共享
同一个IP地址以及端口范围 ,并且总是一起调度和分发,这样可以保证同一个Pod的相关所有容器都运行在一个相同Node节点上。
你可以将Pod视为一个逻辑主机,这个逻辑主机中多个容器实际上就是这个主机上运行的多个进程,只不过进程间通过 namespace 和 cgroup 进行了良好隔离。这个逻辑主机可以在不同Node之间迁移,则这个逻辑主机中所有相关容器(进程)也就共同迁移。正是因为Pod是一个逻辑主机,所以只有一个IP地址和一个端口范围。
当然,如果你以前学习过Docker概念,对Docker把容器比喻成集装箱的概念印象深刻的话,你可以继续把容器container想像成集装箱,但是是小尺寸集装箱。而包含多个容器的Pod就是一个大尺寸的集装箱,里面装了几个小集装箱(容器)。所以每次调度Pod的时候就是一起调度多个小集装箱(相关容器)。
Pod 是Kubernetes平台的原子单位。当我们在Kubernetes中创建一个部署,这个部署将创建Pod并在Pod中运行容器。每个Pod会运行在调度到的Node节点上,并保持持续运行,直到Pod被终止(根据重启策略)或删除。当出现Node故障时,故障的Pod会被调度到集群其他正常节点上继续运行。
Pod概览
Pod可以包含一个或多个 containerd app
Pod可以包含一个或多个(共享的)volume
一个Pod只有一个IP地址,这个IP地址是Pod中所有容器共享的
Kubernetes Nodes概念
Pod总是运行在Node上。所谓Node就是在Kubernetes集群中的工作服务器,可以是虚拟机也可以是物理服务器。所有的Node节点都是由Master管理的。一个Node节点可以运行多个Pods,并且Kubernetes master会自动处理调度,以便将pods分布到整个集群。Master自动调度任务会对每个节点的可用资源进行记账。
每个Kubernetes Node至少具有:
Kubelet: 负责在Kubernetes Master和Node之间通讯,负责管理主机上的Pod和容器。
一个容器运行时(container runtime),例如 Docker, rkt : 负责从镜像中心(registry)拉取容器镜像,解包容器,并运行应用程序
Node概览
使用kubectl排查问题
常用的kubectl命令如下:
kubectl get
- 列出资源kubectl describe
- 显示一个资源的详细信息kubectl logs
- 打印一个pod中的某个容器的日志kubectl exec
- 执行一个pod中某个容器中的命令
kubectl排查案例
首先检查Deployment是否成功部署了pod:
kubectl get pods
然后通过
describe
命令检查pod的详细信息:kubectl describe pods
备注
kubectl describe
可以详细观察Pod的容器: IP地址,Pod的生命周期相关事件。这个describe输出非常方便阅读
由于Kubernetes私有网络外部无法访问,则需要启动
kubectl proxy
,然后才能访问服务:kubectl proxy export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
同上案例就可以访问Pod上运行Nginx服务。
备注
请注意Kubernetes私有网络在外部无法访问,我们需要通过 Minikube对外输出应用 。