Kubernetes——Kubectl详解

目录

前言

一、陈述式资源管理方法

二、Kubectl命令操作

1.查

1.1kubectl version——查看版本信息

1.2kubectl api-resources——查看资源对象简写

1.3kubectl cluster-info——查看集群信息 

1.4配置Kubectl补全

1.5journalctl -u kubelet -f——查看日志

1.6kubectl get cs(componentstatuses)——查看节点状态

1.7kubectl get ns——查看命名空间

1.8kubectl get all——查看default命名空间的所有资源

1.9kubectl get  --show-labels——查看节点标签

1.10kubectl get pod -l label(-A)——根据标签进行条件查找 

1.11kubectl get pod -n ——查看具体命名空间内信息

1.12kubectl describe [-o wide|json|yaml] [-n namespace]——查看资源详细信息

1.13kubectl logs ——查看资源日志

2.增

2.1kubectl create namespace ——创建命名空间

2.2kubectl run --image -n ——指定命名空间中创建资源

2.2.1拓展

2.3kubectl create deployment --image -n ——指定命名空间中创建自主式Pod资源

3.删

3.1kubectl delete namespace ——删除命名空间

3.2kubectl delete pod -n ——删除Pod资源

3.3删除副本控制器

4.改

5.扩缩容

5.1扩容——针对并发量增加

5.2缩容——针对并发量减少

三、项目生命周期

1.创建——kubectl create

2.发布——kubectl expose

2.1Service的Type类型

2.2Port——Kubernetes集群中的Port

2.3测试Service暴露在Cluster集群使其可以访问

2.4测试Port暴露在外部流量中可以使其可以访问

2.6Endpoint——端点

3.更新——kubectl set

4.回滚——kubectl rollout

5.删除——kubectl delete

四、主要发布过程

1.蓝绿发布

2.滚动发布

3.金丝雀发布(Canary Release)灰度发布

五、声明式资源管理方法

六、总结

1.命令操作

2.Port端口

3.数据流向

4.生命周期

5.声明式管理方法


前言

本章我们来深入了解一下关于Kubernetes的命令行工具Kubectl的使用,相信前面的几篇博客都已经见到了使用Kubectl命令行工具,现在我们使用测试环境对Kubectl命令行工具管理操作进行详细解答。

管理操作分为两大类,陈述式和声明式

一、陈述式资源管理方法

  • Kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 APIServer 的接口
  • Kubectl 是官方的CLI命令行工具,用于与 APIServer 进行通信,将用户在命令行输入的命令,组织并转化为 APIServer 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径
  • Kubectl 的命令大全

kubectl --help
k8s中文文档:http://docs.kubernetes.org.cn/683.html

  • 对资源的增、删、查操作比较方便,但对改的操作就不容易了

二、Kubectl命令操作

1.查

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命名空间,-o 指定输出格式
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)
--all-namespaces 或 -A :表示显示所有命令空间,
--show-labels :显示所有标签
-l app :仅显示标签为app的资源
-l app=nginx :仅显示包含app标签,且值为nginx的资源

1.1kubectl version——查看版本信息

1.2kubectl api-resources——查看资源对象简写

1.3kubectl cluster-info——查看集群信息 

1.4配置Kubectl补全

echo "source <(kubectl completion bash)" >> /root/.bashrc

1.5journalctl -u kubelet -f——查看日志

 -u指定服务,-f实时查看日志

1.6kubectl get cs(componentstatuses)——查看节点状态

1.7kubectl get ns——查看命名空间

命令空间的作用:用于允许不同命令空间的相同类型的资源重名

1.8kubectl get all——查看default命名空间的所有资源

1.9kubectl get <resource> --show-labels——查看节点标签

Label类似于键值对,标签的键值对以逗号分隔

1.10kubectl get pod -l label(-A)——根据标签进行条件查找 

1.11kubectl get pod -n <namespace>——查看具体命名空间内信息

模糊查找 

1.12kubectl describe <resource> [-o wide|json|yaml] [-n namespace]——查看资源详细信息

1.13kubectl logs <resource>——查看资源日志

2.增

2.1kubectl create namespace <name>——创建命名空间

2.2kubectl run <image:name> --image -n <namespace>——指定命名空间中创建资源

2.2.1拓展

由此我们看到刚刚创建的pod是在Node节点上的,现在我们假设Node2节点出现了问题

我们看到Pod也挂掉了,我们再重启Node2节点,发现静态的Pod就不存在了

但是如果对于动态的Pod的话,如果Node2挂掉的话,会重新创建一个新的Pod,并有新的节点来接替Node2的工作,如果再重启Node2之后,那么原来的Pod就会删除

2.3kubectl create deployment <image:name> --image -n <namespace>——指定命名空间中创建自主式Pod资源

这里可以明显看到使用kubectl run创建的资源只有指定的名称,但是我们使用kubectl create deployment创建的资源就会有携带的ID。

 Kubectl run创建的资源是存放在节点当中的;Kubectl create deployment创建的资源是存放在etcd中的

3.删

3.1kubectl delete namespace <name>——删除命名空间

此命令谨慎使用,因为如果命名空间中有资源存在,那么该命名空间直接被删除的话,该命名空间中的资源也不复存在了。

3.2kubectl delete pod <name> -n <namespace>——删除Pod资源

如果是删除kubectl run命令创建的资源,一旦删除不会再创建;如果是删除kubectl create deployment 命令创建的资源,一旦删除又会重新创建新的Pod资源;

若pod无法删除,总是处于terminate状态,则要强行删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod

  • kubectl run:创建自助式静态Pod
  • kubectl create deployment:创建deployment控制器管理的Pod

3.3删除副本控制器

kubectl delete deployment nginx-wl -n kube-public
kubectl delete deployment/nginx-wl -n kube-public

4.改

如果容器报错的话,可以跨主机登入相对应的Pod资源内对配置进行修改

5.扩缩容

5.1扩容——针对并发量增加

5.2缩容——针对并发量减少

三、项目生命周期

1.创建——kubectl create

  • 创建并运行一个或多个容器镜像。
  • 创建一个deployment 或job 来管理容器。
kubectl create --help
#启动 nginx 实例,暴露容器端口 80,设置副本数 3 ,设置所处命名空间为 cxk
kubectl create deployment nginx-cxk --image=nginx:1.14 --port=80 --replicas=3 -n cxkkubectl get all -n cxk

2.发布——kubectl expose

将资源暴露为新的 Service

kubectl expose --help
#查看发布帮助

2.1Service的Type类型

  • ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)
  • NodePort:在每个Node上打开一个端口以供外部访问,Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以访问Service。

每个端口只能是一种服务,端口范围只能是 30000-32767。

  • LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。

在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

  • ExternalName:将service名称映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让Pod去访问集群外部的资源,它本身没有绑定任何的资源。 tgc.benet.com   www.benet.com 

CNAME:别名记录,多个别名记录在一台主机上,用于防止外部攻击,相当于Web服务的防火墙

  • headless clusterIP  无头模式   名称

2.2Port——Kubernetes集群中的Port

  • Port:是 k8s 集群内部访问service的端口,即通过 ClusterIP: Port 可以从 Pod 所在的 Node 上访问到 Service
  • NodePort:是外部访问 K8s 集群中 Service 的端口,通过 NodeIP: NodePort 可以从外部访问到某个 Service。
  • TargetPort:是 Pod 的端口,从 Port 或 NodePort 来的流量经过 Kube-Proxy 反向代理负载均衡转发到后端 Pod 的 TargetPort 上,最后进入容器。
  • ContainerPort:是 Pod 内部容器的端口,TargetPort 映射到 ContainerPort。

Port和NodePort都是属于四层;整体数据流向为TargetPort接收来自于Port和NodePort传来的情求,再转发给ContainerPort,TargetPort可以理解为Port的防火墙(Pod的防火墙)。

如果想修改Pod端口,要使用TargetPort

2.3测试Service暴露在Cluster集群使其可以访问

kubectl expose deployment nginx-cxk --port=8080 --target-port=80 -n cxk
#创建一个自主式Pod 可以通过8080端口转发至容器的80端口
service/nginx-cxk exposedkubectl get svc -n cxk
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx-cxk   ClusterIP   10.108.238.71   <none>        8080/TCP   9scurl 10.108.238.71:8080

这里可以看出基本是负载均衡轮询调度算法

2.4测试Port暴露在外部流量中可以使其可以访问

kubectl expose deployment nginx-cxk --port=80 --target-port=80 --type=NodePort -n cxk
service/nginx-cxk exposedkubectl get svc -n cxk
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-cxk   NodePort   10.99.40.137   <none>        80:31119/TCP   7s

这里是算法的问题,按照负载均衡的分流算法  

2.6Endpoint——端点

kubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.14:80,10.244.1.15:80   9m5skubectl get pod -n cxk
NAME                         READY   STATUS    RESTARTS   AGE
nginx-cxk-84b96ddc7b-2qbzx   1/1     Running   0          83m
nginx-cxk-84b96ddc7b-fl6xl   1/1     Running   0          83m
nginx-cxk-84b96ddc7b-rcmtn   1/1     Running   0          83mkubectl delete pod nginx-cxk-84b96ddc7b-2qbzx -n cxk
pod "nginx-cxk-84b96ddc7b-2qbzx" deletedkubectl get pod -n cxk
NAME                         READY   STATUS    RESTARTS   AGE
nginx-cxk-84b96ddc7b-fl6xl   1/1     Running   0          84m
nginx-cxk-84b96ddc7b-rcmtn   1/1     Running   0          84m
nginx-cxk-84b96ddc7b-tdj5w   1/1     Running   0          37skubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.15:80,10.244.1.16:80   12m
#kubectl create deployment创建的自主式Pod在删除后会自动新建一个新的Pod,那么Endpoint会自动更新其IP地址

#查看关联后端的节点
kubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.15:80,10.244.1.16:80   15m#查看 service 的描述信息
kubectl describe svc nginx#查看负载均衡端口
yum install ipvsadm -y
ipvsadm -Ln#外部访问的IP和端口
TCP  192.168.241.11:31119 rr-> 10.244.1.13:80               Masq    1      0          0         -> 10.244.1.15:80               Masq    1      0          0         -> 10.244.1.16:80               Masq    1      0          0         #pod集群组内部访问的IP和端口
TCP  10.99.40.137:80 rr-> 10.244.1.13:80               Masq    1      0          0         -> 10.244.1.15:80               Masq    1      0          0         -> 10.244.1.16:80               Masq    1      0          0         

3.更新——kubectl set

更改现有应用资源一些信息

#获取修改模板
kubectl set image --helpExamples:# Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
kubectl get pod -n cxk -owidecurl -I 10.244.1.13

kubectl set image deployment nginx-cxk nginx=nginx:1.15 -n cxkkubectl get svc,pod -n cxk -owidekubectl get pod -n cxk -owide

kubectl get pod -n cxk -owidecurl -I 10.244.1.17

25%规则,更新的测试无问题之后再删除旧版本,不会重新启动,只会先创建后删除

#处于动态监听 pod 状态,由于使用的是滚动更新方式,所以会先生成一个新的pod,然后删除一个旧的pod,往后依次类推
kubectl get pods -w

4.回滚——kubectl rollout

对资源进行回滚管理

kubectl rollout --help
#查看历史版本
kubectl rollout history deployment/nginx #执行回滚到上一个版本
kubectl rollout undo deployment/nginx

#执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1#检查回滚状态
kubectl rollout status deployment/nginx

5.删除——kubectl delete

#删除副本控制器
kubectl delete deployment/nginx#删除service
kubectl delete svc/nginx-service

四、主要发布过程

1.蓝绿发布

蓝绿发布需要对服务的新版本进行冗余部署,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进行版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。由于冗余部署的缘故,所以不必担心新版本的资源不够。如果新版本上线后出现严重的程序 BUG,那么我们只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。

优点:用户无感知,业务稳定;缺点:资源消耗大,成本比较高 

2.滚动发布

按照比例分批进行滚动更新,K8S的默认更新机制就是滚动发布,无需创建一定比例的Pod,先创建再删除一定旧的Pod

3.金丝雀发布(Canary Release)灰度发布

Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

先安排一部分Pod,然后暂停更新,安排一小部分用户流量去访问更新的Pod来进行测试,当测试没问题后再扩大比例更新,直至全部更新完成为止

我们新建的Pod的版本为1.14.2的版本

将Pod资源的端口暴露在Service环境中,使得ClusterIP可以访问我们的Pod资源,此时访问的版本也是1.14.2版本

kubectl set image deployment/nginx nginx=nginx:1.15 && kubectl rollout pause deployment/nginx
#更新deployment/nginx nginx镜像变更为1.15版本  且 暂停deployment

监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令

我们如果访问ServiceIP的话,会将我们调度到新的服务器上,但是这样其实是不允许的,我们要将旧版本的Nginx服务和新版本的Nginx服务进行分离

kubectl expose deployment nginx --name=new-nginx --port=80 --target-port=80 --type=NodePort

我们可以看到新版本的Nginx服务和旧版本的Nginx服务的标签不同,可以根据标签进行分离新旧版本

找到新服务的标签,将其标签写入yaml文件中,使其生效

vim new-nginx.yaml 

将selector标签选择器的内容修改为新版本的服务的标签

先删除原来的Sevice,再使用new-nginx.yaml文件生成新的Sevice,那就是此Sevice中只有新版本的一个Pod,做到了新版本的分离。

但是我们访问旧的集群的时候还是会调度到新的版本中,那么我们如何再将旧集群中的新版本进行剔除。

我们还是和新版本一样的建立方法,将标签选择器的内容指定为旧版本的标签

我们发现至此,旧版本集群中不会调度到新版本,新版本也不会调度到旧版本,新旧版本就此完成隔离,这个就是金丝雀发布!

kubectl rollout resume deployment nginx 

 我们继续将所有的Pod资源完成更新版本升级

五、声明式资源管理方法

  • 适合于对资源的修改操作
  • 声明式资源管理方法依赖于资源配置清单文件对资源进行管理

资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)

  • 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
  • 语法格式:kubectl create/apply/delete -f xxxx.yaml

create创建的是一次性的;apply可用于创建也可用于更新资源;delete -f yaml通过yaml格式文件对创建的资源进行统一删除

#查看资源配置清单
kubectl get deployment nginx -o yaml

#解释资源配置清单
kubectl explain deployment.metadata

#修改资源配置清单并应用离线修改:
kubectl apply -f xxxx.yaml
#注意:当apply不生效时,先使用delete清除资源,再apply创建资源在线修改:
直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改
#删除资源配置清单
#陈述式删除:
kubectl delete service nginx#声明式删除:
kubectl delete -f nginx-svc.yaml

六、总结

1.命令操作

命令含义
kubectl get (pod、service、namespace、all) -owide查看资源类型输出详细信息,也可以输出yaml、json格式
kubectl get --all-namespace 或 kubectl get -A查看所有的命名空间下的资源
kubectl create namespace <name>查看命名空间
kubectl delete namespace <name>删除命名空间
kubectl run <image:name> --image -n <namespace>创建自主式静态Pod
kubectl create deployment <image:name> --image -n <namespace>用于创建deployment控制器管理的Pod
kubectl delete pod <name> -n <namespace>删除Pod资源
kubectl scale --replicas=扩缩容
kubectl describe <resource> [-o wide|json|yaml] [-n namespace]查看pod/deployment 副本详细信息,根据信息查看pod故障

2.Port端口

Port:为Service在ClusterIP在网络中暴露端口

TargetPort:对容器映射在Pod上的端口

NodePort:可以通过K8S集群外部使用NodeIP+NodePort访问Service

ContainerPort:容器内部进程使用的端口

3.数据流向

  • Kubernetes内部:客户端----->ClusterIP:port----->Targetport----->Pod:IP----->Container:IP
  • Kubernetes外部:客户端----->NodeIP:Nodeport----->Targetport----->Pod:IP----->Container:IP

4.生命周期

  • 创建:kubectl create <资源类型> <资源名称> --image=<镜像名称> --port=端口 --replication
  • 发布:kubectl expose <资源类型> <资源名称> --port --targetport type=ClusterIP|NodePort
  • 更新:kubectl set image <资源类型> <资源名称> <容器名>-<镜像名> 标签版本
  • 回滚:kubectl rollout undo <资源类型> <资源名称>默认回滚到上一个版本
    • kubectl rollout undo <资源类型> <资源名称> --to-revision回滚到指定版本
    • kubectl rollout history|status <资源类型> <资源名称>查看历史信息
  • 删除:kubectl delete <资源类型> <资源名称>

5.声明式管理方法

当YAML配置文件发生改动后,使用Create创建资源如果想更新内容的话,需要先删除原有资源再进行通过YAML进行创建;如果使用Apply创建的资源想更新内容的话,可直接执行kubectl apply -f更新即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网应用开发--STM32与机智云通信(ESP8266 Wi-Fi+手机APP+LED+蜂鸣器+SHT20温湿度传感器)

实现目标 1、熟悉机智云平台&#xff0c;会下载APP 2、熟悉新云平台创建产品&#xff0c;项目虚拟调试 3、掌握云平台生成MCU代码&#xff0c;并移植。机智云透传固件的下载 4、具体目标&#xff1a;&#xff08;1&#xff09;注册机智云平台&#xff1b;&#xff08;2&…

148.【Windows DOS命令脚本文件】

Window待处理脚本 (一)、批处理编程初步体验1.什么是批处理程序&#xff1f;(1).批处理程序的定义(2).如何编辑批处理程序 2.批处理程序可以做什么&#xff1f;(1).匹配规则删除文件(2).新建文件&#xff0c;日志等(3).创建计算机病毒等 3.一个基本的批处理文件(1).带盘符的输出…

[深入理解DDR5] 2-1 封装与引脚

3500字&#xff0c;依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 1 DDR5 颗粒 X4 X8 X16 这里的 X8 or X16&#xff0c; 可以理解为一个DRAM芯片有几个存储阵列。“X几”。进行列寻址时会同时从几个阵列的同一个坐标位置读出数据bit来&a…

前端中 dayjs 时间的插件使用(在vue 项目中)

Day.js中文网 这是dayjs的中文文档 里面包括了使用方法 下面我来详细介绍一下这个插件的使用 Day.js 可以运行在浏览器和 Node.js 中。 一般咱直接是 npm 安装 npm install dayjs 目前应该使用的是Es6 的语法 import dayjs from dayjs 当前时间 直接调用 dayjs() 将返回…

【飞桨AI实战】基于PP-OCR和ErnieBot的智能视频问答

前言 本次分享将带领大家从 0 到 1 完成一个基于 OCR 和 LLM 的视频字幕提取和智能视频问答项目&#xff0c;通过 OCR 实现视频字幕提取&#xff0c;采用 ErnieBot 完成对视频字幕内容的理解&#xff0c;并回答相关问题&#xff0c;最后采用 Gradio 搭建应用。本项目旨在帮助初…

小猫咪的奇幻冒险:一个简单的Python小游戏

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、游戏简介与演示 二、游戏开发与运行 1. 环境搭建 2. 代码解析 3. 加速机制 三、游戏…

Jeecg | 完成配置后,如何启动整个项目?

前端启动步骤&#xff1a; 1. 以管理员身份打开控制台&#xff0c;切换到前端项目目录。 2. 输入 pnpm install 3. 输入 pnpm dev 4. 等待前端成功运行。 可以看到此时前端已经成功启动。 后端启动步骤&#xff1a; 1. 启动 mysql 服务器。 管理员身份打开控制台&#…

得物小程序逆向+qt可视化(不含sku)

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

Python实现国密GmSSL

Python实现国密GmSSL 前言开始首先安装生成公钥与私钥从用户证书中读取公钥读取公钥生成签名验证签名加密解密 遇到的大坑参考文献 前言 首先我是找得到的gmssl库&#xff0c;经过实操&#xff0c;发现公钥与密钥不能通过pem文件得到&#xff0c;就是缺少导入pem文件的api。这…

迷你手持小风扇到底哪个牌子最好?揭秘迷你手持手持小风扇排行榜

在炎炎夏日&#xff0c;迷你手持小风扇成为了我们不可或缺的清凉伴侣。然而&#xff0c;面对市场上琳琅满目的品牌&#xff0c;迷你手持小风扇到底哪个牌子最好&#xff1f;今天&#xff0c;我将揭秘迷你手持小风扇排行榜&#xff0c;带大家一探各大品牌的魅力&#xff0c;让你…

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩&#xff1a;百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

【LeetCode】【5】最长回文子串

文章目录 [toc]题目描述样例输入输出与解释样例1样例2 提示Python实现动态规划 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给一个字符串s&#xff0c;找到s中最长的回文子串 样例输入输出与解释 样例1 输入…

文件上传安全指南:保护免受不受限制的文件上传攻击

文件上传安全指南&#xff1a;保护免受不受限制的文件上传攻击 在现代应用程序中&#xff0c;文件上传功能是一个常见且重要的部分。然而&#xff0c;这也为攻击者提供了潜在的攻击向量&#xff0c;尤其是不受限制的文件上传攻击。本文将详细介绍如何通过一系列安全措施来保护…

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装及使用详解(文末附样例)

1. 概览 微软威胁建模工具&#xff08;Threat Modeling Tool&#xff09;是 Microsoft 安全开发生命周期 (SDL&#xff0c;Security Develop LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段&#xff0c;软件架构师可以使用威胁建模工具提…

linux系统防火墙开放端口命令

目录 linux相关命令参考文章1.开放端口1.1 开发单个端口1.2 一次性开放多个端口 2.保存设置3.查看所有开放的端口4.查看防火墙状态 linux相关命令参考文章 管理、设置防火墙规则&#xff08;firewalld&#xff09;: https://download.csdn.net/blog/column/8489557/137911049 i…

打造AI虚拟伴侣 - 优化方案

第一部分:框架优化概述 1、精确定位: 构建一个高度灵活且用户友好的平台,旨在通过无缝集成多种大型语言模型(LLMs)后端,为用户创造沉浸式的角色交互体验。不仅适配电脑端,还特别优化移动端体验,满足二次元AI虚拟伴侣市场的特定需求。 2、核心功能强化: 增强后端兼容…

每日练习之深度优先搜索——最大的湖

最大的湖 题目描述 运行代码 #include<iostream> using namespace std; bool mp[102][102]; int sum,num; int N,M,K; int dfs(int x,int y ) {if( mp[x][y] ){mp[x][y]0;sum;dfs(x1,y);dfs(x-1,y);dfs(x,y1);dfs(x,y-1);}return 0; } int main() {cin>>N>>…

【每日一题】52.20个机器学习问题 2 (模型部署、实践流程和应用问题)

在上一篇《20个机器学习问答题》中&#xff0c;问题主要围绕机器学习的基础概念和理论知识。 这次&#xff0c;本篇内容针对机器学习的实践和应用继续提出了20个不同的问题。【点击跳转原文】 在实际应用中&#xff0c;机器学习模型的建立流程是怎样的&#xff1f; 机器学习模…

使用delphi11编写一个基于xls作为数据库的照片展示程序

1、创建xls文档可以参考前一篇博客&#xff0c;并使用wps将文档保存为2003格式xls后缀。 2、在form上面放置adoconnection、adotable、datasource、spinedit、timer、checkbox、image、4个button组件。 image的设置&#xff1a; Image1.Align : alClient; Image1.Center : Tr…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…