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

posted @ 2024-07-22 21:10  姬高波  阅读(38)  评论(0)    收藏  举报