k8s——安全机制
一、安全机制说明
Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介, 也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。
比如 kubectl 如果想向API Server请求资源,需要过三关,第一关是认证(Authentication),第二关是鉴权(Authorization), 第三关是准入控制(Admission Control),只有通过这三关才可能会被K8S创建资源。
二、认证(Authentication)
HTTP Token认证:通过一个Token来识别合法用户
- HTTP Token认证:是用一个很长的特殊编码方式的并且难以被模仿的Token字符串来表达客户的一种方式。Token是一个很长的很复杂的字符串,每一个Token对应一个用户名存储在API Server 能访问的文件中。当客户端发起API调用请求时,需要在HTTP Header里放入Token。
- HTTP Base认证:通过用户名+密码的方式认证
- 用户名:密码用BASE64算法进行编码后的字符串放在HTTP Request中的Heather Authorization域里发送给服务端, 服务端收到后进行解码,获取用户名及密码。
- HTTPS证书认证(最严格):基于CA根证书签名的客户端身份认证方式。
注意:Token认证和Base认证方式只能进行服务端对客户端的单向认证,而客户端不知道服务端是否合法;而HTTPS证书认证方式则可以实现双向认证。
2.1 需要被认证的访问类型
- Kubernetes 组件对API Server的访问:kubectl、kubelet、kube-proxy
- Kubernetes 管理的Pod对API Server的访问:Pod(coredns,dashborad也是以Pod形式运行)
2.2 安全性说明
- Controller Manager、Scheduler 与API Server在同一台机器,所以直接使用API Server的非安全端口访问(比如:8080端口)
- kubectl、kubelet、kube-proxy 访问API Server就都需要证书进行HTTPS双向认证,端口号使用 6443
2.3 证书颁发
- 手动签发:使用二进制部署时,需要先手动跟CA进行签发HTTPS证书
- 自动签发:kubelet首次访问API Server时,使用token做认证,通过后,Controller Manager会为 kubelet生成一个证书, 以后的访问都是用证书做认证了
2.4 kubeconfig
kubeconfig文件包含集群参数(CA证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群context上下文参数 (集群名称、用户名)。
Kubenetes组件(如:kubelet、kube-proxy)通过启动时指定不同的kubeconfig文件可以切换到不同的集群 ,连接到apiserver。也就是说kubeconfig文件既是一个集群的描述,也是集群认证信息的填充。包含了集群的访问方式和认证信息。
kubectl 文件位置: ~/.kube/config
2.5 Service Account(SA)
Service Account是为了方便Pod中的容器访问API Server。因为Pod的创建、销毁是动态的,所以要为每一个Pod手动生成证书就不可行了。 Kubenetes使用了Service Account来循环认证,从而解决了Pod访问API Server的认证问题。
2.6 secret与SA的关系
2.6.1 Kubernetes设计了一种资源对象叫做Secret,分为两类
- 用于保存ServiceAccount的service-account-token
- 用于保存用户自定义保密信息的Opaque
2.6.2 Service Account 中包含三个部分
- Token:是使用API Server私钥签名的Token字符串序列号,用于访问API Server时,Server端认证
- ca.crt:ca根证书,用于Client端验证API Server发送来的证书
- namespace:标识这个service-account-token的作用域名空间
默认情况下,每个namespace都会有一个Service Account,如果Pod在创建时没有指定Service Account,就会使用Pod所属的namespace的Service Account。每个Pod在创建后都会自动设置 spec.serviceAccount为default(除非指定了其他Service Accout)。
2.7 示例
2.7.1 查看SA信息
kubectl get sa——查看service account
2.7.2 查看kube-system下的所有信息
kubectl get pod -n kube-system——获得kube-system命名空间中所有Pod的列表
2.7.3 Pod中的容器上启动一个交互式的sh
kubectl exec -it kube-proxy-s7sxg -n kube-system sh——用于在名为kube-proxy-s7sxg的Pod中的容器上执行一个交互式的shell(sh)
解释如下:
kubectl exec
: 这部分表示在Kubernetes中执行一个命令。-it
: 这两个选项结合起来表示要创建一个交互式的终端,允许用户与容器进行交互。kube-proxy-s7sxg
: 这是要执行命令的Pod的名称。在这种情况下,您将在名为kube-proxy-s7sxg
的Pod中执行命令。-n kube-system
: 这部分表示要在kube-system
命名空间中执行命令。kube-system
命名空间通常用于存储Kubernetes系统组件和插件。
三、鉴权(Authorization)
3.1 鉴权的功能
认证(Authentication)过程,只是确定通信的双方都确认了对方是可信的,可以相互通信。
鉴权(Authorization)是确定请求方有哪些资源的权限。
3.2 鉴权的授权策略
- AlwaysDeny:表示拒绝所有的请求,一般用于测试
- AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略,一般用于测试
- ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制。也就是说定义一个访问类型的属性,用户可以使用这个属性访问对应的资源。此方式设置较为繁琐,每次设置需要定义一长串的属性才可以。
- Webhook:通过调用外部REST服务对用户进行授权,即可在集群外部对K8S进行鉴权
- RBAC(Role-Based Access Control):基于角色的访问控制,K8S自1.6版本起默认使用规则
3.2.1 RBAC的优点
- 对集群中的资源(Pod,Deployment,Service)和非资源(元信息或者资源状态)均拥有完整的覆盖
- 整个RBAC完全由几个API资源对象完成,同其它API资源对象一样,可以用kubectl或API进行操作
- 可以在运行时进行调整,无需重启API Server,而ABAC则需要重启API Server
3.2.2 RBAC的API 资源对象说明
RBAC引入了4个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding,4种对象类型均可以通过kubectl与API Server操作。
官方文档:https://kubernetes.io/docs/reference/access-authn-authz/rbac/https://kubernetes.io/docs/reference/access-authn-authz/rbac/
3.2 角色
- Role:授权指定命名空间的资源控制权限
- ClusterRole:可以授权所有命名空间的资源控制权限
如果使用RoleBinding绑定ClusterRole,仍会受到命名空间的影响;如果使用 ClusterRoleBinding绑定ClusterRole, 将会作用于整个K8S集群。
3.3 角色绑定
- RoleBinding:将角色绑定到主体(即subject)
- ClusterRoleBinding:将集群角色绑定到主体
3.4 主体(subject)
- User:用户
- Group:用户组
- ServiceAccount:服务账号
User使用字符串表示,它的前缀system: 是系统保留的,集群管理员应该确保普通用户不会使用这个前缀格式;Group书写格式与User相同,同样system: 前缀也为系统保留。
Pod使用ServiceAccount认证时,service-account-token中的JWT会保存用户信息。 有了用户信息,再创建一对角色/角色绑定(集群角色/集群角色绑定)资源对象,就可以完成权限绑定了。
3.5 Role and ClusterRole
在 RBAC API 中,Role表示一组规则权限,权限只能增加(累加权限),不存在一个资源一开始就有很多权限而通过RBAC对其进行减少的操作。也就是说只有白名单权限,而没有黑名单权限的概念。
Role只能定义在一个namespace中,如果想要跨namespace则可以创建ClusterRole,也就是说定义ClusterRole不需要绑定namespace。
3.5.1 role示例
apiVersion: rbac.authorization.k8s.io/v1 #指定 core API 组和版本
kind: Role #指定类型为 Role
metadata:namespace: default #使用默认命名空间 name: pod-reader #Role 的名称
rules: #定义规则
- apiGroups: [""] #""表示 apiGroups 和 apiVersion 使用相同的 core API 组,即 rbac.authorization.k8s.ioresources: ["pods"] #资源对象为 Pod 类型verbs: ["get", "watch", "list"] #被授予的操作权限
以上配置的意义是,如果把pod-reader这个Role赋予给一个用户,那么这个用户将在default命名空间中具有对Pod资源对象 进行get(获取)、watch(监听)、list(列出)这三个操作权限。
3.5.2 ClusterRole示例
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:# "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制name: secret-reader
rules:
- apiGroups: [""]resources: ["secrets"] #资源对象为 Secret 类型verbs: ["get", "watch", "list"]
3.6 RoleBinding and ClusterRoleBinding
3.6.1 RoleBinding and ClusterRoleBinding定义
- RoloBinding 可以将角色中定义的权限授予用户或用户组,RoleBinding 包含一组主体(subject),subject 中包含有不同形式的待授予权限资源类型(User、Group、ServiceAccount)
- RoloBinding 同样包含对被绑定的 Role 引用;
- RoleBinding 适用于某个命名空间内授权,而 ClusterRoleBinding 适用于集群范围内的授权
3.6.2 RoleBinding示例1
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
- kind: Username: zhangsanapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
将default命名空间的pod-reader Role授予zhangsan用户,此后zhangsan用户在default命名空间中将具有pod-reader的权限。
RoleBinding同样可以引用ClusterRole来对当前namespace内User、Group或ServiceAccount进行授权, 这种操作允许集群管理员在整个集群内定义一些通用的ClusterRole,然后在不同的 namespace中使用RoleBinding来引用。
3.6.3 RoleBinding示例2
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-secretsnamespace: kube-public
subjects:
- kind: Username: lisiapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io
以上RoleBinding引用了一个ClusterRole,这个ClusterRole具有整个集群内对secrets的访问权限;但是其授权用户lisi只能访问kube-public空间中的secrets(因为RoleBinding定义在kube-public命名空间)。
使用ClusterRoleBinding可以对整个集群中的所有命名空间资源权限进行授权
3.6.4 ClusterRoleBinding示例
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: read-secrets-global
subjects:
- kind: Groupname: managerapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io
以上ClusterRoleBinding授权manager组内所有用户在全部命名空间中对secrets进行访问。
3.7 Resources
Kubernetes集群内一些资源一般以其名称字符串来表示,这些字符串一般会在API的URL地址中出现; 同时某些资源也会包含子资源,例如:log资源就属于pods的子资源,API中对Pod日志的请求URL样例如下:
GET /api/v1/namespaces/{namespace}/pods/{name}/log
在这里,pods对应名字空间作用域的Pod资源,而log是pods的子资源。
如果要在RBAC授权模型中控制这些子资源的访问权限,可以通过/分隔符来分隔资源和子资源实现。
3.7.1 示例
允许某主体读取pods同时访问这些Pod的log子资源
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: pod-and-pod-logs-reader
rules:
- apiGroups: [""]resources: ["pods", "pods/log"]verbs: ["get", "list"]
rules.verbs:"get", "list", "watch", "create", "update", "patch", "delete", "exec"
rules.resources:"services", "endpoints", "pods", "secrets", "configmaps", "crontabs", "deployments", "jobs", "nodes", "rolebindings", "clusterroles", "daemonsets", "replicasets", "statefulsets", "horizontalpodautoscalers", "replicationcontrollers", "cronjobs"
rules.apiGroups:"","apps", "autoscaling", "batch"
三、准入控制(Admission Control)
3.1 准入控制定义
准入控制是API Server的一个准入控制器插件列表,通过添加不同的插件,实现额外的准入控制规则。发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
一般建议直接采用官方默认的准入控制器。
3.1.1 官方准入控制器推荐列表(不同版本各有不同)
NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction
3.1.2 列举几个插件的功能
- NamespaceLifecycle:用于命名空间回收,防止在不存在的namespace上创建对象,防止删除系统预置namespace,删除namespace时,连带删除它的所有资源对象。
- LimitRanger:用于配额管理,确保请求的资源不会超过资源所在Namespace的LimitRange的限制。
- ServiceAccount:用于在每个Pod中自动化添加ServiceAccount,方便访问API Server。
- ResourceQuota:基于命名空间的高级配额管理,确保请求的资源不会超过资源的 ResourceQuota限制。
- NodeRestriction: 用于Node加入到K8S群集中以最小权限运行。
官方文档参考:https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/
四、实验部署
4.1 创建一个用户
useradd zhangsan
passwd zhangsan
4.2 使用这个用户进行资源操作,会发现连接API Server时被拒绝访问请求
4.3 创建用于用户连接到 API Server 所需的证书和 kubeconfig 文件
先上传证书生成工具cfssl、cfssljson、cfssl-certinfo到/usr/local/bin目录中
4.4 创建文件夹
mkdir /opt/zhangsan
cd /opt/zhangsan
4.5 API Server会把客户端证书的CN字段作为User,把names.O字段作为Group
vim user-cert.sh
#######################
cat > zhangsan-csr.json <<EOF
{"CN": "zhangsan","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}]
}
EOF
4.6 使用工具生成证书
cd /etc/kubernetes/pki/
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/zhangsan/zhangsan-csr.json | cfssljson -bare zhangsan
这是一个使用
cfssl
工具生成证书的命令。具体来说,它使用ca.crt
和ca.key
作为根证书和私钥,使用kubernetes
作为证书配置文件的配置文件,以及/opt/zhangsan/zhangsan-csr.json
中定义的证书签名请求文件来生成一个名为zhangsan
的证书。其中,
-profile
参数指定了证书配置文件的名称,-ca
和-ca-key
参数分别指定了根证书和私钥的文件路径,cfssljson -bare
命令用于将生成的证书和私钥文件输出到当前目录下,文件名为zhangsan
。需要注意的是,这个命令中的
/opt/zhangsan/zhangsan-csr.json
文件应该是一个包含了证书签名请求信息的 JSON 文件,其中包含了证书的一些基本信息,如 Common Name、Organization 等。
4.7 /etc/kubernetes/pki/目录中会生成zhangsan-key.pem、zhangsan.pem、zhangsan.csr
chmod +x user-cert.sh
./user-cert.sh
4.8 生成一个名为zhangsan.kubeconfig
的 kubeconfig 配置文件
APISERVER=$1
# 设置集群参数
export KUBE_APISERVER="https://$APISERVER:6443"
kubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=zhangsan.kubeconfig# 设置客户端认证参数
kubectl config set-credentials zhangsan \--client-key=/etc/kubernetes/pki/zhangsan-key.pem \--client-certificate=/etc/kubernetes/pki/zhangsan.pem \--embed-certs=true \--kubeconfig=zhangsan.kubeconfig# 设置上下文参数
kubectl config set-context kubernetes \--cluster=kubernetes \--user=zhangsan \--namespace=kgc \--kubeconfig=zhangsan.kubeconfig
这段脚本用于设置 Kubernetes 集群的认证参数和上下文参数,并生成一个名为
zhangsan.kubeconfig
的配置文件。
- 首先,脚本中的
APISERVER=\$1
表示将传入的第一个参数作为 API Server 的地址。- 接下来,通过
export KUBE_APISERVER="https://$APISERVER:6443"
将 API Server 的地址设置为https://$APISERVER:6443
,并将其导出为环境变量KUBE_APISERVER
。- 然后,使用
kubectl config set-cluster
命令设置集群参数。其中,--certificate-authority
参数指定了根证书的路径,--embed-certs=true
表示将证书嵌入到 kubeconfig 文件中,--server
参数指定了 API Server 的地址,--kubeconfig
参数指定了生成的 kubeconfig 文件的名称。- 接着,使用
kubectl config set-credentials
命令设置客户端认证参数。--client-key
参数指定了客户端私钥的路径,--client-certificate
参数指定了客户端证书的路径,--embed-certs=true
表示将证书嵌入到 kubeconfig 文件中,--kubeconfig
参数指定了生成的 kubeconfig 文件的名称- 最后,使用
kubectl config set-context
命令设置上下文参数。--cluster
参数指定了集群的名称,--user
参数指定了客户端的名称,--namespace
参数指定了默认的命名空间,--kubeconfig
参数指定了生成的 kubeconfig 文件的名称。综合起来,这段脚本的作用是生成一个名为
zhangsan.kubeconfig
的 kubeconfig 配置文件,其中包含了与 Kubernetes 集群的连接和认证所需的参数。
4.9 运行yaml
4.10 使用上下文参数生成zhangsan.kubeconfig文件
这是一个使用
kubectl
命令设置当前上下文的命令,其中--kubeconfig
参数指定了使用的 kubeconfig 文件的名称为zhangsan.kubeconfig
。具体来说,
kubectl config use-context
命令用于设置当前上下文,kubernetes
参数指定了上下文的名称,即之前脚本中设置的上下文名称。--kubeconfig
参数指定了使用的 kubeconfig 文件的名称为zhangsan.kubeconfig
,即之前脚本中生成的 kubeconfig 文件的名称。这个命令的作用是将当前上下文设置为
kubernetes
,并使用zhangsan.kubeconfig
文件中的参数进行连接和认证。这样,就可以使用kubectl
命令与 Kubernetes 集群进行交互了。
4.11 查看证书
4.12 编辑rbac.yaml
vim rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: kgcname: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list", "create"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: kgc
subjects:
- kind: Username: zhangsanapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
4.13 运行yaml文件
4.14 切换用户,测试操作权限
4.14.1 编辑pod-test.yaml文件
4.14.2 运行yaml文件
4.15 访问svc资源就会被拒绝
kubectl get svc
Error from server (Forbidden): services is forbidden: User "zhangsan" cannot list resource "services" in API group "" in the namespace "kgc"
4.16 无法访问default命名空间
kubectl get pods -n default
Error from server (Forbidden): pods is forbidden: User "zhangsan" cannot list resource "pods" in API group "" in the namespace "default"
4.17 使用root用户查看
kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kgc pod-test 1/1 Running 0 107s 10.244.2.2 node02 <none> <none>
由此可以看出RoleBinding的用户只能管理指定的命名空间中的资源
4.18 也可以通过绑定admin角色,来获得管理员权限
kubectl create rolebinding zhangsan-admin-binding --clusterrole=admin --user=zhangsan --namespace=kgc
相关文章:

k8s——安全机制
一、安全机制说明 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介, 也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。 比如 kubectl 如果想…...

Linux驱动应用编程(三)UART串口
本文目录 前述一、手册查看二、命令行调试串口1. 查看设备节点2. 使用stty命令设置串口3. 查看串口配置信息4. 调试串口 三、代码编写1. 常用API2. 例程线程优化 前述 在开始实验前,请一定要检查测试好所需硬件是否使用正常,不然调试过程中出现的问题&am…...

【设计模式深度剖析】【4】【行为型】【策略模式】
文章目录 策略模式定义英文原话直译 角色类图策略接口Strategy:具体策略类上下文类Context测试类 策略模式的应用策略模式的优点策略模式的缺点策略模式的使用场景 策略模式 策略模式(Strategy Pattern) Strategy策略也称作Policy政策。 想…...

opencv dnn模块 示例(26) 目标检测 object_detection 之 yolov10
文章目录 1、yolov10简要介绍1.1、双标签分配策略1.2、架构改进1.3、性能1.4、预训练模型1.5、网络有关层说明 2、测试2.1、官方测试2.2、opencv dnn2.2.1、仅运行到内部"NMS"步骤之前的层2.2.2、完整代码2.2.2、完整实现所有层 2.3、onnxruntime测试2.4、tensorrt 1…...

【python进阶】python图形化编程之美--tkinter模块初探
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

discuz点微同城源码34.7+全套插件+小程序前端
discuz点微同城源码34.7全套插件小程序前后端 模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序...

ActiveMQ 介绍、下载、安装和控制台
ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件,由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范,这意味着它提供了一组标准的 API,允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…...

MacOS M系列芯片一键配置多个不同版本的JDK
第一步:下载JDK。 官网下载地址:Java Archive | Oracle 选择自己想要下载的版本,一般来说下载一个jdk8和一个jdk11就够用了。 M系列芯片选择这两个,第一个是压缩包,第二个是dmg可以安装的。 第二步:编辑…...

源码文章上传无忧,论坛小程序支持
前言 在数字化时代,知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求,我们推出了全新的论坛小程序,不仅支持文章、源码、链接等多样化内容的上传,还实现了付费观看功能,为创作者们提供了一个展示才华…...
Docker面试整理-如何优化Docker容器的性能?
优化Docker容器的性能可以从多个方面入手,以下是一些建议: 选择合适的基础镜像:使用轻量级的基础镜像,如基于Alpine Linux的镜像,可以减少镜像的大小和启动时间。避免使用过于庞大的操作系统镜像。优化Dockerfile:减少Dockerfile中的不必要指令和层,以最小化镜像的大小。…...

list(二)和_stack_queue
嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(二)以及_stack_queue,下面让我们开始今天的学习吧! list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…...

查询SQL02:寻找用户推荐人
问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析: 这题主要是要看这null值会不会用,如果说Java玩多了,你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…...

2、Tomcat 线程模型详解
2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…...
对硬盘的设想:纸存、执行存
固态硬盘出现后,发现它的擦写次数受限,越是便宜的固态硬盘,擦写次数越少。于是,有了“纸存”的设想,即硬盘上的单元只能改写一次,就像拿钢笔在纸上写字一样。这时,文件系统、数据库该怎么设计&a…...

最新付会进群多群同时变现社群系统V3.5.3版本 详细教程+源码下载
市面1888最新付费进群多群同时变现系统V3.5.3版本 详细教程源码下载介绍: 续男粉变现,相亲群变现后 演化出来的最新多群同时变现系统 可同时进行40个群同时变现 可设置地域群,相亲,男粉变现等多种群 购买后包括详细的 域名服…...

python tk实现标签切换页面
import tkinter as tk from tkinter import ttk# 初始化主窗口 root tk.Tk() root.title("标签页示例")# 设置窗口大小 root.geometry("400x300")# 创建 Notebook 小部件 notebook ttk.Notebook(root) notebook.pack(expandTrue, fill"both")#…...

引擎:UI
一、控件介绍 Button 按钮 创建一个按钮 按钮禁用 精灵模式 颜色模式 缩放模式 绑定点击事件 EditBox 输入框 Layout 布局 支持水平排列、垂直排列、背包排列 PageView 页面视图 ProgressBar 进度条 RichText 富文本 绑定点击事件 事件可以被其它标签包裹 图文混排 Scroll…...
Redis常见异常及优化方案
Redis常见异常及优化方案 Redis集群(redis-cluster)中的三主三从或者哨兵(sentinel)模式配置是一种常见的高可用架构,用于解决单点故障和提高数据可靠性。然而,即使在这样的配置下,仍然可能会遇…...

YOLOV5 图像分割:利用yolov5进行图像分割
1、介绍 本章将介绍yolov5的分割部分,其他的yolov5分类、检测项目参考之前的博文 分类:YOLOV5 分类:利用yolov5进行图像分类_yolov5 图像分类-CSDN博客 检测:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 yolov5的分割和常规的分割项目有所区别,这里分割的结果…...
如何在Linux中使用Screen管理后台进程
如何在Linux中使用Screen管理后台进程 在Linux系统中,screen是一个非常有用的工具,它允许用户在一个终端窗口中创建多个虚拟终端,并且可以在这些终端之间切换,甚至可以在断开连接后重新连接到这些会话。这对于需要在后台运行长时…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...