当前位置:网站首页>【云原生--Kubernetes】Pod容器与镜像拉取策略
【云原生--Kubernetes】Pod容器与镜像拉取策略
2022-08-03 06:37:00 【Sq夏颜】
文章目录
前言:pod作为k8s最小资源单位,对于pod的管理也将尤为重要,本文将详细介绍pod
一. Pod容器的分类
1.1 基础容器(infrastructure container)
- 维护整个 Pod 网络和存储空间
- node 节点中操作
- 启动一个容器时,k8s会自动启动一个基础容器
1.2 初始化容器(initcontainer)
Init 容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。Init 容器与普通的容器非常像,除了以下两点:
- init 容器总是运行到成功完成为止
- 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成启动和退出
如果 Pod 的 init 容器失败,k8s 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的重启策略(restartPolicy)为 Never,它不会重新启动。
init 的容器作用
因为 init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:
- Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、 awk、python 或 dig 这样的工具而去 FROM 一个镜像来生成一个新的镜像。
- Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
- 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
- Init 容器能以不同于 Pod 内应用容器的文件系统视图运行。因此,Init 容器可具有访问 Secrets的权限,而应用容器不能够访问。
- 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod 内的所有的应用容器会并行启动。
1.3 应用容器(main container)
应用容器会在 init 容器完成并退出后并行启动。
1.4 操作示例
参考官网:init容器说明
下面的例子定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init容器 都启动完成,Pod 将启动 spec 节中的应用容器。
- 编写yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh','-c','echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh','-c','until nslookup myservice;do echo waiting for myservice; sleep2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
- 发布资源
kubectl apply -f myapp.yaml
kubectl get pod
- 查看pod创建过程
kubectl describe pod myapp-pod
发现开启 init-myservice 容器后,创建步骤停滞,查看 init-myservice 日志进一步查明原因。
- 查看pod日志
kubectl logs myapp-pod -c init-myservice
- 编写myservice.yaml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 1111
- 发布myservice.yaml
kubectl create -f myservice.yaml
在此我们可以看到init变为了,1/2,但是pod还是没有完全拉起
- 编写mydb.yaml
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 2222
- 发布mydb.yaml
kubectl create -f mydb.yaml
kubectl get pod,svc
- 查看pod详细信息
kubectl describe pod myapp-pod
- 创建过程中第一次停滞,是 init-myservice 容器启动后,未能发现 myservice 域名,无法得到解析,因此陷入循环。
- 第二次停滞,是 init-mydb 容器启动后,未能发现 mydb 域名,无法得到解析,因此再次陷入循环中。
- 在上述两个 init 容器成功并退出后,myapp-pod 才开始创建,否则 pod 无法创建。
小结
- 在 Pod 启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。
- 如果由于运行时或失败退出,将导致容器启动失败,它会根据 Pod 的 restartPolicy 指定的策略进行重试。然而,如果 Pod的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。
- 在所有的 Init 容器没有成功之前,Pod 将不会变成 Ready 状态。Init 容器的端口将不会在 Service中进行聚集。正在初始化中的 Pod 处于 Pending 状态,但应该会将 Initializing 状态设置为 true。
- 如果 Pod 重启,所有 Init 容器必须重新执行。
- 对 Init 容器 spec 的修改被限制在容器 image 字段,修改其他字段都不会生效。更改 Init 容器的 image字段,等价于重启该 Pod。
- Init 容器具有应用容器的所有字段。除了 readinessProbe,因为 **Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。**这会在验证过程中强制执行。
- 在 Pod 中的每个 app 和 Init 容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。
二. 镜像拉取策略(imagePullPolicy)
Pod的核心是运行容器,必须指定容器引擎,比如Docker,启动容器时需要拉取镜像,k8s的镜像拉取策略可以由用户指定:
- IfNotPresent:在镜像已经存在的情况下,kubelet将不再去拉取镜像,仅当本地缺失时才会从仓库中拉取,默认的镜像拉取策略。
- Alaways:每次创建Pod都会重新拉取一次镜像
- Never:Pod不会主动拉取这个镜像,仅使用本地镜像。
注意:对于标签为latest的镜像文件,其默认的镜像获取策略即为Always;而对于其他标签的镜像,其默认策略则为IfNotPresent。
2.1 使用always策略下载镜像
参考官网:镜像拉取策略说明
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
发布
kubectl apply -f test.yaml
查看pod信息
kubectl describe pod mypod
修改pod名,并再次发布
2.2 使用IfNotPresent策略下载镜像
再次修改yaml文件,更改pod名与策略
再次发布,并查看pod2信息
删除本地镜像,并再次修改yaml文件的pod名
在node节点删除镜像
2.3 使用Never策略,镜像拉取
删除本地镜像,再次修改yaml文件
三. 私有仓库部署
使用harbor私有仓库存储镜像
需要在node节点设置私有仓库地址
在harbor仓库新建一个项目xy,并上传一个镜像文件用于待会测试
查看下载次数
在k8s的所有node节点上修改私有仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.48.10"]
}
systemctl daemon-reload
systemctl restart docker
#登录私有仓库,随便选择一个node节点进行登录
docker login 192.168.48.10
#查看登录凭据
cat .docker/config.json |base64 -w 0
制作harbor认证
在master节点创建yaml文件
vim registry-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: registry-pull-secret
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjQ4LjEwIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0iCgkJfQoJfQp9
type: kubernetes.io/dockerconfigjson
测试
编写一个nginx的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: nginx
image: 192.168.48.10/xy/nginx:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginx
进行发布
kubectl apply -f nginx-deploy.yaml
kubectl get pod
在harbor仓库查看下载次数
打开浏览器进行访问:30080端口
边栏推荐
- 人脸检测和识别--face recognition包
- 亿流量大考(1):日增上亿数据,把MySQL直接搞宕机了...
- Oracle Rac 集群文件目录迁移
- 【RT_Thread学习笔记】---以太网LAN8720A Lwip ping 通网络
- Flutter | 判断 Text 组件是否显示完
- El - tree set using setCheckedNodessetCheckedKeys default check nodes, and a new check through setChecked specified node
- information_schema
- empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
- MySQL性能优化(硬件,系统配置,表结构,SQL语句)
- 力扣解法汇总622-设计循环队列
猜你喜欢
华为设备配置BFD多跳检测
【多线程进阶】--- 常见锁策略,CAS,synchronized底层工作原理,JUC,线程安全的集合类,死锁
IEEE RAL投初稿
El - table column filter functions, control columns show and hide (effect and easy to implement full marks)
CDGA|如何加强数字政府建设?
贷中存量客户的价值挖掘与分类实现,试试这一重要的场景模型
empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
c现代方法16章基础
MySQL - 触发器
The ORB - SLAM2 extracting feature points
随机推荐
tmp
第六章:存储系统
Flink对比Spark
mongodb的shell脚本
[机缘参悟-59]:《素书》-6-安于礼仪[安礼章第六]
MySQL 流程控制
信息学奥赛一本通T1446:素数方阵
PMP每日一练 | 考试不迷路-8.2(包含敏捷+多选)
戳Web3的神话?戳到铁板。
【第1天】SQL快速入门-基础查询(SQL 小虚竹)
JS 预编译
HCIP笔记整理 2022/7/20
信息学奥赛一本通T1453:移动玩具
模型训练前后显卡占用对比、多卡训练GPU占用分析【一文读懂】
Charles capture shows
solution 数仓埋点体系与归因实践
jvm 面试题
华为设备配置BFD单跳检测二层链路
HCIP笔记整理 2022/7/18
2022用户画像构建