【模块一】kubernetes容器编排进阶实战之pod的调度流程,pause容器及init容器
pod的调度流程及常见状态
pod的调度流
pod的常见状态
Unschedulable:#Pod不能被调度,kube-scheduler没有匹配到合适的node节点
PodScheduled:#pod正处于调度中,在kube-scheduler刚开始调度的时候,还没有将pod分配到指定的node,在筛选出合适的节点后就会更新etcd数据,将pod分配到指定的node
Pending: #正在创建Pod但是Pod中的容器还没有全部被创建完成=[处于此状态的Pod应该检查Pod依赖的存储是否有权限挂载等。
Failed: #Pod中有容器启动失败而导致pod工作异常。
Unknown: #由于某种原因无法获得pod的当前状态,通常是由于与pod所在的node节点通信错误。
Initialized:#所有pod中的初始化容器已经完成了
ImagePullBackOff: #Pod所在的node节点下载镜像失败
Running: #Pod内部的容器已经被创建并且启动。
Ready: #表示pod中的容器已经可以提供访问服务
Error: #pod 启动过程中发生错误
NodeLost: #Pod 所在节点失联
Waiting: #Pod 等待启动
Terminating: #Pod 正在被销毁
CrashLoopBackOff:#pod崩溃,但是kubelet正在将它重启InvalidImageName:#node节点无法解析镜像名称导致的镜像无法下载
ImageInspectError:#无法校验镜像,镜像不完整导致
ErrImageNeverPull:#策略禁止拉取镜像,镜像中心权限是私有等
RegistryUnavailable:#镜像服务器不可用,网络原因或harbor宕机
ErrImagePull:#镜像拉取出错,超时或下载被强制终止
CreateContainerConfigError:#不能创建kubelet使用的容器配置
CreateContainerError:#创建容器失败
RunContainerError:#pod运行失败,容器中没有初始化PID为1的守护进程等
ContainersNotInitialized:#pod没有初始化完毕
ContainersNotReady:#pod没有准备完毕
ContainerCreating:#pod正在创建中
PodInitializing:#pod正在初始化中
DockerDaemonNotReady:#node节点decker服务没有启动
NetworkPluginNotReady:#网络插件没有启动
pause容器及init容器
pause容器简介-宿主机的namespace
-
Pause 容器,又叫 Infra 容器,是pod的基础容器,镜像体积只有几百KB 左右,配置在kubelet中,主要的功能是一个pod中多个容器的网络通信。
-
Infra 容器被创建后会初始化 Network Namespace,之后其它容器就可以加入到 Infra 容器中共享Infra 容器的网络了,因此如果一个 Pod 中的两个容器 A 和 B,那么关系如下 :
1.A容器和B容器能够直接使用 localhost 通信;
2.A容器和B容器可以可以看到网卡、IP与端口监听信息。
3.Pod 只有一个 IP 地址,也就是该 Pod 的 Network Namespace 对应的 IP 地址(由Infra 容器初始化并创建)。
4.k8s环境中的每个Pod有一个独立的IP地址(前提是地址足够用),并且此IP被当前 Pod 中所有容器在内部共享使用。
5.pod删除后Infra 容器随机被删除,其IP被回收。Pause容器共享的Namespace:
1.NET Namespace:Pod中的多个容器共享同一个网络命名空间,即使用相同的IP和端口信息。
2.IPC Namespace:Pod中的多个容器可以使用System V IPC或POSIX消息队列进行通信。
3.UTS Namespace:pod中的多个容器共享一个主机名。MNT Namespace、PID Namespace、User Namespace未共享。
pause容器简介-namespace验证
#进入到容器
[root@k8s-master1 case1-pod]#kubectl exec -it nginx sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether a6:c3:b1:0c:36:41 brd ff:ff:ff:ff:ff:ffinet 10.200.107.233/32 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::a4c3:b1ff:fe0c:3641/64 scope link valid_lft forever preferred_lft forever
/ # cat /sys/class/net/eth0/iflink
56
或者
bash-4.4# apk add ethtoolbash-4.4# ethtool -S eth0NIC statistics:peer_ifindex: 56#到pod所在的宿主机验证网卡:
[root@k8s-node3 ~]#ip link show5: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
56: calic440f455693@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-1683a021-919d-faa3-c0db-b814c55bb0f1[root@k8s-node3 ~]#ls /run/netns/
cni-1683a021-919d-faa3-c0db-b814c55bb0f1 cni-90ab4d6e-e15c-6c33-5d87-b33e2ed54e0d
cni-76dbc694-93ae-3c07-bd07-0b9c721f5344
[root@k8s-node3 ~]#nsenter --net=/run/netns/cni-1683a021-919d-faa3-c0db-b814c55bb0f1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether a6:c3:b1:0c:36:41 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.200.107.233/32 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::a4c3:b1ff:fe0c:3641/64 scope link valid_lft forever preferred_lft foreverroot@k8s-node2:~# sudo nsenter --net=/run/netns/cni-80955d5c-421a-a0ad-9889-a5bb5bf934d9 ifconfig #containerd、主机名解析
root@k8s-node2:~# sudo nsenter --net=/run/docker/netns/5593316039dd ifconfig #dodcker
pause容器-配置示例
1.在有docker或者containerd主机测试,准备nginx配置文件,并配置动静分离:
[root@jenkins test-nginx]#pwd
/root/test-nginx
[root@jenkins test-nginx]#cat nginx.conf
error_log stderr;
events { worker_connections 1024; }
http {access_log /dev/stdout;server {listen 80 default_server;server_name localhost;location / {index index.html index.php;root /usr/share/nginx/html;}location ~ \.php$ {root /usr/share/nginx/html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}}2.部署pause容器
[root@jenkins ~]nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
[root@jenkins ~]nerdctl run -d -p 80:80 --name pause-container-test \ registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.83.准备测试web页面:
[root@jenkins html]#ll
total 8
-rw-r--r-- 1 root root 35 Nov 23 15:31 index.html
-rw-r--r-- 1 root root 26 Nov 23 15:30 index.php
[root@jenkins html]#cat *
<h1>pause container web test</h1><?phpphpinfo();
?>4.部署nginx 容器,并使用paush容器网络:
[root@jenkins html]#
docker run -d --name nginx-container-test \
-v `pwd`/nginx.conf:/etc/nginx/nginx.conf \
-v `pwd`/html:/usr/share/nginx/html \
--net=container:pause-container-test \
nginx
5.部署php容器,并使用paush容器网络:
[root@jenkins html]#
docker run -d --name php-container-test \
--net=container:pause-container-test \
-v `pwd`/html:/usr/share/nginx/html \
php:5.6.40-fpm
pause容器-验证:
init容器-简介
-
init容器的作用:
1.可以为业务容器提前准备好业务容器的运行环境,比如将业务容器需要的配置文件提前生成并放在指定位置、检查数据权限或完整性、软件版本等基础运行环境。。 2.可以在运行业务容器之前准备好需要的业务数据,比如从OSS下载、或者从其它位置copy。
3.检查依赖的服务是否能够访问。
-
init容器的特点: 1.一个pod可以有多个业务容器还能在有多个init容器,但是每个init容器和业务容器的运行环境都是隔离的。 2.init容器会比业务容器先启动。 3.init容器运行成功之后才会继续运行业务容器。 4.如果一个pod有多个init容器,则需要从上到下逐个运行并且全部成功,最后才会运行业务容器。 5.init容器不支持探针检测(因为初始化完成后就退出再也不运行了)。
[root@k8s-master1 case1-init-container]#cat 1-init-container.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:labels:app: myserver-myapp name: myserver-myapp-deployment-namenamespace: myserver
spec:replicas: 1 selector:matchLabels:app: myserver-myapp-frontendtemplate:metadata:labels:app: myserver-myapp-frontendspec:containers:- name: myserver-myapp-containerimage: nginx:1.20.0 #imagePullPolicy: AlwaysvolumeMounts:- mountPath: "/usr/share/nginx/html/myserver"name: myserver-data- name: tz-configmountPath: /etc/localtimeinitContainers:- name: init-web-dataimage: centos:7.9.2009command: ['/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-configmountPath: /etc/localtime- name: change-data-ownerimage: busybox:1.28command: ['/bin/sh','-c',"/bin/chmod 644 /data/nginx/html/myserver/* -R"]volumeMounts:- mountPath: "/data/nginx/html/myserver"name: myserver-data- name: tz-configmountPath: /etc/localtimevolumes:- name: myserver-datahostPath:path: /tmp/data/html- name: tz-confighostPath:path: /etc/localtime ---
kind: Service
apiVersion: v1
metadata:labels:app: myserver-myapp-servicename: myserver-myapp-service-namenamespace: myserver
spec:type: NodePortports:- name: httpport: 80targetPort: 80nodePort: 30080selector:app: myserver-myapp-frontend
Health Check
由发起者对容器进行周期性健康状态检测。
周期检测相当于人类的周期性体检
每次检测相当于人类每次体检的内容
[root@k8s-master1 case2-docker-container-healthy-check]#cat 1.docker-compose.yaml
version: '3.6'
services:nginx-service:image: nginx:1.20.2 container_name: nginx-web1expose:- 80- 443ports:- "80:80"- "443:443"restart: alwayshealthcheck: #添加服务健康状态检查test: ["CMD", "curl", "-f", "http://localhost"]interval: 5s #健康状态检查的间隔时间,默认为30stimeout: 5s #单次检查的失败超时时间,默认为30sretries: 3 #连续失败次数默认3次,当连续失败retries次数后将容器置为unhealthy状态start_period: 60s #60s后每间隔interval的时间检查一次,连续retries次后才将容器置为unhealthy状态, 但是start_period时间内检查成功就认为是检查成功并装容器置于healthy状态
[root@k8s-master1 case2-docker-container-healthy-check]#cat 2.Dockerfile
FROM nginx:1.20.2maintainer "jack 2973707860@qq.com"HEALTHCHECK --interval=5s --timeout=2s --retries=3 \CMD curl --silent --fail localhost:80 || exit 1