pod是什么?
pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程,而Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的
pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式
pod的网络?
Pod是有IP地址的,每个pod都被分配唯一的IP地址(IP地址是靠网络插件calico、flannel、weave等分配的),POD中的容器共享网络名称空间,包括IP地址和网络端口。 Pod内部的容器可以使用localhost相互通信。 Pod中的容器也可以通过网络插件calico与其他节点的Pod通信
Pod的存储?
创建Pod的时候可以指定挂载的存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的
Pod的工作方式?
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件
删除Pod?
直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的
Pod资源的创建过程?
简单的YAML文件的书写格式?
apiVersion: v1 #api版本
kind: Pod #创建的资源
metadata:
name: tomcat-test #Pod的名字
namespace: default #Pod所在的名称空间
labels:
app: tomcat #Pod具有的标签
spec:
containers:
- name: tomcat-java #Pod里容器的名字
ports:
- containerPort: 8080 #容器暴露的端口
image: tomcat-8.5-jre8:v1 #容器使用的镜像
imagePullPolicy: IfNotPresent #镜像拉取策略
可以通过kubectl explain 查看定义Pod资源包含哪些字段,例如kubectl explain pod,可以看到这些字段在我们上述的例子里都有
也可以具体查看字段如何定义,例如kubectl explain pod.metadata
记住命令就可以查看我们想要查看的字段
什么是命名空间?
k8s支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间,命名空间namespace是k8s集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的命名空间
k8s集群默认提供了几个名称空间用于特定目的,例如,kube-system主要用于运行系统级资源,存放k8s一些组件的。而default则为那些未指定名称空间的资源操作提供一个默认值
创建namespace:kubectl create namespace 名字
查看namespace:kubectl get namespace
查看指定的namespace的详细信息:kubectl describe namespace 名称空间的名字
查看指定节点的详细信息:kubectl describe nodes hd3.com
删除namespace资源会级联删除其包含的所有其他资源对象
应用场景?
它适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间
我们kybectl get pods 查看的是默认的namespace中的default
切换命名空间:kubectl config set-context --current --namespace=名称空间的名字
也可以进行-n指定查看kubectl get pods -n kube-system
什么是标签?
标签其实就是一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够表示对象的特殊特点,就是一眼就看出了这个Pod是干什么的,标签可以用来划分特定的对象(比如版本,服务类型等),标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。创建标签之后也可以方便我们对资源进行分组管理。如果对pod打标签,之后就可以使用标签来查看、删除指定的pod。在k8s中,大部分资源都可以打标签
对已经存在的pod打上标签:kubectl label pods pod名称 release=v1(标签)
对node节点打上标签:kubectl label nodes hd3.com disk=ceph
查看默认namespace下所有pod资源的标签:kubectl get pods --show-labels
查看默认namespace下指定pod具有的所有标签:kubectl get pods pod名称 --show-labels
查看所有namespace下的所有pod的标签:kubectl get pods --all-namespaces --show-labels
列出默认namespace下key标签是release的pod,但不显示标签:kubectl get pods -l release
列出默认namespace下key标签是release的pod,显示标签:kubectl get pods -L release
列出默认namespace下key标签是release,值是v1的pod,但不显示标签:kubectl get pods -l release=v1
列出默认namespace下key标签是release,值是v1的pod,显示标签:kubectl get pods -L release=v1
node节点选择器?
创建pod资源的时候,pod会根据schduler进行调度,那么默认会调度到随机的一个工作节点,如果我们想要pod调度到指定节点或者调度到一些具有相同特点的node节点,怎么办呢?
可以使用pod中的nodeName或者nodeSelector字段指定要调度到的node节点
nodeName:指定pod节点运行在哪个具体的node上边
nodeSelector:指定pod调度到具有哪些标签的node节点上边
例如:和
常见pod状态?
pod的status定义在PodStatus对象中,其中有一个phase字段。它简单描述了Pod在其生命周期的阶段。熟悉Pod的各种状态对我们理解如何设置Pod的调度策略、重启策略是很有必要的,下面是一些常见的状态:
pod的重启策略?
pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据 RestartPolicy 的设置来进行相应的操作,包括以下三种,默认为Always
Always:当容器失败时,由kubelet自动重启该容器。
OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
Never:不论容器运行状态如何,kubelet都不会重启该容器。
我们自行编写一个简单的yaml文件pod-first.yaml,内容如下:
查看podkubectl get pods -o wide
也可以指定标签进行查看kubectl get pods -o wide -l app=tomcat-pod-first
可以查看pod日志:kubectl logs pod-first
查看pod里面指定容器的日志:kubectl logs pod-first -c tomcat-first
进入pod:kubectl exec -it pod-first -- /bin/bash
进入pod里面的指定容器:kubectl exec -it pod-first -c tomcat-first -- /bin/bash
也可以通过kubectl run创建Pod:kubectl run pod-run --image=tomcat:8.5-jre8-alpine --image-pull-policy='IfNotPresent' --port=8080