当前位置: 首页 > news >正文

Kubernetes学习(二)Pod

创建Pod

kubectl创建nginx pod

编写 nginx pod的yaml文件

apiVersion: v1
kind: Pod
metadata:name: my-nginxlabels:name: my-nginx
spec:containers:- image: nginxname: my-nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- name: nginx-portcontainerPort: 80protocol: TCP

创建

kubectl create -f nginx.yaml

Pod实现原理

什么是Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod的共享上下文包括一组Linux命名空间、控制组(cgroup)和可能的一些其他隔离,即用来隔离docker容器的技术。在Pod上下文中,每个独立的应用可能会进一步实施隔离。就Docker概念的术语而言,Pod类似于共享命名空间和文件系统卷的一组Docker容器。

使用Pod

通常不需要直接创建Pod、甚至单实例Pod。相反,会使用诸如Deployment或job这类工作负载资源来创建Pod。如果pod需要跟踪状态,可以考虑StatefulSet资源。

Kubernetes集群中Pod主要有2种用法:

1、运行单个容器的Pod。”每个Pod一个容器“模型是最常见的Kubernetes用例,在这种情况下,可以将Pod看做单个容器的包装器,并且Kubernetes直接管理Pod,而不是容器;

2、运行多个协同工作的容器的Pod。Pod可能封装有多个精密耦合切需要共享资源的共处容器组成的应用程序。这些位于同一位置的容器可能形成单个内聚的服务单元:一个容器将文件从共享卷提供给公众,而另一个单独的边车(sidecar)容器则刷新或更新这些文件。Pod将这些容器和存储资源打包为一个可管理的实体。

Pod网络

每个Pod都在每个地址族中获得一个唯一的Ip地址。Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost互相通信。当Pod中的容器与Pod外的实体通信是,他们必须协调如果使用共享的网络资源(例如端口)

Pod生命周期

和一个个独立的应用容器一样,Pod也别认为是相对临时性(而不是长期存在)的实体。Pod会被创建、赋予一个唯一ID,并被调度到节点,并在终止或删除之前一直运行在该节点。如果一个节点挂掉了,调度到该节点的Pod也被计划在预定超时时限结束后删除

容器阶段 Phase

1、Pending(挂起) Pod已被Kubernetes系统接受,但有一个或多个容器尚未创建或运行。此阶段包括等待pod被调度的时间和通过网络下载镜像的时间

2、Running(运行中)Pod已被绑定到某个节点,Pod中所有的容器都已被创建,至少有一个容器仍在运行或正处于启动或重启状态

3、Succeeded(正常终止)Pod中所有的容器都成功终止,并且不会再重启

4、Failed(异常停止)Pod中所有容器都已终止,并且最少有一个容器是因为失败终止,也就是说,容器以非0状态退出或者被系统终止

5、Unknown(未知状态)因为某些原因无法取得Pod状态。这种情况通常是因为与Pod所在主机通信故障导致

容器状态

调度器将Pod分派给某个节点,kubelet就通过容器运行时开始为Pod创建容器。容器的状态有3中:Wating、Running、Terminated

容器生命周期事件处理函数

postStart和preStop处理函数

示例:lifecycle.yaml

apiVersion: v1
kind: Pod
metadata:name: lifecyclelabels:name: lifecycle
spec:containers:- name: lifecycle-demo-containerimage: nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 81lifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]preStop:exec:command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

验证:

[root@master k8s]# kubectl exec -it lifecycle sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /usr/share/message
Hello from the postStart handler
# 

包含Init容器的Pod

Init容器

每个Pod中可以包含多个容器,应用运行在这些容器里面,同时Pod也可以有一个或多个先于用用启动的Init容器。

Init容器与普通的容器非常像,除了以下2点:

1、它们总是运行到完成

2、每个都必须在下一个启动之前成功完成

如果Pod的Init容器失败,Kubernetes会不断重启该Pod,知道Init容器成功启动为止。然而,如果Pod对应的restartPolicy值为Never,Kubernetes不会重新启动Pod

与普通容器的不同之处

Init容器支持应用容器的全部属性和特性,包括资源限制、数据卷和安全设置。

Init容器不支持lifecycle、livenessProbe、readinessProbe和startupProbe,因为它们必须在Pod就绪之前运行完成

示例:initPod.yaml

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: busybox:1.28command: ['sh','-c','date && sleep 3600']resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 81initContainers:- name: initimage :  busybox:1.28command: ['sh','-c','date && sleep 10']

定义一个具有2个Init容器的简单Pod。第一个等待myservice启动,第二个等待mydb启动,一旦这个2个Init容器都启动完成,Pod将启动应用容器

[root@master k8s]# kubectl get pods -w
NAME       READY   STATUS     RESTARTS   AGE
my-nginx   1/1     Running    0          19h
myapp      0/1     Init:0/1   0          14s
myapp      0/1     PodInitializing   0          17s
myapp      1/1     Running           0          18s
kubect^C[root@master k8s]# 
[root@master k8s]# kubectl logs myapp
Thu Mar  2 02:24:57 UTC 2023
[root@master k8s]# kubectl logs myapp -c init
Thu Mar  2 02:24:46 UTC 2023
[root@master k8s]# 

Init容器将会等待10秒,Init容器执行完毕,随后my-app的Pod进入running状态

用探针检查Pod的健康

探针的作用

探针是由kubelet 对容器执行的定期诊断。要执行诊断,kubelet调用由容器实现的handler,有三种类型的handler:

ExecAction:在容器内执行指定命令,如果命令退出时返回状态码为0,则认为诊断成功

TCPSockerAction:对容器的Ip地址上的指定端口执行TCP检查,如果端口打开,则认为诊断成功

HTTPGetAction:对容器ip地址上指定的端口和路径执行HTTP GET请求,如果响应的状态码>=200且

每次探针都将获得以下三种结果之一:

Success:容器诊断成功

Failure:容器未通过诊断

Unknown:诊断失败,不会采取任何动作

使用场景

容器需要较长时间才能启动就绪的Pod而言,启动探针是有用的。不需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定,对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。

如果容器启动时间通常超出initialDelaySeconds+failureThreshold*periodSeconds总值,你就应该设置一个启动探针,对存活态探针所使用的同一端点执行检查。periodSeconds的默认值是30秒,failureThreshold设置的应其足够高,以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的默认值,这一设置有助于减少死锁状况的发生。

示例:liveness.yaml

apiVersion: v1
kind: Pod
metadata:name: liveness-httplabels:test: liveness
spec:containers:- name: livenessimage: mirrorgooglecontainers/livenessargs:- /serverresources:limits:memory: "128Mi"cpu: "500m"livenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3

liveness /healthz 在容器存活的最开始10秒内,会返回200状态码,之后返回500状态码

kubelet在容器启动之后3秒开始执行健康检查,所以前几次健康检查都是成功的,但是10秒之后,健康检查会失败,同时kubelet会杀死容器再重新启动容器

启动命令和参数

创建Pod时设置命令和参数

创建Pod时,可以为容器设置启动时要执行的命令和参数。可以在配置文件的command字段下设置命令,在args字段下设置命令参数。一旦Pod创建完成,改命令和参数就无法进行更改了。

如果在配置文件中设置了容器启动时要执行的命令和参数,那么容器镜像中自带的命令和参数将会被覆盖而不在执行。如果配置文件中只是设置了参数,却没有设置对应的命令,那么容器镜像中自带的命令会使用改新参数

示例:args.yaml

apiVersion: v1
kind: Pod
metadata:name: argslabels:name: args
spec:containers:- name: argsimage: debiancommand: ["printenv"]args: ["HOSTNAME", "KUBERNATES_PORT"]restartPolicy: OnFailure
[root@master k8s]# kubectl create -f args.yaml 
pod/args created
[root@master k8s]# kubectl get pod -w
NAME   READY   STATUS              RESTARTS   AGE
args   0/1     ContainerCreating   0          2s
args   0/1     Completed           0          4s
^C[root@master k8s]kubectl logs args
args
[root@master k8s]#

使用环境变量设置参数

apiVersion: v1
kind: Pod
metadata:name: argslabels:name: args
spec:containers:- name: argsimage: debianresources:limits:memory: "128Mi"cpu: "500m"env:- name: MESSAGEvalue: "hello world"command: ["/bin/echo"]args: ["$(MESSAGE)"]restartPolicy: OnFailure
[root@master k8s]# kubectl create -f args.yaml 
pod/args created
[root@master k8s]# kubectl get pod -w
NAME   READY   STATUS              RESTARTS   AGE
args   0/1     ContainerCreating   0          3s
args   0/1     Completed           0          4s
^C[root@master k8s]kubectl logs args
hello world
[root@master k8s]#

相互依赖的环境变量

设置了相互依赖的环境变量,就可以再配置清单文件中的env的value使用 $(VAR_NAME)

示例:dependency-var.yaml

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: busyboxresources:limits:memory: "128Mi"cpu: "500m"command:- "sh"- "-c"args:- printf UNCHANGED_REFERENCE=$UNCHANGED_REFERENCE'\n'; printf SERVICE=$SERVICE'\n'; printf ESCAPED_SERVICE=$ESCAPED_SERVICE; sleep 120env:- name: SERVICE_IPvalue: "192.168.99.102"- name: SERVICE_PORTvalue: "31111"- name: UNCHANGED_REFERENCEvalue: $(PROTOCAL)://$(SERVICE_IP):$(SERVICE_PORT)- name: PROTOCALvalue: "https"- name: SERVICEvalue: $(PROTOCAL)://$(SERVICE_IP):$(SERVICE_PORT)- name: ESCAPED_SERVICEvalue: $$(PROTOCAL)://$(SERVICE_IP):$(SERVICE_PORT)
[root@master k8s]# kubectl logs myapp
UNCHANGED_REFERENCE=$(PROTOCAL)://192.168.99.102:31111
SERVICE=https://192.168.99.102:31111
[root@master k8s]# 

配额管理

创建一个命名空间,以便资源隔离

kubectl create namespace cpu-example

指定CPU请求和CPU限制

要为容器执行CPU请求,请在容器资源清单中包含 resources:requests字段。要指定CPU限制,请包含resources:limits

示例:cpu-limit.yaml

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: registry.cn-beijing.aliyuncs.com/qingfeng666/stressresources:limits:memory: "128Mi"cpu: "1"ports:- containerPort: 80args:- -cups- "2"
[root@master k8s]# kubectl describe pod myapp
Name:         myapp
Namespace:    default
Priority:     0
Node:         node2/179.220.56.232
Start Time:   Thu, 02 Mar 2023 14:57:46 +0800
Labels:       name=myapp
Annotations:  <none>
Status:       Running
IP:           10.244.2.20
IPs:IP:  10.244.2.20
Containers:myapp:Container ID:  docker://f41321840ba2dfdf841a869593f106acf86484d7f4b4f1dbaa9f3044efc9bc12Image:         registry.cn-beijing.aliyuncs.com/qingfeng666/stressImage ID:      docker-pullable://registry.cn-beijing.aliyuncs.com/qingfeng666/stress@sha256:155d7266cb7ed6fecd34b2e4f8a25c2b21eb77723658fb4ab2db630d41118c7dPort:          80/TCPHost Port:     0/TCPArgs:-cpus2State:          RunningStarted:      Thu, 02 Mar 2023 14:57:49 +0800Ready:          TrueRestart Count:  0Limits:cpu:     1memory:  128MiRequests:cpu:        1memory:     128MiEnvironment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dh67f (ro)

利用亲和性分配Pod

preferredDuringSchedulingIgnoredDuringExecution:软策略 requiredDuringSchedulingIgnoredDuringExecution: 硬策略

软策略:意思就是尽量不要将 pod 调度到匹配到的节点,但是如果没有不匹配的节点的话,也可以调度到匹配到的节点

硬策略:意思就是必须调度到满足条件的节点上,否则就等着 Pending

键值运算关系

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值
  • Lt:label 的值小于某个值
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

添加自定义lable

kubectl label nodes node1 disktype=ssd

节点亲和性配置

示例:affinity.yaml

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- hardcontainers:- name: myappimage: nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80
[root@master k8s]# kubectl get pod -w
NAME    READY   STATUS    RESTARTS   AGE
myapp   1/1     Running   0          6s
^C[root@master k8s]# kubectl describe pod myapp
Name:         myapp
Namespace:    default
Priority:     0
Node:         node2/179.220.56.232
Start Time:   Thu, 02 Mar 2023 15:26:04 +0800
Labels:       name=myapp
Annotations:  <none>
Status:       Running
IP:           10.244.2.21

ConfigMap数据注入容器

创建自定义的ConfigMap

示例:configmap-multi.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: my-db-confignamespace: default
data:db-url: localhostusername: rootpassword: root
kubectl create -f configmap-multi.yaml

使用ConfigMap数据

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:containers:- name: myappimage: busyboxcommand: ["sh", "-c", "env"]envFrom:- configMapRef:name: my-db-configresources:limits:memory: "128Mi"cpu: "500m"
[root@master k8s]# kubectl logs myapp
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=myapp
SHLVL=1
username=root
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
password=root
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
db-url=localhost

容器root用户和privileged特权用户

Docker允许隔离主机OS上的进程、功能和文件系统,并且出于实际原因,大多数容器默认以root用户身份运行。

Kubernetes通过Security Context提供了相同的功能。

要为Pod设置安全性配置,可在Pod规约中包含securityContext字段。securityContext字段值是一个PodSecurityContext对象,设置的安全性配置会应用到Pod中所有的Container上

示例:security.yaml

apiVersion: v1
kind: Pod
metadata:name: myapplabels:name: myapp
spec:securityContext:runAsUser: 1000runAsGroup: 3000fsGroup: 2000volumes:- name: securityemptyDir: {}containers:- name: myappimage: busyboxcommand: ["sh","-c","sleep 1h"]volumeMounts:- name: securitymountPath: /data/demosecurityContext:allowPrivilegeEscalation: falseresources:limits:memory: "128Mi"cpu: "500m"

相关文章:

Kubernetes学习(二)Pod

创建Pod kubectl创建nginx pod 编写 nginx pod的yaml文件 apiVersion: v1 kind: Pod metadata:name: my-nginxlabels:name: my-nginx spec:containers:- image: nginxname: my-nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- name: nginx-po…...

【Docker】docker | 迁移docker目录

一、场景说明1、物理机磁盘空间不够用了2、docker的镜像、容器、卷等资料的默认路径为&#xff1a; /var/lib/docker3、增加了数据盘挂在&#xff0c;需要将docker的全部资料更换个目录二、操作确认是否满足切换条件1&#xff09;服务是否能够暂停&#xff0c;如果可以就OK2&am…...

day24_多线程进阶

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 创建线程的几种方式 1) 继承 2) 实现Runnable 3) calla…...

Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实

⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处&#xff0c;并告知作者&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 功能点一&#xff1a;文件查找与…...

有关数据库的一级、二级、三级封锁协议

一级封锁协议 一级封锁协议是指&#xff0c;事务T在修改数据R之前必须先对其加X锁&#xff0c;直到事务结束才释放。事务结束包括正常结束&#xff08;COMMIT&#xff09;和非正常结束&#xff08;ROLLBACK).一级封锁协议可防止丢失修改&#xff0c;并保证事务T是可恢复的。在…...

【Android Studio】【学习笔记】【2023春】

文章目录零、常用一、界面布局疑问&报错零、常用 一、界面布局 Android——六大基本布局总结/CSDN小马 同学 【Android】线性布局&#xff08;LinearLayout&#xff09;最全解析/CSDNTeacher.Hu 一个不错的计算器界面&#x1f447; Android Studio App LinearLayout多层…...

window.open()下载文件重命名/js下载文件重命名/js跨域下载文件重命名

普通文件下载 // 1 var fileUrl https://xxxx.docx; window.open(fileUrl"?attname文档.docx");// 2 var a document.createElement(a); a.href https://xxxx.docx; a.download 文档.docx; a.target "_blank"; a.click();以上方式 attname 和 a.down…...

zookeeper:简介及常用命令

目录 一、Zookeeper简介 二、Zookeeper服务端常用命令 1、启动ZooKeeper服务 2、查看ZooKeeper服务状态 3、停止ZooKeeper服务 4、重启ZooKeeper服务 三、Zookeeper客户端常用命令 1、连接ZooKeeper服务端 2、断开连接&#xff1a;quit 3、查看命令帮助&#xff1a;help…...

与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈

调研&#xff1a;李进宝 陈元新 撰写&#xff1a;李进宝 陈元新 随着数字化转型持续深入&#xff0c;国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据&#xff0c;以可视化流程图还原企业实际发生的业务流程&#xff0c;进而评估流程运行状况、诊断流程运…...

第十一届蓝桥杯省赛——2解密

题目&#xff1a;【问题描述】小明设计了一种文章加密的方法&#xff1a;对于每个字母 c&#xff0c;将它变成某个另外的字符 Tc。下表给出了字符变换的规则&#xff1a;字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…...

ChatGPT解答:PYQT5 美化各种控件的方案和实例

ChatGPT解答&#xff1a;PYQT5 美化各种控件的方案和实例 修改按钮样式 button QPushButton(按钮, self) button.setStyleSheet(QPushButton{background-color: red; border-radius: 5px;})修改标签样式 label QLabel(标签, self) label.setStyleSheet(QLabel{color: blue; …...

js实现翻盘抽奖

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>礼物编辑</title><style>* {margin: 0;padding: 0;box-sizing: border-box;list-style-type: none;text-decoration: none;}.container {d…...

Qt QtCreator 安卓开发环境搭建

踩坑 我的qt是使用在线安装工具安装的&#xff0c;Qt版本使用的是5.15.2&#xff0c;QtCreator版本9.0.2 在网上很多教程都是如下步骤 1.安装qt 2.安装jdk 3.安装android-sdk 4.安装android-ndk 5.配置android设置 例如&#xff1a; https://blog.csdn.net/weixin_51363326/…...

Flutter知识点(二)处理Json

flutter不支持反射&#xff0c;所以本来很简单的事情&#xff0c;一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样&#xff0c;所以在flutter中&#xff0c;变成了json string与Map&#xff0c;array之间的砖换。 &#x…...

基本概念简介(码率,FPS(帧数),分辨率,RTMP协议)等的介绍

基本概念 为了了解视频的码率、帧率、分辨率。我们先来看看视频编码的基本原理:视频图像数据有极强的相关性,也就是说有大量的冗余信息。压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技…...

黑盒测试重点复习内容

黑盒测试一、等价类划分边界值分析法二、判定表法一、等价类划分边界值分析法 对于各种输入或者输出&#xff0c;必须考虑等价类和边界值&#xff0c;并补充一些特殊值&#xff0c;如空值、空格、0、异常格式等特殊值。 基本概念&#xff1a; 有效等价类&#xff1a;满足需求…...

Python每日一练(20230303)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…...

基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料

STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核&#xff0c;工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度&#xff0c;支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元&#xff08;MPU&#xff09;&#…...

Nginx SSL证书A+之路

问题 myssl是常见的SSL/TLS在线免费检测网站。期望能够达到A级别。 步骤 nignx worker_processes auto;http {ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;server {listen 443 ssl;server_name xxxx.xxxx.com;keepalive_timeout 70;ssl_certific…...

周期性温度和压力波的PID自动控制解决方法

摘要&#xff1a;目前各种PID控制器仪表常用于简单的设定点&#xff08;Set Point&#xff09;和斜坡&#xff08;Ramp&#xff09;程序控制&#xff0c;但对于复杂的正弦波等周期性变量的控制则无能为力。为了采用标准PID控制器便捷和低成本的实现对正弦波等周期性变量的自动控…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...