5、pod 详解 (kubernetes)
pod 详解 (kubernetes)
- Pod 的基础概念
- pause 容器
- Pod 的分类与创建
- 自主式 Pod
- 控制器管理的 Pod
- 静态 Pod
- Pod容器的分类
- 基础容器(infrastructure container)
- 初始化容器(initcontainers)
- 应用容器(Maincontainer)
- 镜像拉取策略(imagePullPolicy)
- k8s 部署 harbor 创建私有项目
- 部署 harbor 仓库
- harbor 登录凭据资源清单
- 测试
Pod 的基础概念
Pod 是什么
Pod 是 kubernetes 中最小的资源管理组件,Pod 也是最小化运行容器化应用的资源对象。一个 Pod 代表着集群中运行的一个进程。
kubernetes 中其他大多数组件都是围绕着 Pod 来进行支撑和扩展 Pod 功能的,例如,用于管理 Pod 运行的 StatefulSet 和 Deployment 等控制器对象,用于暴露 Pod 应用的 Service 和 Ingress 对象,为 Pod 提供存储的 PersistentVolume 存储资源对象等。
Kubrenetes 集群中 Pod 的两种使用方式:
1、一个 Pod 中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
2、在一个 Pod 中同时运行多个容器。一个 Pod 中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个 Pod 中的容器可以互相协作成为一个 service 单位,比如一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
pause 容器
一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命名空间中的进程号为1,可直接接收并处理信号,该进程终止时容器的生命周期也就结束了。若想在容器内运行多个进程,则需要有一个类似 Linux 操作系统中的 init 进程的管控类进程,以树状结构完成多进程的生命周期管理。
由于容器间的隔离机制,运行于各自容器内的进程无法直接完成网络通信。k8s 中的 Pod 资源抽象正是用来解决此类问题,Pod 对象是一组容器的集合,这些容器共享 NET、MNT、UTS及 IPC 命名空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。
Pod 资源中针对各容器提供网络命名空间等共享机制是底层基础容器 pause 来实现的。
pause,基础容器(也可称为父容器)。这个父容器需要能够准确地知道如何去创建共享运行环境的容器,而且还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes 中,用 pause 容器来作为一个 Pod 中所有容器的父容器。这个 pause 容器有两个核心的功能,一是它提供整个 Pod 的 Linux 命名空间的基础。二来启用PID命名空间,它在每个 Pod 中都作为 PID 为1进程(init进程),并回收僵尸进程。
pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。
网络:
每个 Pod 都会被分配一个唯一的 IP 地址。Pod 中的所有容器共享网络空间,包括 IP 地址和端口。Pod 内部的容器可以使用 localhost 互相通信。Pod 中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
存储:
Pod 可以指定多个共享的 Volume。Pod 中的所有容器都可以访问共享的 Volume。Volume 也可以用来持久化 Pod 中的存储资源,以防容器重启后文件丢失。
每个 Pod 都有一个特殊的被称为“基础容器”的 Pause 容器。Pause 容器对应的镜像属于 kubelet 配置的一部分,除了 Pause 容器,每个 Pod 还包含一个或者多个紧密相关的应用容器。
kubernetes 中的 pause 容器主要为每个容器提供以下功能:
1、在 pod 中担任 Linux 命名空间(如网络命名空间)共享的基础;
2、启用 PID 命名空间,开启 init 进程。
Kubernetes 设计这样的 Pod 概念和特殊组成结构有什么用意?
1、在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器挂掉了,此时是算整体挂了么?那么引入与业务无关的 Pause 容器作为 Pod 的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
2、Pod 里的多个应用容器共享 Pause 容器的 IP,共享 Pause 容器挂载的 Volume ,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。
Pod 的分类与创建
Pod 类型:
自主式 Pod
这种 Pod 本身是不能自我修复的,当 Pod 被创建后(不论是由你直接创建还是被其他 Controller ),都会被 Kuberentes 调度到集群的 Node 上。直到 Pod 的进程终止、被删掉、因为缺少资源而被驱逐、或者 Node 故障之前这个 Pod 都会一直保持在那个 Node 上。Pod 不会自愈。如果 Pod 运行的 Node 故障,或者是调度器本身故障,这个 Pod 就会被删除。同样的,如果 Pod 所在 Node 缺少资源或者 Pod 处于维护状态,Pod 也会被驱逐。
创建
#创建 YAML 文件
vi demo1.yaml
apiVersion: v1
kind: Pod
metadata:name: demo1
spec:containers:- name: my-containerimage: nginxports:- containerPort: 80restartPolicy: Never#应用 YAML 文件
kubectl apply -f my-pod.yaml[root@master01 day1]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo1 1/1 Running 0 5m26s#删除
kubectl delete pod demo1[root@master01 day1]# kubectl delete pod demo1
pod "demo1" deleted
[root@master01 day1]# kubectl get pod
No resources found in default namespace.
控制器管理的 Pod
Kubernetes 使用更高级的称为 Controller 的抽象层,来管理 Pod 实例。Controller 可以创建和管理多个 Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个 Node 故障,Controller 就能自动将该节点上的 Pod 调度到其他健康的 Node 上。虽然可以直接使用 Pod,但是在 Kubernetes 中通常是使用 Controller 来管理 Pod 的。
创建
#创建 YAML 文件
vi demo2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: demo2
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80#应用 YAML 文件
kubectl apply -f demo2.yaml[root@master01 day1]# kubectl apply -f demo2.yaml
deployment.apps/demo2 created
[root@master01 day1]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo2-6c7f4855d6-d2c9m 1/1 Running 0 63s
demo2-6c7f4855d6-hnpm2 1/1 Running 0 63s
demo2-6c7f4855d6-kg94b 1/1 Running 0 63s#删除一个 pod
kubectl delete pod demo2-6c7f4855d6-d2c9m[root@master01 day1]# kubectl delete pod demo2-6c7f4855d6-d2c9m
pod "demo2-6c7f4855d6-d2c9m" deleted
[root@master01 day1]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo2-6c7f4855d6-4hsb8 1/1 Running 0 5s
demo2-6c7f4855d6-hnpm2 1/1 Running 0 108s
demo2-6c7f4855d6-kg94b 1/1 Running 0 108s
静态 Pod
静态 Pod 直接由特定节点上的 kubelet 进程来管理,不通过 master 节点上的 apiserver 。无法与控制器 Deployment 或者 DaemonSet 进行关联,它由 kubelet 进程自己来监控,当 pod 崩溃时重启该 pod, kubelet 也无法对他们进行健康检查。静态 pod 始终绑定在某一个 kubelet,并且始终运行在同一个节点上。kubelet 会自动为每一个静态 pod 在 Kubernetes 的 apiserver 上创建一个镜像 Pod(Mirror Pod),因此我们可以在 apiserver 中查询到该 pod,但是不能通过 apiserver 进行控制(例如不能删除)。
创建
#在 node 节点上
#二进制安装,/opt/kubernetes/cfg/kubele 文件中添加静态 pod 路径 --pod-manifest-path=/opt/manifests
vi /opt/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=192.168.110.20 \
--network-plugin=cni \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 \
--pod-manifest-path=/opt/manifests"#重启 kubelet
systemctl daemon-reload
systemctl restart kubelet#在静态 Pod 文件的管理目录下准备 Pod 的 Json 或者 Yaml 文件
vim /opt/manifests/demo3.yaml
apiVersion: v1
kind: Pod
metadata:name: static-weblabels:app: static
spec:containers:- name: webimage: nginxports:- name: webcontainerPort: 80#在master节点
kubectl get pods[root@master01 day1]# kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-192.168.110.20 1/1 Running 0 28s#删除
[root@master01 day1]# kubectl delete pod static-web-192.168.110.20
pod "static-web-192.168.110.20" deleted
[root@master01 day1]# kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-192.168.110.20 0/1 Pending 0 3s
[root@master01 day1]# kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-192.168.110.20 1/1 Running 0 23s#在 node 节点删除 yaml 文件
#在 master 节点查询
[root@master01 day1]# kubectl get pods
No resources found in default namespace.
运行中的 kubelet 周期扫描配置的目录下文件的变化,当这个目录中有文件出现或消失时创建或删除 pods。
在 Master 节点同样也可以看到该 Pod,如果执行 kubectl delete pod static-web-node01 命令删除该 Pod 发现,并不能删除。
Pod容器的分类
基础容器(infrastructure container)
功能:维护整个 Pod 网络和存储空间
工作节点:node
启动一个Pod时,k8s会自动启动一个基础容器
相关配置
cat /opt/kubernetes/cfg/kubelet[root@node01 ~]# cat /opt/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=false \
... ...
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 \
... ...
每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户是透明的
docker ps -a[root@node01 ~]# docker ps -a |grep pause
07c9af0f55e6 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 40 hours ago Up 40 hours k8s_POD_dashboard-metrics-scraper-7b59f7d4df-nvnvs_kubernetes-dashboard_52707af9-6be7-46ad-bd93-c2ee61186e48_0
08930e20b086 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 42 hours ago Up 42 hours k8s_POD_coredns-7f8c5c6967-l2tpc_kube-system_64da7ef1-1baf-40d9-8b67-4ccce6147e35_0
7c2796ff05e0 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 43 hours ago Up 43 hours k8s_POD_calico-node-rddmg_kube-system_a125f1ac-4417-471d-99b6-8cd0f9941b41_0
9b8b57d82cd1 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 43 hours ago Up 43 hours k8s_POD_calico-kube-controllers-659bd7879c-khr55_kube-system_14f67f35-3659-4f20-8651-fb7520639ed1_0
c54a6cb0f574 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 43 hours ago Up 43 hours k8s_POD_kube-flannel-ds-qkjw9_kube-flannel_5202d809-327d-4dc7-accc-2a37a3e46423_0
初始化容器(initcontainers)
用于在启动应用容器(app container) 之前启动一个或多个初始化容器,完成应用容器所需的预置条件。
init 容器与普通的容器的不同点:
1、init 容器总是运行到成功完成为止。
2、每个 init 容器都必须在下一个 init 容器启动之前成功完成启动和退出。
如果 Pod 的 init 容器失败,k8s 会不断地重启该 Pod容器,直到 init 容器成功为止。然而,如果 Pod 容器对应的重启策略(restartPolicy)为 Never,它不会重新启动。
3、init 容器必须在应用程序容器启动之前运行完成。
init 的容器作用:
因为 init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:
1、init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、awk、python 或 dig 这样的工具而去 FROM 一个镜像来生成一个新的镜像。
2、init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
3、应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
4、由于 init 容器必须在应用容器启动之前运行完成,因此 init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod 内的所有的应用容器会并行启动。
应用容器(Maincontainer)
官网示例:
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
vi demo1
apiVersion: v1
kind: Pod
metadata:name: myapp-podlabels:app: myapp
spec:containers:- name: myapp-containerimage: busybox:1.28command: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-myserviceimage: busybox:1.28command: ['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;']kubectl create -f demo1#这个例子是定义了一个具有 2 个 init 容器的简单 Pod。第一个等待 myservice 启动, 第二个等待 mydb 启动。#一旦这两个 init 容器都启动完成,Pod 将启动 spec 中的应用容器。kubectl describe pod myapp-podkubectl logs myapp-pod -c init-myservicevim myservice.yaml
apiVersion: v1
kind: Service
metadata:name: myservice
spec:ports:- protocol: TCPport: 80targetPort: 9376kubectl create -f myservice.yamlkubectl get svckubectl get pods -n kube-systemkubectl get podsvim mydb.yaml
apiVersion: v1
kind: Service
metadata:name: mydb
spec:ports:- protocol: TCPport: 80targetPort: 9377kubectl create -f mydb.yamlkubectl get pods
镜像拉取策略(imagePullPolicy)
Pod 的核心是运行容器,必须指定容器引擎,比如 Docker,启动容器时,需要拉取镜像,k8s 的镜像拉取策略可以由用户指定:
1、IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略
2、Always:每次创建 Pod 都会重新拉取一次镜像;
3、Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。
注意:对于标签为“:latest”的镜像文件,其默认的镜像获取策略即为“Always”;而对于其他标签的镜像,其默认策略则为“IfNotPresent”。
官方示例:
https://kubernetes.io/docs/concepts/containers/images
#创建测试案例
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test1
spec:containers:- name: nginximage: nginximagePullPolicy: Alwayscommand: [ "echo", "SUCCESS" ]kubectl create -f pod1.yamlkubectl get pods -o wide[root@master01 day1]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test1 0/1 CrashLoopBackOff 1 29s 10.244.60.75 192.168.110.20 <none> <none>#此时 Pod 的状态异常,原因是 echo 执行完进程终止,容器生命周期也就结束了
kubectl describe pod pod-test1[root@master01 day1]# kubectl describe pod pod-test1
Name: pod-test1
Namespace: default
... ...
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 2m48s default-scheduler Successfully assigned default/pod-test1 to 192.168.110.20Normal Pulled 2m48s kubelet Successfully pulled image "nginx" in 265.072869msNormal Pulled 2m47s kubelet Successfully pulled image "nginx" in 264.569975msNormal Pulled 2m19s kubelet Successfully pulled image "nginx" in 10.879658684sNormal Created 111s (x4 over 2m48s) kubelet Created container nginxNormal Pulled 111s kubelet Successfully pulled image "nginx" in 490.97727msNormal Started 110s (x4 over 2m48s) kubelet Started container nginxWarning BackOff 74s (x8 over 2m47s) kubelet Back-off restarting failed containerNormal Pulling 63s (x5 over 2m48s) kubelet Pulling image "nginx"#可以发现 Pod 中的容器在生命周期结束后,由于 Pod 的重启策略为 Always,容器再次重启了,并且又重新开始拉取镜像#修改 pod1.yaml 文件
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[root@master01 day1]# kubectl delete -f pod1.yaml
pod "pod-test1" deleted
[root@master01 day1]# kubectl apply -f pod1.yaml
pod/pod-test1 created
[root@master01 day1]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test1 1/1 Running 0 3m4s 10.244.60.79 192.168.110.20 <none> <none>#node 节点上使用 curl 查看头部信息
curl -I http://10.244.60.81[root@node01 ~]# curl -I http://10.244.60.81
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Wed, 12 Feb 2025 06:50:56 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
k8s 部署 harbor 创建私有项目
部署 harbor 仓库
#在 Docker harbor 节点(192.168.110.50)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0yum install -y yum-utils device-mapper-persistent-data lvm2
yum-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/#部署 Harbor 服务
tar zxvf harbor-offline-installer-v2.9.5.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.110.50
--10行--修改,设置端口(如果启动失败)
--13-18行--注释掉https,或者添加证书和密钥cd /usr/local/harbor/
./install.sh
在 Harbor 中创建一个新项目
(1)浏览器访问:http://192.168.110.50 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
(3)填写项目名称为“sunny”,点击“确定”按钮,创建新项目
#在每个 node 节点配置连接私有仓库(注意每行后面的逗号要添加)
vi /etc/docker/daemon.json
#添加(注意多行加“,”)"insecure-registries":["192.168.110.50"]
#重启 docker
systemctl daemon-reload
systemctl restart docker#在每个 node 节点登录 harbor 私有仓库
docker login -u admin -p Harbor12345 http://192.168.110.50#在一个 node 节点下载 Tomcat 镜像进行推送
docker pull tomcat
docker imagesdocker tag tomcat:latest 192.168.110.50/sunny/tomcat:v1
docker imagesdocker push 192.168.110.50/sunny/tomcat:v1[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.110.50/sunny/tomcat v1 3c65deadf104 2 days ago 511MB
tomcat latest 3c65deadf104 2 days ago 511MB
... ...
[root@node01 ~]# docker push 192.168.110.50/sunny/tomcat:v1
The push refers to repository [192.168.110.50/sunny/tomcat]
5f70bf18a086: Pushed
a9c7c5cf8145: Pushed
4e3a285d61db: Pushed
4e5b554b7345: Pushed
39cf0ac89a5a: Pushed
f844dcf94898: Pushed
3359bc3d7a6a: Pushed
4b7c01ed0534: Pushed
v1: digest: sha256:30caa870f1fa5240e112dd3c0e349e118b6e77d7ff51519a5a9e89c35cf3d918 size: 2201
刷新网页查看
harbor 登录凭据资源清单
#查看登陆凭据
cat /root/.docker/config.json | base64 -w 0 #base64 -w 0:进行 base64 加密并禁止自动换行[root@node01 ~]# cat /root/.docker/config.json | base64 -w 0
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjExMC41MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ==[root@node01 ~]##创建 harbor 登录凭据资源清单,用于 K8S 访问 Harbor 私服拉取镜像所需要的密钥权限凭证 secret 资源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-pull-secret
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjExMC41MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ== #复制粘贴上述查看的登陆凭据
type: kubernetes.io/dockerconfigjson#创建 secret 资源
kubectl create -f harbor-pull-secret.yaml#查看 secret 资源
kubectl get secret
测试
#创建资源从 harbor 中下载镜像
cd /opt/demo
vim tomcat-deployment.yaml
apiVersion: 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 资源名称containers:- name: my-tomcatimage: 192.168.110.50/sunny/tomcat:v1 #指定 harbor 中的镜像名ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: my-tomcat
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 31111selector:app: my-tomcat#删除之前在 node 节点下载的 Tomcat 镜像
docker rmi tomcat:latest
docker rmi 192.168.110.50/sunny/tomcat:v1
docker images#创建资源
kubectl create -f tomcat-deployment.yaml
kubectl get pods[root@master01 opt]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-tomcat-64d9b779fb-7fntc 1/1 Running 0 4m10s
my-tomcat-64d9b779fb-jzw5t 1/1 Running 0 4m10s#查看 Pod 的描述信息,可以发现镜像时从 harbor 下载的
kubectl describe pod my-tomcat-64d9b779fb-jzw5t[root@master01 opt]# kubectl describe pod my-tomcat-64d9b779fb-jzw5t
Name: my-tomcat-64d9b779fb-jzw5t
... ...
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 4m36s default-scheduler Successfully assigned default/my-tomcat-64d9b779fb-jzw5t to 192.168.110.20Normal Pulled 4m36s kubelet Container image "192.168.110.50/sunny/tomcat:v1" already present on machineNormal Created 4m36s kubelet Created container my-tomcatNormal Started 4m36s kubelet Started container my-tomcat
刷新 harbor 页面,可以看到镜像的下载次数增加了
相关文章:
5、pod 详解 (kubernetes)
pod 详解 (kubernetes) Pod 的基础概念pause 容器Pod 的分类与创建自主式 Pod控制器管理的 Pod静态 Pod Pod容器的分类基础容器(infrastructure container)初始化容器(initcontainers)应用容器(…...
二叉树详解:Java实现与应用
在计算机科学中,数据结构是构建高效算法的基石,而二叉树作为一种基础且重要的树形结构,在诸多领域都有着广泛应用,如数据库索引、文件系统、编译器设计等。本文将从基础概念入手,带你逐步深入理解二叉树,并…...
GPT和BERT
笔记来源: Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频(RNN模型与NLP应用) 一、GPT 1.1 GPT 模型的…...
【工业安全】-CVE-2024-30891- Tenda AC18路由器 命令注入漏洞
1.漏洞描述 2.漏洞复现 2.1 qemu-user 模拟: 2.2 qemu-system模拟: 3.漏洞分析 4.poc代码: 1.漏洞描述 漏洞编号:CVE-2024-30891 漏洞名称:Tenda AC18 命令注入 威胁等级:高危 漏洞详情:Ten…...
如何从0开始将vscode源码编译、运行、打包桌面APP
** 网上关于此的内容很少,今天第二次的完整运行了,按照下文的顺序走不会出什么问题。最重要的就是环境的安装,否则极其容易报错,请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步:克隆 VSCode 源码 首先…...
登录弹窗效果
1,要求 点击登录按钮,弹出登录窗口 提示1:登录窗口 display:none 隐藏状态; 提示2:登录按钮点击后,触发事件,修改 display:block 显示状态 提示3:登录窗口中点击关闭按钮࿰…...
wps或office的word接入豆包API(VBA版本)
直接上代码,由于时间匆忙,以后写个详细的教程 #If VBA7 ThenPrivate Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As…...
深入浅出 Python Logging:从基础到进阶日志管理
在 Python 开发过程中,日志(Logging)是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题,还能提供丰富的数据支持,让应用更具可观测性。本文将带你全面了解 Python logging 模块,涵盖…...
系统巡检脚本分享:守护服务器的“健康卫士”
在日常的运维工作中,系统巡检是一项至关重要的任务。它可以帮助我们及时发现服务器的潜在问题,确保系统的稳定运行。今天,我想和大家分享一个实用的系统巡检脚本,它能够帮助我们快速、全面地检查服务器的健康状况。 一、为什么需…...
【Elasticsearch】运行时字段(Runtime Fields)索引时定义运行时字段
在 Elasticsearch 中,运行时字段(Runtime Fields)是一种在查询时动态计算的字段,而不是在索引时预先存储的字段。运行时字段为数据处理提供了极大的灵活性,尤其是在处理结构不固定的日志数据或需要动态生成字段值的场景…...
C++从入门到实战(四)C++引用与inline,nullptr
C从入门到实战(四)C引用与inline,nullptr 前言一、C 引用(一)什么是引用(二)引用的特点(三)引用作为函数参数(四)引用作为函数返回值(…...
DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Azure Synapse Dedicated SQL Pool统计指定表中各字段的空值、空字符串或零值比例
-- 创建临时表存储结果 CREATE TABLE #Results (DatabaseName NVARCHAR(128),TableName NVARCHAR(128),ColumnName NVARCHAR(128),DataType NVARCHAR(128),NullOrEmptyCount INT,TotalRows INT,Percentage DECIMAL(10,2) );DECLARE db_name SYSNAME DB_NAME(); -- 获取当前数…...
【深度学习】计算机视觉(CV)-目标检测-SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器
🔹 SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器 1️⃣ 什么是 SSD? SSD (Single Shot MultiBox Detector) 是一种用于 目标检测(Object Detection) 的 深度学习模型,由 Wei L…...
力扣100. 相同的树(利用分解思想解决)
Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同,而此要求可以利用问题分解的思想解决,即判断当前节点的左右子树是否完全相同,而在二叉树问题分解的一般题目中均会带有返回值ÿ…...
在SpringBoot服务器端采购上,如何选择操作系统、Cpu、内存和带宽、流量套餐
在Spring Boot服务器端采购时,选择操作系统、CPU、内存、带宽和流量套餐需根据应用需求、预算和性能要求综合考虑。以下是具体建议: 1. 操作系统 Linux发行版(如Ubuntu、CentOS):适合大多数Spring Boot应用ÿ…...
我的新书《青少年Python趣学编程(微课视频版)》出版了!
🎉 激动人心的时刻来临啦! 🎉 小伙伴们久等了,我的第一本新书 《青少年Python趣学编程(微课视频版)》 正式出版啦! 📚✨ 在这个AI时代,市面上的Python书籍常常过于枯燥&…...
elementUI rules 判断 el-cascader控件修改值未生效
今天修改一个前端项目,增加一个多选字段,使用的是el-cascader控件,因页面是通过引用子页面组件形式使用,出现一个点选后再勾选原有值,输入框内不展示或取消后的也未正常隐藏,如果勾选的值是全新的则其他已选…...
深度学习与人工智能:解锁未来的无限可能
在当今这个科技飞速发展的时代,深度学习和人工智能已不再只是科幻小说中的概念,它们正以惊人的速度渗透到我们生活的方方面面,从智能手机上的语音助手到医疗领域的疾病诊断,从自动驾驶汽车到金融市场的风险预测,其影响…...
pwa应用进阶2-动态加载manifest.json文件
接pwa应用进阶-区分AB面-添加安装按钮而且区分不同的系统和浏览器的各种情况继续优化,主要是让manifest.json文件动态加载。 pwa应用进阶2-动态加载manifest.json文件 主要用途如下: 动态切换PWA的清单文件,例如根据不同的语言或者主题加载不…...
UI用例调试_元素能定位到且不在frame内_无法点击/录入文本
关于单据新增,编辑子集信息遇到的2个阻塞点,做记录已供后续参考 1、新增按钮元素能定位,就是无法点击 实现效果: 单据新增时,前面单据数据编辑完之后,开始新增证件信息,需要先点击新增按钮。…...
Python的web框架Flask适合哪些具体的应用开发?
Flask 适用的具体应用及实现案例代码 Flask 是一个轻量级的 Web 应用框架,以其简洁性和灵活性而广受欢迎。以下是 Flask 适合的具体应用场景及相关的实现案例代码: 1. 小型网站或博客 由于 Flask 的简洁性和易于使用的特性,它非常适合用来搭建个人博客或者小型的企业网站…...
oracle使用动态sql将多层级组织展平
ERP或者其他企业管理软件中都会有一张组织机构表,可以写固定sql的方式将其展平获取组织表中的字段信息,如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷,就是如果只写到处理4个层级,那么后期层级增多就无法…...
vue学习笔记10
ChatGPT & Copilot AI 的认知 两个工具 1、ChatGPT 3.5 2、Github Copilot ChatGPT 的基本使用 - Prompt 优化 AI 互动的过程中,容易出现的问题: 1、 AI未能理解问题的核心要点 2、 AI的回答过于宽泛 或 过于具体 3、 AI提供了错误的信息或…...
网络安全常识
随着互联网和移动互联网的持续火热,人们的生活也越来越离不开网络,网络安全,在这个信息化时代显得尤为重要,那么网络攻击和安全,这一攻守之间,主要涵盖哪些要点呢,下面我们就来对此进行抽丝剥茧…...
如何在 Visual Studio Code 中使用 DeepSeek R1 和 Cline?
让我们面对现实吧:像 GitHub Copilot 这样的 AI 编码助手非常棒,但它们的订阅费用可能会在你的钱包里烧一个洞。进入 DeepSeek R1 — 一个免费的开源语言模型,在推理和编码任务方面可与 GPT-4 和 Claude 3.5 相媲美。将它与 Cline 配对&#…...
从Sora到有言:3D视频生成技术的突破与应用
近年来,AIGC领域飞速发展,这个词也越来越高频地出现在了大家的生活中。AIGC 能完成的任务也越来越多,大模型的能力飞速增长 —— 从Deepseek生成文字,到StableDiffusion生成图像,再到Sora可以生成视频。 而现在&#x…...
算法18(力扣136)只出现一次的数字
1、问题 给你一个 非空 整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 2、示例 (1&…...
基于HTML5 Canvas 和 JavaScript 实现的烟花动画效果
以下是一个使用 HTML5 Canvas 和 JavaScript 实现的烟花动画效果代码盒子: <!DOCTYPE html> <html> <head><title>烟花效果...
网络变压器的主要电性参数与测试方法(1)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(1).. 今天我们就一起先来看看网络变压器的2个主要电性参数与它的测试方法: 1. 开路电感(OCL or Lx----Open Circuit Ind…...
Python + WhisperX:解锁语音识别的高效新姿势
大家好,我是烤鸭: 最近在尝试做视频的质量分析,打算利用asr针对声音判断是否有人声,以及识别出来的文本进行进一步操作。asr看了几个开源的,最终选择了openai的whisper,后来发现性能不行,又换了…...
Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
1、现象:当Qt的窗口最小化时,isVisible值一定是true,这是正常的。 解释:在Qt中,当你点击窗口的最小化按钮时,Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反,它会改变窗口…...
Github 2025-02-12 C开源项目日报 Top7
根据Github Trendings的统计,今日(2025-02-12统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目7Python项目2OpenSSL - 强大的开源加密工具包 创建周期:4012 天开发语言:C协议类型:Apache License 2.0Star数量:23449 个Fork数量:10…...
PostgreSQL 数据类型
PostgreSQL 数据类型 PostgreSQL 是一款功能强大的开源关系型数据库管理系统,它以其出色的性能、灵活的数据类型和强大的扩展性而闻名。在 PostgreSQL 中,数据类型是构建数据库表和执行各种操作的基础。本文将详细介绍 PostgreSQL 中常用的数据类型,并探讨它们的使用场景。…...
synchronized关键字
文章目录 synchronized 关键字介绍synchronized 的内存语义 synchronized 关键字介绍 synchronized 块是 Java 提供的一种原子性 内 置锁, Java 中的每个对象都可以把它当作一个 同步锁来使用 , 这些 Java 内置的使用者看不到的锁被称为内部锁 …...
MATLAB计算反映热需求和能源消耗的度数日指标(HDD+CDD)(全代码)
目录 度数日(Degree Days, DD)概述计算公式MATLAB计算代码调用函数1:计算单站点的 CDD参考度数日(Degree Days, DD)概述 度数日(Degree Days, DD)是用于衡量建筑、城市和地区的热需求和能源消耗模式的指标。它分为两部分: 加热度日(Heating Degree Days, HDD):当室…...
在Linux中Redis不支持lua脚本的处理方法
redis安装在IP为x.x.x.x的服务器上 redis安装 第一步,安装前,检测系统是否安装了redis。若安装了redis,则需要删除redis;若没有安装redis,则需要安装2.6版本以上的redis。 # 确保Redis版本支持Lua脚本。从Redis 2.6…...
第39周:猫狗识别 2(Tensorflow实战第九周)
目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...
SpringBoot自定义starter
首先创建Maven项目 引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>3.4.2</version></dependency> </dependencies…...
JVM学习
JVM 1、JVM是一个跨语言的平台,与语言无关 2、java虚拟机规范:一流企业做标准,二流企业做品牌,三流企业做产品 JVM种类 Hotspot:Oracle 公司,有商业版和免费版 open jdk 内部包含免费版本hotspot虚拟机 Jr…...
RAG入门: RetroMAE、BGE、M3、MemoRAG
RAG实际上第一步都是先做Retrieval,关于Retrieval的思路有很多,持续更新: RetroMAE (论文RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder) RetraoMAE包括两个模块,…...
ruby 的安装
在51cto搜索的资料 ruby on rails的安装 http://developer.51cto.com/art/200906/129669.htm http://developer.51cto.com/art/200912/169391.htm http://developer.51cto.com/art/200908/147276.htm 史上最完整的ruby,rails环境架设配置(Apachefast…...
MySQL的备份与还原
备份数据库 使用mysqldump工具是备份MySQL数据库的一种常用方法。mysqldump可以导出数据库的结构和数据到一个SQL文件中,这个文件稍后可以被用来重新创建数据库或恢复数据。以下是mysqldump命令的详细扩写: mysqldump -u <username> -p<passw…...
文心快码|AI重构开发新范式,从工具到人机协同
本系列视频来自百度前端架构师张立理,他在以“应用来了”为主题的2024百度世界大会上,进行了文心快码3.0能力演示,端到端能力展示。 以下视频是关于文心快码全栈编程智能体-AI重构开发新范式 文心快码AI重构开发新范式 百度前端架构师张立理认…...
Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程
系统版本:Windows 11 依赖环境:Anaconda3 运行软件:PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…...
方法(构造方法、方法重载、可变参数)
方法(Method) 方法是组织好的、可以重复使用的代码块,用于实现单一或相关联的功能。方法有助于提高代码的模块化和可读性,并且通过减少代码冗余来促进代码的重用。 一个方法通常包含5中部分组成: 访问修饰符…...
ES节点配置的最佳实践
一个 Elasticsearch(ES)节点可以同时包含数据节点和主节点的角色。这种配置在某些场景下是可行的,尤其是在小型集群中。然而,在生产环境中,通常建议将主节点和数据节点的角色分离,以提高集群的稳定性和性能…...
langchain学习笔记之langserve服务部署
langchain学习笔记之langserve服务部署 引言 LangServe \text{LangServe} LangServe简单介绍安装过程示例应用调用模型接口实现交互使用 Requests \text{Requests} Requests方式进行交互 附: server.py \text{server.py} server.py完整代码 引言 本节将介绍 LangSe…...
Docker安装分布式vLLM
Docker安装分布式vLLM 1 介绍 vLLM是一个快速且易于使用的LLM推理和服务库,适合用于生产环境。单主机部署会遇到显存不足的问题,因此需要分布式部署。 分布式安装方法 https://docs.vllm.ai/en/latest/serving/distributed_serving.html2 安装方法 …...
Java SpringBoot的ProblemDetail实现全局异常统一处理让接口不在需要catch/ProblemDetail实现错误处理的标准化
在开发 Web 应用时,有效的错误处理和响应是提升用户体验和系统健壮性的关键。Spring Boot 3.2 引入了对 ProblemDetail 的更好支持,使得错误处理更加标准化和便捷。本文将通过实战演示,带你深入了解如何在 Spring Boot 3.2 中使用 ProblemDet…...