1.k8s核心资源Pod介绍?
K8s官方文档:[https://kubernetes.io/](https://kubernetes.io/)
K8s中文官方文档: [https://kubernetes.io/zh/](https://kubernetes.io/zh/)
K8s Github地址:[https://github.com/kubernetes/](https://github.com/kubernetes/)
1.1 Pod是什么?
官方文档:https://kubernetes.io/docs/concepts/workloads/pods/
Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体
的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当
于运行在虚拟机的进程。
Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。
白话解释:
可以把pod看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里的豆子,它们吸收着共同的营养成分、肥料、水分等,Pod和容器的关系
也是一样,Pod里面的容器共享pod的网络、存储等。
pod相当于一个逻辑主机--比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后
,我们就可以定义一个pod资源,在pod里定义一个把tomcat容器,所以pod充当的是一个逻辑主机的角色。
1.1.1 Pod如何管理多个容器?
Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度
,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web
服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件。
一些Pod有init容器和应用容器。 在应用程序容器启动之前,运行初始化容器
1.1.2 Pod网络
Pod是有IP地址的,每个pod都被分配唯一的IP地址(IP地址是靠网络插件calico、flannel、weave等分配的),POD中的容器共享网络名称空间,
包括IP地址和网络端口。 Pod内部的容器可以使用localhost相互通信。 Pod中的容器也可以通过网络插件calico与其他节点的Pod通信。
1.1.3 Pod存储
创建Pod的时候可以指定挂载的存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数
据还是会存在的。
1.2 Pod工作方式
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。
1.2.1 自主式Pod
所谓的自主式Pod,就是直接定义一个Pod资源,如下:
[root@k8s01 ~]# cat pod-tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-test
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat-java
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
kubectl apply -f pod-tomcat.yaml
[root@k8s01 ~]# kubectl get pods -o wide -l app=tomcat
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-test 1/1 Running 0 2m2s 10.244.236.132 k8s02 <none> <none>
#通过上面可以看到,如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,
所以今后我们接触的Pod,都是控制器管理的。
1.2.2 控制器管理的Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。
如,通过Deployment管理Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。
如,通过Deployment管理Pod
[root@k8s01 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
#更新资源清单文件
kubectl apply -f nginx-deploy.yaml
#查看Deployment
[root@k8s01 ~]# kubectl get deploy -l app=nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 2/2 2 2 86s
#查看Replicaset
[root@k8s01 ~]# kubectl get rs -l app=nginx
NAME DESIRED CURRENT READY AGE
nginx-test-7d464f958f 2 2 2 2m26s
#查看pod
[root@k8s01 ~]# kubectl get pods -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-7d464f958f-d2fsj 1/1 Running 0 2m49s 10.244.236.134 k8s02 <none> <none>
nginx-test-7d464f958f-p4cd2 1/1 Running 0 2m49s 10.244.236.133 k8s02 <none> <none>
#删除
kubectl delete pods nginx-test-7d464f958f-d2fsj
[root@k8s01 ~]# kubectl get pods -o wide -l app=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-7d464f958f-p4cd2 1/1 Running 0 4m6s 10.244.236.133 k8s02 <none> <none>
nginx-test-7d464f958f-t5lbd 1/1 Running 0 6s 10.244.236.135 k8s02 <none> <none>
#发现重新创建一个新的pod
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量