k8s最小调度单元pod

k8s最小调度单元pod

软件版本
docker最新版
kubernetes1.23.1
calico3.25
节点IP系统功能CPU内存硬盘
node110.80.10.1centos7.9k8s-master4核心8GB20GB
node210.80.10.2centos7.9k8s-node4核心8GB20GB

pod定义:

pod是k8s中的最小调度单元,k8s是通过定义一个pod的资源,然后在pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个pod封装一个容器(也可以封装多个容器),pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。

pod相当于一个逻辑主机,比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后,我们就可以定义一个pod资源,在pod里定义一个把tomcat容器,所以pod充当的是一个逻辑主机的角色。

pod工作方式:

在k8s中,所有的资源都可以使用一个yaml文件来创建,创建pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建pod(不常用)。

node1

创建pod,pod删除无法恢复:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mkdir /root/pod && cd /root/pod
# vim pod-tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomecat
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat-java
ports:
- containerPort: 8080
image: tomcat:8.5.34-jre8
imagePullPolicy: IfNotPresent
1
2
3
4
# kubectl apply -f pod-tomcat.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomecat 1/1 Running 0 7s 10.244.36.70 k8s-node1 <none> <none>

测试pod后删除:

1
2
# curl 10.244.36.70:8080
# kubectl delete -f pod-tomcat.yaml

控制器创建pod:

常见的管理pod的控制器:replicaset、deployment、job、cronjob、daemonset、statefulset。控制器管理的pod可以确保pod始终维持在指定的副本数运行。

创建deployment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
labels:
app: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: nginx:1.19.10
imagePullPolicy: IfNotPresent
1
2
3
4
5
6
7
8
# kubectl apply -f nginx-deploy.yaml
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-test-b699b59c7-kn9bs 1/1 Running 0 32s
nginx-test-b699b59c7-tllzw 1/1 Running 0 32s
# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 2/2 2 2 44s

删除pod会自动创建新的:

1
2
3
4
5
# kubectl delete pods nginx-test-b699b59c7-kn9bs
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-test-b699b59c7-bw6nj 1/1 Running 0 10s
nginx-test-b699b59c7-tllzw 1/1 Running 0 2m6s

测试deployment后删除:

1
2
3
4
5
6
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-b699b59c7-bw6nj 1/1 Running 0 76s 10.244.36.73 k8s-node1 <none> <none>
nginx-test-b699b59c7-tllzw 1/1 Running 0 3m12s 10.244.36.71 k8s-node1 <none> <none>
# curl 10.244.36.73:80
# kubectl delete -f nginx-deploy.yaml

k8s创建pod流程:

master节点:kubectl—>kube-api—>kubelet—>cri容器环境初始化

  • 第一步:客户端提交创建pod的请求,可以通过调用api server的rest api接口,也可以通过kubectl命令行工具。如kubectl apply -f filename.yaml(资源清单文件)。

  • 第二步:api server接收到pod创建请求后,会将yaml中的属性信息(metadata)写入etcd。

  • 第三步:api server触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给api server,api server将绑定的node信息写入etcd。调度器用一组规则过滤掉不符合要求的主机。比如pod指定了所需要的资源量,那么可用资源比pod需要的资源量少的主机会被过滤掉。

  • 第四步:api server又通过watch机制,调用kubelet,指定pod信息,调用docker api创建并启动pod内的容器。

  • 第五步:创建完成之后反馈给kubelet,kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd。

yaml字段含义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vim pod-tomcat.yaml
apiVersion: v1
kind: Pod # 创建资源
metadata:
name: tomecat # Pod名字
namespace: default # Pod命名空间
labels:
app: tomcat # Pod标签
spec:
containers:
- name: tomcat-java # Pod容器名字
ports:
- containerPort: 8080 # 容器保留端口
image: tomcat:8.5.34-jre8 # 容器使用镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略

创建pod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vim pod-first.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-first
namespace: default
labels:
app: tomcat-popd-first
spec:
containers:
- name: tomcat-first
ports:
- containerPort: 8080
image: tomcat:8.5.34-jre8
imagePullPolicy: IfNotPresent
1
2
3
4
# kubectl apply -f pod-first.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-first 1/1 Running 0 2m 10.244.36.74 k8s-node1 <none> <none>

查看pod日志:

1
# kubectl logs pod-first -c tomcat-first
  • -c:指定pod里面的容器。

进入pod:

1
2
# kubectl exec -it pod-first -- /bin/bash
# kubectl exec -it pod-first -c tomcat-first -- /bin/bash

删除pod:

1
# kubectl delete -f pod-first.yaml

kubectl命令创建pod:

1
2
3
4
5
# kubectl run tomcat --image=tomcat:8.5.34-jre8 --image-pull-policy='IfNotPresent' --port=8080
# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 15s
# kubectl delete pods tomcat