K8S:Pod概念、分类及相关的策略
文章目录
- 一.pod相关概念
- 1.Pod基础概念
- 2.Kubrenetes集群中Pod两种使用方式
- 3.pause容器的Pod中的所有容器共享的资源
- 4.kubernetes中的pause容器主要为每个容器提供功能:
- 5.Kubernetes设计这样的Pod概念和特殊组成结构有什么用意
- 6.Pod分为两类:
- 二.Pod容器的分类
- 1.基础容器(infrastructure container)
- (1)作用
- (2)配置
- 2.初始化容器(initcontainers)
- (1)概念
- (2)Init 容器与普通的容器的差异
- (3)Init 的容器作用
- 3、应用容器(Maincontainer)
- (1)概念
- (2)示例
- 三.镜像拉取策略(image PullPolicy)
- 1.概念
- 2.用户指定的方式
- 四.重启策略
- 1.重启策略概念
- 2.重启策略分类
- 3.重启策略示例
- 五.部署harbor创建私有项目
- 1.部署前操作
- 2.部署 Harbor 服务
- 3.在 Harbor 中创建一个新项目
- 4.登录测试
- 5.创建凭证并查看上传镜像
一.pod相关概念
1.Pod基础概念
Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。
总:pod是k8s 最小的创建和运行单元
2.Kubrenetes集群中Pod两种使用方式
(1)一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
(2)在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器-中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。
Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(也可称为父容器)pause就是为了管理Pod容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程),并回收僵尸进程。
总:一个pod包含几个容器————————一个根容器/父容器/基础容器
pod里面容器共享目前使用的经常使用的有:net uts ipc 命名空间 除此之外还有mnt、pid、user
pause容器里面有一个或者多个应用容器/业务容器
3.pause容器的Pod中的所有容器共享的资源
(1)网络:
每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
(2)存储:
Pod可以指定多个共享的Volume。Pod中的所有容器都可以访问共享的Volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。
总:每个Pod都有一个特殊的被称为“基础容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户应用容器。
4.kubernetes中的pause容器主要为每个容器提供功能:
(1)在pod中担任Linux命名空间(如网络命令空间)共享的基础;
(2)启用PID命名空间,开启init进程。
5.Kubernetes设计这样的Pod概念和特殊组成结构有什么用意
(1)原因一:在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了,此时是算整体挂了么?那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
(2)原因二:Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。
6.Pod分为两类:
●自主式Pod
这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。
●控制器管理的Pod
Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。
总:k8创建pod分为两种:(1)自主式/静态pod:不被控制器管理的pod,没有自愈能力,一旦pod挂了,不会被重新拉起,而且副本数量也不会因为达不到期望值而创建新的pod(2)控制器管理的pod:被控制器管理的pod,有自愈能力,一旦pod挂了,会重新拉起,而且副本数量会因为达不到期望值而创建新的pod
二.Pod容器的分类
1.基础容器(infrastructure container)
(1)作用
维护整个 Pod 网络和存储空间
(2)配置
#node 节点中操作
#启动一个Pod时,k8s会自动启动一个基础容器
cat /opt/kubernetes/cfg/kubelet
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
#每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户是透明的
docker ps -a
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 "/pause"
2.初始化容器(initcontainers)
(1)概念
Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。
(2)Init 容器与普通的容器的差异
●Init 容器总是运行到成功完成为止
●每个 Init 容器都必须在下一个 Init 容器启动之前成功完成启动和退出
如果 Pod 的 Init 容器失败,k8s 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的重启策略(restartPolicy)为 Never,它不会重新启动。
(3)Init 的容器作用
因为init容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:
●Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具而去FROM 一个镜像来生成一个新的镜像。
●Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
●应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
●Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
●由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,
直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
3、应用容器(Maincontainer)
(1)概念
初始化完成之后才启动,启动完成之后会启动业务是并行启动
官网示例:
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
(2)示例
#为了实验环境简洁,将之前创建的pod删除
#查看目前有的pod
kubectl get pod
#删除之前创建的pod
kubectl delete deployments.apps --all
cd /opt/
mkdir pod
cd pod/
#创建pod资源
vim demo01.yamlapiVersion: v1
kind: Pod
metadata: # 配置 Pod 的元数据,例如名称和标签name: myapp-podlabels:app: myapp
spec: #配置 Pod 的规范containers: #定义 Pod 中的容器- name: myapp-container #容器的名称。image: busybox:1.28 #容器使用的镜像command: ['sh', '-c', 'echo The app is running! && sleep 3600'] #容器启动时要执行的命令,myapp-container 容器执行的命令是会首先输出一个消息 "The app is running!",然后让容器休眠 3600 秒initContainers: #定义 Pod 中的初始化容器,这些容器在其他容器启动之前运行- name: init-myservice #初始化容器的名称image: busybox:1.28 #初始化容器使用的镜像command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']- name: init-mydbimage: busybox:1.28command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;'] #初始化容器启动时要执行的命令,这些命令会检查 myservice 和 mydb 的 DNS 记录是否可用,如果不可用则等待 2 秒钟,然后继续检查,直到可用。
这个例子是定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init容器都启动完成,Pod 将启动 spec 中的应用容器。
#创建
kubectl apply -f demo01.yaml
#查看创建的pod
kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 8m28s#这里的输出结果 Pod 当前的状态是未就绪状态,其中 Init 容器的运行状态是未就绪。
Pod 的就绪状态(READY)是指 Pod 中所有的容器都已经启动并且准备好接收请求。在您的输出中,Pod 中只有一个容器("myapp-container")的就绪状态为0/1,这意味着该容器目前还没有启动就绪。
另一方面,Init 容器是在主容器("myapp-container")启动之前运行的一组容器。在您的输出中,Init 容器有两个:init-myservice 和 init-mydb。而 Init 容器的运行状态为 0/2,表示两个 Init 容器都还没有完成运行。
这些状态可能由多种因素造成,比如 Init 容器出错、容器镜像无法拉取、或是缺少资源。可以使用 kubectl describe pod myapp-pod 命令来获取有关 Pod 状态的详细信息,以便确定具体的问题和解决方法。
kubectl describe pod myapp-pod
#查看相关日志
kubectl logs myapp-pod -c init-myservice
#排查首先看k8s是否起来
kubectl get pods -n kube-system
#查看后running域名解析正常,但还是解析不正常,缺少解析,需创建解析
#创建解析
vim demo01_svc.yamlapiVersion: v1
kind: Service
metadata:name: myservice
spec:ports:- protocol: TCPport: 80targetPort: 9376
kubectl apply -f demo01_svc.yaml
或
kubectl create -f demo01_svc.yaml
kubectl get pod,svc
kubectl get pods -n kube-system
kubectl get pods
#再次查看创建的过程
kubectl describe pod myapp-pod
#创建mydb的解析
vim demo01_svc-mydb.yamlapiVersion: v1
kind: Service
metadata:name: mydb
spec:ports:- protocol: TCPport: 80targetPort: 9377
kubectl create -f demo01_svc-mydb.yaml
kubectl get pods
或
kubectl get pod,svc
#在创建的过程中如果遇到起不来的pod可以使用查看相关的操作过程
kubectl describe pod myapp-pod
kubectl logs myapp-pod -c init-myservice
#如果遇到镜像拉取不下来的话查看节点状态是否Ready
kubectl get node
特别说明:
●在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容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。
总:三种容器总括:(1)pause容器:给pod中的所有应用容器提供网络(共享ip)和存储(共享存储)资源的共享,作为PID=1的进程(INIT进程),管理整个pod中容器组的生命周期(2)初始化容器(init容器):阻塞或者延迟应用的容器的启动,可以为应用事先提供好运行环境和工具。多个int容器时是串行的启动的,每个init容器必须在下一个int容器启动前完成启动和退出(3)应用容器(main容器):在所有的INIT容器成功启动和退出后应用容器才会启动,并行启动,提供应用程序的业务
三.镜像拉取策略(image PullPolicy)
1.概念
Pod 的核心是运行容器,必须指定容器引擎,比如 Docker,启动容器时,需要拉取镜像,k8s 的镜像拉取策略可以由用户指定
2.用户指定的方式
(1)IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略
(2)Always:每次创建 Pod 都会重新拉取一次镜像;
(3)Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。
注意:对于标签为“:latest”的镜像文件,其默认的镜像获取策略即为“Always”;而对于其他标签的镜像,其默认策略则为“IfNotPresent”。
官方示例:
https://kubernetes.io/docs/concepts/containers/images
vim demo02.yamlapiVersion: v1
kind: Pod
metadata:name: pod-demo02
spec:containers:- name: nginximage: nginx:1.14imagePullPolicy: IfNotPresentcommand: [ 'sh','-c',"echo", "SUCCESS" ]
kubectl apply -f demo02.yaml
#查看拉取策略,指定策略类型,默认需要修改默认方式
kubectl edit pod pod-demo02
#master01 上操作,操作之前确保自己的上面有nginx的pod,如没有可创建
vim nginx.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: defaultlabels:app: rnginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
---apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 32355selector:app: nginx
kubectl apply -f nginx.yaml
#创建好之后再做修改
kubectl edit deployment/nginx-deployment......template:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.15.4imagePullPolicy: IfNotPresent #镜像拉取策略为 IfNotPresentname: nginxports:- containerPort: 80protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: Always #Pod的重启策略为 Always,默认值schedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
......#保存退出
#创建测试案例
mkdir /opt/demo
cd /opt/demovim pod1.yamlapiVersion: v1
kind: Pod
metadata:name: pod-test1
spec:containers:- name: nginximage: nginximagePullPolicy: Alwayscommand: [ "echo", "SUCCESS" ]
kubectl create -f pod1.yamlkubectl get pods -o wide
pod-test1 0/1 CrashLoopBackOff 2 100s 10.244.2.37 node01 <none> <none>
#此时 Pod 的状态异常,原因是 echo 执行完进程终止,容器生命周期也就结束了
kubectl describe pod pod-test1
可以发现 Pod 中的容器在生命周期结束后,由于 Pod 的重启策略为 Always,容器再次重启了,并且又重新开始拉取镜像
#修改 pod1.yaml 文件
cd /opt/demo
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test1
spec:containers:- name: nginximage: nginx:1.14 #修改 nginx 镜像版本imagePullPolicy: Always#command: [ "echo", "SUCCESS" ] #删除
#删除原有的资源
kubectl delete -f pod1.yaml
#更新资源
kubectl apply -f pod1.yaml
#查看 Pod 状态
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-test1 1/1 Running 0 40s 10.244.2.39 node01 <none> <none>
#在任意 node 节点上使用 curl 查看头部信息
curl -I http://10.244.2.39
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Thu, 14 Sep 2023 09:00:41 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT
Connection: keep-alive
ETag: "5c0692e1-264"
Accept-Ranges: bytes
总:pod镜像拉取策略 (imagePullPolicy)3种
(1) IfNotPresent:优先使用本地已存在的镜像,如本地没有则从从库拉取镜像
(2)Always:总是从仓库拉取镜像,无论本地是否已存在镜像
(3)Never:总是不从仓库拉取镜像,仅使用本地的镜像
注意:image:
nginx:latest 镜像的标签为latest或者无标签,默认的饶像拉取的策略为Always
nginx:1.14 镜像的标签为非latest,默认的镜像拉取的策略为 IfNotPresent
四.重启策略
1.重启策略概念
当 Pod 中的容器退出时通过节点上的 kubelet 重启容器。适用于 Pod 中的所有容器。
2.重启策略分类
(1)Always:当容器终止退出后,总是重启容器,默认策略
(2)OnFailure:当容器异常退出(退出状态码非0)时,重启容器;正常退出则不重启容器
(3)Never:当容器终止退出,从不重启容器。
#注意:K8S 中不支持重启 Pod 资源,只有删除重建
#查看重启策略
kubectl edit pod myapp-pod
......restartPolicy: Always
3.重启策略示例
vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: foo
spec:containers:- name: busyboximage: busyboxargs:- /bin/sh- -c- sleep 30; exit 3
kubectl apply -f pod3.yaml
#查看Pod状态,等容器启动后30秒后执行exit退出进程进入error状态,就会重启次数加1
kubectl get pods
kubectl delete -f pod3.yaml
vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: foo
spec:containers:- name: busyboximage: busyboxargs:- /bin/sh- -c- sleep 30; exit 3restartPolicy: Never#注意:跟container同一个级别
kubectl apply -f pod3.yaml
#容器进入error状态不会进行重启
kubectl get pods -w
总:pod重启策略(restartPolicy)3种,跟container字段在同一层
(1)Always:容器退出时总是重启容器,不管返回的状态码如何,默认的pod容器重启策略
(2)Never:容器退出时从不重启容器,不管返回的状态码如何
(3)OnFailure:仅在容器异常退出时 (返回状态码为非0时) 会重启容器
五.部署harbor创建私有项目
因:企业是在私网中,拉去镜像创建项目安全
开发给了镜像包和yaml文件,运维上传到Harbor私有仓库,看yaml文件拉去的是否是私有仓库还是本地仓库,私有就在harbor,本地就将包放入到node节点
1.部署前操作
相关安装包再资源的此博客的K8S:kubeadm搭建K8S+Harbor 私有仓库中有
#在 Docker harbor 节点(192.168.198.14)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
如下载慢可以用:
#阿里云源快速
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version
#上传 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目录中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin/
2.部署 Harbor 服务
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.198.14
ui_url_protocol = httpcd /usr/local/harbor/
./install.sh
docker-compose ps
3.在 Harbor 中创建一个新项目
(1)浏览器访问:http://192.168.198.14 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
(3)填写项目名称为“summer-project”,点击“确定”按钮,创建新项目
#在每个 node 节点配置连接私有仓库(注意每行后面的逗号要添加)
vim /etc/docker/daemon.json
#进入修改地址
http://192.168.198.14
systemctl daemon-reload
systemctl restart docker
4.登录测试
#在每个 node 节点登录 harbor 私有仓库
docker login -u admin -p Harbor12345 http://192.168.198.14
#在一个 node01 节点下载 Tomcat 镜像进行推送
docker pull tomcat:8.0.52
docker images
docker tag tomcat:8.0.52 192.168.198.14/summer-project/tomcat:v1
docker images
docker push 192.168.198.14/summer-project/tomcat:v1
5.创建凭证并查看上传镜像
node01节点操作
cat /root/.docker/config.json | base64 -w 0 ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5OC4xNCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0sCgkJImh1Yi5ibHVlLmNvbSI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ=
master01操作
#创建 harbor 登录凭据资源清单,用于 K8S 访问 Harbor 私服拉取镜像所需要的密钥权限凭证 secret 资源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-pull-secret
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5OC4xNCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0sCgkJImh1Yi5ibHVlLmNvbSI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ== #复制粘贴上述查看的登陆凭据
type: kubernetes.io/dockerconfigjson
#创建 secret 资源
kubectl create -f harbor-pull-secret.yaml
#查看 secret 资源
kubectl get secret
#创建资源从 harbor 中下载镜像
cd /opt/demo
vim tomcat-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: my-tomcat
spec:replicas: 2selector:matchLabels:app: my-tomcattemplate:metadata:labels:app: my-tomcatspec:imagePullSecrets: #添加 K8S 访问 Harbor 私服拉取镜像所需要的 secret 资源选项- name: harbor-pull-secret #指定 secret 资源名称ntainers:- name: my-tomcatimage: 192.168.198.14/summer-project/tomcat:v1 #指定 harbor 中的镜像名ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: my-tomcat
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 31111selector:app: my-tomcat
node01节点操作
#删除之前在 node 节点下载的 Tomcat 镜像
docker rmi tomcat:8.0.52
docker rmi 192.168.198.14/summer-project/tomcat:v1
docker images
master节点操作
#创建资源
kubectl create -f tomcat-deployment.yamlkubectl get pods
#查看 Pod 的描述信息,可以发现镜像时从 harbor 下载的
kubectl describe pod my-tomcat-d55b94fd-29qk2
#刷新 harbor 页面,可以看到镜像的下载次数增加了
相关文章:

K8S:Pod概念、分类及相关的策略
文章目录 一.pod相关概念1.Pod基础概念2.Kubrenetes集群中Pod两种使用方式3.pause容器的Pod中的所有容器共享的资源4.kubernetes中的pause容器主要为每个容器提供功能:5.Kubernetes设计这样的Pod概念和特殊…...
【Java杂谈】#1 【MCA JAVA后端架构师】
文章目录 巧用弱引用 解决 TreadLocal内存泄漏问题P5,P6,P7Spring 巧用弱引用 解决 TreadLocal内存泄漏问题 < Treadlocal > 本地调用框架使用(Spring) IOC,AOP注解transactional,自动支持事务处理…...

Vue3路由
文章目录 Vue3路由1. 载入vue-router 库2. 实例2.1 Vue.js vue-router 实现单页应用2.2 router-link创建链接2.3 router-view显示与url对应组件2.4 <router-link> 相关属性 Vue3路由 1. 载入vue-router 库 Vue.js 路由需要载入vue-router 库 安装直接下载地址…...

Android Studio的笔记--aidl实现和调用
android AIDL接口使用 aidl实现新建aidl实现工程build.gradleproguard-rules.pro增加aidl文件 增加aidl实现aidl实现服务打开aidl服务 aidl使用新建aidl使用工程增加aidl文件使用aidl方法 相关回显 aidl实现 新建aidl实现工程 新建一个工程。工程名testaidl。包名com.lxh.tes…...
大模型从入门到应用——LangChain:代理(Agents)-[工具包(Toolkit)]
分类目录:《大模型从入门到应用》总目录 工具包是工具的集合,这些工具被设计成一起用于特定的任务,并且具有方便的加载方法。常见的工具包如下: CSV代理JiraJSON代理OpenAPI代理自然语言APIPandas数据框架代理PlayWright浏览器工…...

VR全景算不算好的创业项目?有哪些特性?
现在是全民创业的时代,大家都在找创业项目,那么什么是好的创业项目呢?有人会问VR全景算不算创业好项目呢?一般情况下好的创业项目,发展前景和市场消费群体都是比较大的,市场需求大才能满足多数消费者的需求…...
Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
一、集成Log4j2⽇志框架 从Spring5之后,Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架: 第⼀步:引⼊Log4j2的依赖 <!--log4j2的依赖--> <dependency><groupId>org.apache.logging.log4j</groupId><a…...

flink的网络缓冲区
背景 在flink的taskmanager进行数据交互的过程中,网络缓冲区是一个可以提升网络交换速度的设计,此外,flink还通过网络缓冲区实现其基于信用值credit的流量控制,以便尽可能的处理数据倾斜问题 网络缓冲区 在flink中每个taskmana…...

产品经理学习笔记
产品文档之BRD、MRD和PRD - 知乎BRD、MRD和PRD一起被认为是从市场到产品需要形成的标准规范文档: 1、BRD(Business Requirement Document),商业需求文档,是一份产品商业论证报告,基于商业目标或价值所描述的…...
【深入理解Linux锁机制】七、互斥体
系列文章: 我的圈子:高级工程师聚集地 【深入理解Linux锁机制】一、内核锁的由来 【深入理解Linux锁机制】二、中断屏蔽 【深入理解Linux锁机制】三、原子操作 【深入理解Linux锁机制】四、自旋锁 【深入理解Linux锁机制】五、衍生自旋锁 【深入理解Linux锁机制】六、信…...
UGUI画布加载优化
在Unity中,UGUI画布的加载优化可以通过以下几种方式来实现: 1. 合理使用画布渲染模式:UGUI画布有三种渲染模式,分别是Screen Space - Overlay、Screen Space - Camera和World Space。在使用时,应根据场景需求选择最适…...

SEC的下一步目标是什么?过时的证券法与加密货币行业,哪个会被先淘汰?
加密货币已经“不合规”了,尤其是其“商业模式”,至少美国证券交易委员会(SEC)主席Gary Gensler这样认为。由于这种观点在美国监管机构中普遍存在,因此涉及加密的执法行动达到历史最高水平也不足为奇。 在短短几年内,我们目睹了所…...

Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)
目录 一、独立消费者消费某一个主题数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题数据案例 1.1、案例需求 创建一个独立消费者,消费firstTopic主题中数据,所下图所示: 注意:在消费者 API 代码中必…...

笔记本多拓展出一个屏幕
一、首先要知道,自己的电脑有没有Type-c接口,支持不支持VGA 推荐: 自己不清楚,问客服,勤问。 二、显示屏与笔记本相连,通过VGA 三、连接好了,需要去配置 网址:凑合着看ÿ…...

Redis 高可用及持久化
Redis 高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供…...

Java高级: 反射
目录 反射反射概述反射获取类的字节码反射获取类的构造器反射获取构造器的作用反射获取成员变量&使用反射获取成员方法反射获取成员方法的作用 反射的应用案例 接下来我们学习的反射、动态代理、注解等知识点,在以后开发中极少用到,这些技术都是以后…...

【计算机网络】什么是WebSocket?
目录 WebSocket简介协议优点使用场景 WebSocket WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。在WebSocket API中&a…...

Apinto 网关: Go语言实现 HTTP 转 gRPC
gRPC 是由 Google 开发的一个高性能、通用的开源RPC框架,主要面向移动应用开发且基于 HTTP/2 协议标准而设计,同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输, HTTP/2 相比 HTTP1.x有以下优势: 采用二进制格式传输协议ÿ…...

【管理运筹学】第 7 章 | 图与网络分析(4,最大流问题)
系列文章目录 【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示) 【管理运筹学】第 7 章 | 图与网络分析(2,最小支撑树问题) 【管理运筹学】第 7 章 | 图与网络分析…...
linux学习总结
shell 1.在文本环境下,shell作为命令解释器,建立了用户和操作系统之间的接口。当用户键入一个命令时,shell将对该命令进行解释,并调用相应的程序。2.Linux下有多个shell,最常用的3个shell: bash tcsh zsh3.shell …...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...