k8s最小调度单元pod 软件 版本 docker 最新版 kubernetes 1.23.1 calico 3.25
节点 IP 系统 功能 CPU 内存 硬盘 node1 10.80.10.1 centos7.9 k8s-master 4核心 8GB 20GB node2 10.80.10.2 centos7.9 k8s-node 4核心 8GB 20GB
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
进入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