K8s:Pod
pod

pod创建流程
大概步骤
1、创建pod、写入到etcd
2、Schedule负责调度
3、node节点根据配置创建pod
详细步骤
1、客户端(一般是通过kubnectl或者自己开发的客户端)、调用apiserver、去创建pod(经过一系列的认证、鉴权、准入)、验证你的身份是否合法、密钥是不是正确、有没有增删改查权限(如果没有直接报错了:403)、权限没有问题、就会把创建pod的事件写入到etcd。
2、成功写入到etcd之后、kube-Schedule负责调度、会watch apiserver、会及时发现创建pod的事件、然后进行调度、(使用什么算法、预选和优选策略)(先预选:把不符合条件的node节点先过滤掉)(再到优选阶段:把剩下的节点进行打分、选择合适的节点、把pod分配给合适的节点。)(bind pod: 把某个node节点绑定pod)、成功之后、把结果返回给apiserver、apiserver再次写入到etcd。(写成功之后告诉kube-Schedule)
3、node节点拿到绑定事件、然后由kubelet调容器运行时、去创建pod。
调用运行时、会有一系列的初始化:
1、初始化pod运行环境(创建configmap等等、从apiserver把yaml文件中指定的配置文件下载下来)
2、configmap
3、Secret
4、yaml文件中的网络存储挂载到宿主机
5、通过utfs、把文件统一挂载到根目录、形成一个统一的运行环境、然后运行容器
4、运行起来之后、kubelet先把结果返回给apiserver。(然后pod状态变成running)、拿到pod事件之后(pod是running还是error、或者imagepull)、当apiserver拿到事件之后、再次写入etcd、并把结果返回给kubelet。
创建pod:
kubectl调用容器运行时创建pod
kube-proxy拿到网络规则调用内核创建。
网络规则:至于pod创建的这些网络规则就是由kube-proxy完成的、kube-proxy通过apiserver拿到映射信息、调用内核创建iptables或者ipvs这些网络规则。
规则是什么:端口暴漏信息、yaml文件指定的映射端口、端口信息由kube-proxy在每个node本机进行维护的。
###yaml文件举例如下:
apiVersion: v1
kind: Service
metadata:
name: myserver-myapp-frontend
namespace: myserver
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30018
protocol: TCP
type: NodePort
selector:
app: myserver-myapp-frontend
pod常见状态
Unschedulable #Pod不能被调度,kube-scheduler没有匹配到合适的node节点
pending #权限、卷挂载等问题
failed #容器配置问题、探针检查失败、导致失败、没有启动(已经调度成功、挂载成功)
unknown #node节点一段时间没有和apiserver交互(很少见)
init #正在进行容器初始化
Initialized ##所有pod中的初始化容器已经完成了
ImagePullBackOff #Pod所在的node节点下载镜像失败
Running #Pod内部的容器已经被创建并且启动。
Ready #表示pod中的容器已经可以提供访问服务
Error #启动过程中发生错误
NodeLost #pod所在节点失恋
Waiting #Pod等待启动
Terminating #Pod正在被销毁
CrashLoopBackOff #pod崩溃,但是kubelet正在将它重启
nvalidImageName #node节点无法解析镜像名称导致的镜像无法下载
ImageInspectError #无法校验镜像,镜像不完整导致
ErrImageNeverPull #策略禁止拉取镜像,镜像中心权限是私有等(拉取镜像没权限)
RegistryUnavailable #镜像服务器不可用,网络原因或(harbor宕机)
ErrImagePull #镜像拉取出错,超时或下载被强制终止
CreateContainerConfigError #不能创建kubelet使用的容器配置
CreateContainerError: #创建容器失败
RunContainerError:
#pod运行失败,容器中没有初始化PID为1的守护进程等ContainersNotInitialized:#pod没有初始化完毕
ContainersNotReady #pod没有准备完毕
ContainerCreating #pod正在创建中
PodInitializing #pod正在初始化中
DockerDaemonNotReady #node节点decker服务没有启动(容器运行时没有启动、找不到contianerd)
NetworkPluginNotReady #网络插件没有启动
pause容器
作用
主要是给pod初始化底层运行环境:NET UTS IPC
一个pod有多个容器:容器地址是一样的、
实验演示
1、下载pause镜像
2、启动pause容器、映射80端口、创建一个网络
3、创建nginx容器、挂载conf配置文件、html文件、共享上一个pause容器的网络
4、创建php容器、也共享pause容器网络
创建好之后:
1、访问80端口、会返回数据。原因:是因为nginx和pause是在同一个namespace、借用了pause已经创建好的net-namespace、或者是利用了另外一个容器的namespace(在另外一个namespace里面、pause容器没有监听80端口、)
2、启动php、需要请求nginx、然后转发给本地的9000、去处理php请求。直接访问9000、请求就到php了
在容器里面查看
注意:主要就是为了验证容器的网络共享、ip是相同的
查看端口
1、修改源(阿里云debian) apt update
2、下载net-tools
3、然后查看端口和ip netstat -tanlp
4、查看网络是一样的、虽然是三个namespace、但是网络是一样的
使用 nerdctl inspect 容器id
5、删除容器(强制删除)
nerdctl rm -fv 容器id 容器id 容器id
K8s调用容器运行时
1、配置文件
2、容器运行时
原理要知道:底层的pause容器是kubelet自动初始化的、不需要手动做、要知道这个底层是pause初始化的网络运行环境。(用户、文件系统、PID是隔离开的)
配置:pause镜像是配置kubelet的service文件里面的(最早时候是参数传递给kubelet的)
init容器
注意:验证init容器
两个init容器、一个业务容器
1、编写一个html文件、睡眠10秒、然后输出到文件内容、需要挂载
2、添加权限、也需要挂载
init容器顺序执行(先创建文件、再添加权限)
3、业务容器(然后再写一个service、方便访问 1 中的html数据)
yaml文件
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
labels:
app: myserver-myapp
name: myserver-myapp-deployment-name
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-myapp-frontend
template:
metadata:
labels:
app: myserver-myapp-frontend
spec:
containers:
- name: myserver-myapp-container
image: nginx:1.20.0
#imagePullPolicy: Always
volumeMounts:
- mountPath: "/usr/share/nginx/html/myserver"
name: myserver-data
- name: tz-config
mountPath: /etc/localtime
initContainers:
- name: init-web-data
image: centos:7.9.2009
command: ['/bin/bash','-c',"for i in `seq 1 10`;do echo '<h1>'$i web page at $(date +%Y%m%d%H%M%S) '<h1>' >> /data/nginx/html/myserver/index.html;sleep 1;done"]
volumeMounts:
- mountPath: "/data/nginx/html/myserver"
name: myserver-data
- name: tz-config
mountPath: /etc/localtime
- name: change-data-owner
image: busybox:1.28
command: ['/bin/sh','-c',"/bin/chmod 644 /data/nginx/html/myserver/* -R"]
volumeMounts:
- mountPath: "/data/nginx/html/myserver"
name: myserver-data
- name: tz-config
mountPath: /etc/localtime
volumes:
- name: myserver-data
hostPath:
path: /tmp/data/html
- name: tz-config
hostPath:
path: /etc/localtime
---
kind: Service
apiVersion: v1
metadata:
labels:
app: myserver-myapp-service
name: myserver-myapp-service-name
namespace: myserver
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
selector:
app: myserver-myapp-frontend

浙公网安备 33010602011771号