严格把控K8S集群中的操作权限,为普通用户生成特定的kubeconfig文件

news2025/3/13 22:58:26

文章目录

  • 前言
  • 一、背景
  • 二、证书和证书签名请求(了解)
    • 1.证书签名请求
    • 2.请求签名流程
    • 3.Kubernetes 签名者
    • 4.证书过期时间限制字段
  • 二、脚本示例
    • 2.检查集群上下文及csr
    • 3.切换集群上下文,检查权限
    • 4.普通用户操作
  • 总结


前言

使用并维护过K8S的ops/sre都知道,kubeconfig对于k8s的访问是非常重要。无论是部署,调试还是运维,都需要kubeconfig文件。在通过二进制或者kubeadm方式部署完一套集群后,会在/root/.kube/目录下产生一个config文件,这个文件就是集群的管理文件,如果直接给将该文件给到其他人员肯定不合适,因为管理员的kubeconfig可以干任何事情,注意是任何事情。包括删除节点等高危操作。因此,就涉及到了k8s集群的权限管理。


一、背景

生产环境已存在一套k8s集群,你是集群的管理员,你的同事目前想操作集群中test命名空间下的资源,然后跟你要管理员权限进入集群,你说你能给嘛?当然不行啦,那你作为管理员怎么办呢?那就是给他结合集群中的RBAC权限控制机制,创建一个新的config文件且只能操作test空间下的资源

二、证书和证书签名请求(了解)

Kubernetes 证书和信任包(trust bundle)API 可以通过为 Kubernetes API 的客户端提供编程接口, 实现 X.509 凭据的自动化制备, 从而请求并获取证书颁发机构(CA)发布的 X.509 证书。

1.证书签名请求

CertificateSigningRequest (CSR)资源用来向指定的签名者申请证书签名, 在最终签名之前,申请可能被批准,也可能被拒绝

2.请求签名流程

1、CertificateSigningRequest 资源类型允许客户端基于签名请求申请发放 X.509 证书。 
	CertificateSigningRequest 对象在 spec.request 字段中包含一个 PEM 编码的 PKCS 签名请求。 
	CertificateSigningRequest 使用 spec.signerName 字段标示签名者(请求的接收方)。 
		注意:
			1、spec.signerName 在 certificates.k8s.io/v1 之后的 API 版本是必填项。
			2、在 Kubernetes v1.22 和以后的版本,客户可以设置 spec.expirationSeconds 字段(可选)来为颁发的证书设定一个特定的有效期。
				该字段的最小有效值是 600,也就是 10 分钟。

2、创建完成的 CertificateSigningRequest,要先通过批准,然后才能签名。
	 根据所选的签名者,CertificateSigningRequest 可能会被控制器自动批准。 否则,就必须人工批准, 
	 人工批准可以使用 REST API(或 client-go),也可以执行 kubectl certificate approve 命令。 
	 同样,CertificateSigningRequest 也可能被驳回, 这就相当于通知了指定的签名者,这个证书不能签名。

3、对于已批准的证书,下一步是签名。 对应的签名控制器首先验证签名条件是否满足,然后才创建证书。 
	签名控制器然后更新 CertificateSigningRequest, 将新证书保存到现有 CertificateSigningRequest 对象的 status.certificate 字段中。 
	此时,字段 status.certificate 要么为空,要么包含一个用 PEM 编码的 X.509 证书。 
	直到签名完成前,CertificateSigningRequest 的字段 status.certificate 都为空。

4、一旦 status.certificate 字段完成填充,请求既算完成, 
客户端现在可以从 CertificateSigningRequest 资源中获取已签名的证书的 PEM 数据。 当然如果不满足签名条件,签名者可以拒签。

注意:
	为了减少集群中遗留的过时的 CertificateSigningRequest 资源的数量, 一个垃圾收集控制器将会周期性地运行。 
	此垃圾收集器会清除在一段时间内没有改变过状态的 CertificateSigningRequest:
		已批准的请求: 1 小时后自动删除
		已拒绝的请求: 1 小时后自动删除
		已失败的请求: 1 小时后自动删除
		挂起的请求: 24 小时后自动删除
		所有请求: 在颁发的证书过期后自动删除

3.Kubernetes 签名者

相关知识如下

Kubernetes 提供了内置的签名者,每个签名者都有一个众所周知的 signerName:

kubernetes.io/kube-apiserver-client:签名的证书将被 API 服务器视为客户端证书, kube-controller-manager 不会自动批准它。
1、信任分发:签名的证书将被 API 服务器视为客户端证书,CA 证书包不通过任何其他方式分发。
2、许可的主体:没有主体限制,但审核人和签名者可以选择不批准或不签署。 某些主体,比如集群管理员级别的用户或组因部署和安装方式不同而不同, 所以批准和签署之前需要进行额外仔细审查。 用来限制 system:masters 的 CertificateSubjectRestriction 准入插件默认处于启用状态, 但它通常不是集群中唯一的集群管理员主体。
3、许可的 x509 扩展:允许 subjectAltName 和 key usage 扩展,弃用其他扩展。
4、许可的密钥用途:必须包含 [“client auth”],但不能包含 [“digital signature”, “key encipherment”, “client auth”] 之外的键。
5、过期时间/证书有效期:对于 kube-controller-manager 实现的签名者, 设置为 --cluster-signing-duration 选项和 CSR 对象的 spec.expirationSeconds 字段(如有设置该字段)中的最小值。
6、允许/不允许 CA 位:不允许。

kubernetes.io/kube-apiserver-client-kubelet:签名的证书将被 kube-apiserver 视为客户端证书。 kube-controller-manager 可以自动批准它。
1、信任分发:签名的证书将被 API 服务器视为客户端证书,CA 证书包不通过任何其他方式分发。
2、许可的主体:组织名必须是 [“system:nodes”],通用名称为 “system:node:${NODE_NAME}” 开头
3、许可的 x509 扩展:允许 key usage 扩展,禁用 subjectAltName 扩展,并删除其他扩展。
4、许可的密钥用途:[“key encipherment”, “digital signature”, “client auth”] 或 [“digital signature”, “client auth”]。
5、过期时间/证书有效期:对于 kube-controller-manager 实现的签名者, 设置为 --cluster-signing-duration 选项和 CSR 对象的 spec.expirationSeconds 字段(如有设置该字段)中的最小值。
6、允许/不允许 CA 位:不允许。

kubernetes.io/kubelet-serving:签名服务端证书,该服务证书被 API 服务器视为有效的 kubelet 服务端证书, 但没有其他保证。kube-controller-manager 不会自动批准它。
1、信任分发:签名的证书必须被 kube-apiserver 认可,可有效的中止 kubelet 连接,CA 证书包不通过任何其他方式分发。
2、许可的主体:组织名必须是 [“system:nodes”],通用名称为 “system:node:${NODE_NAME}” 开头
3、许可的 x509 扩展:允许 key usage、DNSName/IPAddress subjectAltName 等扩展, 禁止 EmailAddress、URI subjectAltName 等扩展,并丢弃其他扩展。 至少有一个 DNS 或 IP 的 SubjectAltName 存在。
4、许可的密钥用途:[“key encipherment”, “digital signature”, “server auth”] 或 [“digital signature”, “server auth”]。
5、过期时间/证书有效期:对于 kube-controller-manager 实现的签名者, 设置为 --cluster-signing-duration 选项和 CSR 对象的 spec.expirationSeconds 字段(如有设置该字段)中的最小值。
6、允许/不允许 CA 位:不允许。

kubernetes.io/legacy-unknown:不保证信任。Kubernetes 的一些第三方发行版可能会使用它签署的客户端证书。 稳定版的 CertificateSigningRequest API(certificates.k8s.io/v1 以及之后的版本)不允许将 signerName 设置为 kubernetes.io/legacy-unknown。 kube-controller-manager 不会自动批准这类请求。
1、信任分发:没有。这个签名者在 Kubernetes 集群中没有标准的信任或分发。
2、许可的主体:全部。
3、许可的 x509 扩展:允许 subjectAltName 和 key usage 等扩展,并弃用其他扩展。
4、许可的密钥用途:全部。
5、过期时间/证书有效期:对于 kube-controller-manager 实现的签名者, 设置为 --cluster-signing-duration 选项和 CSR 对象的 spec.expirationSeconds 字段(如有设置该字段)中的最小值。
6、允许/不允许 CA 位 - 不允许。

kube-controller-manager 为每个内置签名者实现了控制平面签名。 注意:所有这些故障仅在 kube-controller-manager 日志中报告。

4.证书过期时间限制字段

要使用expirationSeconds 字段前提是k8s版本是1.22+

签名请求格式并没有一种标准的方法去设置证书的过期时间或者生命期, 
因此,证书的过期时间或者生命期必须通过 CSR 对象的 spec.expirationSeconds 字段来设置。 

当 spec.expirationSeconds 没有被指定时,
内置的签名者默认使用 ClusterSigningDuration 配置选项 (kube-controller-manager 的命令行选项 --cluster-signing-duration),
该选项的默认值设为 1 年。 当 spec.expirationSeconds 被指定时,
spec.expirationSeconds 和 ClusterSigningDuration 中的最小值会被使用

二、脚本示例

脚本作用: 用户只能针对某个命名空间下的资源做相应的操作。具体哪些操作可以看脚本中的create_role部分。可以自行修改

脚本如下(示例):

#!/bin/bash

# 错误处理函数
function error_exit {
    echo "$1" 1>&2
    exit 1
}

# 检查输入参数是否为空
if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4" ]]; then
    error_exit "Usage: $0 <KUBEAPISERVER> <KUBEUSERNAME> <NAMESPACE> <EXPIRATIONSECONDS>"
fi

# 指定变量
export KUBEAPISERVER="$1"
export KUBEUSERNAME="$2"
export NAMESPACE="$3"
export EXPIRATIONSECONDS="$4"

# 校验命名空间是否为空
if [[ -z "$NAMESPACE" ]]; then
    error_exit "The namespace is not found, please set it."
fi

# 构建用户名
KUBEUSERNAME="${NAMESPACE}_${KUBEUSERNAME}"

# 创建 Role 资源
function create_role {
echo "Creating Role for user: $KUBEUSERNAME in namespace: $NAMESPACE..."
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cluster-$KUBEUSERNAME
  namespace: $NAMESPACE
rules:
- apiGroups:
  - ""
  resources:
  - pods/attach
  - pods/exec
  - pods/portforward
  - pods/proxy
  - secrets
  - services/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - serviceaccounts
  verbs:
  - impersonate
- apiGroups:
  - ""
  resources:
  - pods
  - pods/attach
  - pods/exec
  - pods/portforward
  - pods/proxy
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - replicationcontrollers
  - replicationcontrollers/scale
  - secrets
  - serviceaccounts
  - services
  - services/proxy
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - apps
  resources:
  - daemonsets
  - deployments
  - deployments/rollback
  - deployments/scale
  - replicasets
  - replicasets/scale
  - statefulsets
  - statefulsets/scale
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - deployments/rollback
  - deployments/scale
  - ingresses
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicationcontrollers/scale
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - networkpolicies
  verbs:
  - create
  - delete
  - deletecollection
  - patch
  - update
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - persistentvolumeclaims/status
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - services/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - controllerrevisions
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - replicasets
  - replicasets/scale
  - replicasets/status
  - statefulsets
  - statefulsets/scale
  - statefulsets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  - horizontalpodautoscalers/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - cronjobs/status
  - jobs
  - jobs/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - ingresses
  - ingresses/status
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicasets/status
  - replicationcontrollers/scale
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  - poddisruptionbudgets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - ingresses/status
  - networkpolicies
  verbs:
  - get
  - list
  - watch
EOF
}

# 生成密钥和证书请求
function create_rsa {
echo "Generating key and CSR for user: $KUBEUSERNAME..."
openssl genrsa -out $KUBEUSERNAME.key 2048 || error_exit "Failed to generate private key."
openssl req -new -key $KUBEUSERNAME.key -out $KUBEUSERNAME.csr -subj "/CN=$KUBEUSERNAME/O=tpaas:${KUBEUSERNAME}:rw" || error_exit "Failed to generate CSR."
}
function create_csr {
# 创建 CertificateSigningRequest
echo "Creating CertificateSigningRequest for user: $KUBEUSERNAME..."
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: $KUBEUSERNAME
spec:
  groups:
  - system:authenticated
  request: $(cat ./$KUBEUSERNAME.csr | base64 | tr -d "\n")
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: $EXPIRATIONSECONDS
  usages:
  - client auth
EOF
}

function approve_csr_command {
# 批准证书请求
echo "Approving CertificateSigningRequest for user: $KUBEUSERNAME..."
kubectl certificate approve $KUBEUSERNAME || error_exit "Failed to approve certificate request."

# 获取证书并解码
echo "Retrieving and decoding the certificate for user: $KUBEUSERNAME..."
kubectl get csr $KUBEUSERNAME -oyaml | grep "certificate:" | grep -v "f:" | awk '{printf $2}' | base64 -d > $KUBEUSERNAME.cert || error_exit "Failed to retrieve or decode the certificate."

# 配置 kubectl
echo "Configuring kubectl for user: $KUBEUSERNAME..."
kubectl --kubeconfig=$KUBEUSERNAME.kubeconfig config set-cluster kubernetes --server=$KUBEAPISERVER --insecure-skip-tls-verify=true --namespace=$NAMESPACE || error_exit "Failed to set cluster."
kubectl --kubeconfig=$KUBEUSERNAME.kubeconfig config set-credentials $KUBEUSERNAME --embed-certs=true --client-certificate=$KUBEUSERNAME.cert --client-key=$KUBEUSERNAME.key --namespace=$NAMESPACE || error_exit "Failed to set credentials."
kubectl --kubeconfig=$KUBEUSERNAME.kubeconfig config set-context $KUBEUSERNAME@kubernetes --cluster=kubernetes --namespace=$NAMESPACE --user=$KUBEUSERNAME || error_exit "Failed to set context."

# 创建 RoleBinding
echo "Creating RoleBinding for user: $KUBEUSERNAME..."
kubectl create rolebinding cluster-$KUBEUSERNAME --role=cluster-$KUBEUSERNAME --group="tpaas:${KUBEUSERNAME}:rw" -n $NAMESPACE || error_exit "Failed to create RoleBinding."
}
function backup_config_new {
# 备份原有 kubeconfig 文件
echo "Backing up current kubeconfig..."
cp -rp ~/.kube/config /tmp/config_bak_$(date +%F-%H-%M-%S) || error_exit "Failed to backup kubeconfig."

# 移动生成的 kubeconfig 文件
echo "Moving generated kubeconfig for user: $KUBEUSERNAME..."
mv /root/cert_user/$KUBEUSERNAME.kubeconfig /root/cert_user/config || error_exit "Failed to move kubeconfig."

# 更新 KUBECONFIG 环境变量并保存配置
echo "Setting KUBECONFIG environment variable and saving merged config..."
export KUBECONFIG=/root/.kube/config:/root/cert_user/config
kubectl config view --merge --flatten > /root/configs || error_exit "Failed to merge kubectl config."
cp -rp /root/configs /root/.kube/config || error_exit "Failed to overwrite the original kubeconfig."

echo "Kubeconfig for user $KUBEUSERNAME has been successfully configured and saved."
}
create_role
create_rsa
create_csr
approve_csr_command
backup_config_new

执行脚本,参数从左到右依次是集群地址、用户名称、命名空间、过期时间

[root@k8s-master cert_user]# sh ops.sh https://192.168.56.101:6443 wzry test 1200
Creating Role for user: test_wzry in namespace: test...
role.rbac.authorization.k8s.io/cluster-test_wzry created
Generating key and CSR for user: test_wzry...
Generating RSA private key, 2048 bit long modulus (2 primes)
..................................................+++++
.....+++++
e is 65537 (0x010001)
Creating CertificateSigningRequest for user: test_wzry...
certificatesigningrequest.certificates.k8s.io/test_wzry created
Approving CertificateSigningRequest for user: test_wzry...
certificatesigningrequest.certificates.k8s.io/test_wzry approved
Retrieving and decoding the certificate for user: test_wzry...
Configuring kubectl for user: test_wzry...
Cluster "kubernetes" set.
User "test_wzry" set.
Context "test_wzry@kubernetes" created.
Creating RoleBinding for user: test_wzry...
rolebinding.rbac.authorization.k8s.io/cluster-test_wzry created
Backing up current kubeconfig...
Moving generated kubeconfig for user: test_wzry...
Setting KUBECONFIG environment variable and saving merged config...
Kubeconfig for user test_wzry has been successfully configured and saved.

2.检查集群上下文及csr

代码如下(示例):

[root@k8s-master cert_user]# kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
          test_wzry@kubernetes          kubernetes   test_wzry           test
[root@k8s-master cert_user]# kubectl get csr
NAME        AGE   SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
test_wzry   18m   kubernetes.io/kube-apiserver-client   kubernetes-admin   20m                 Approved,Issued

字段解释

NAME: 证书请求的名称,这里是 test_wzry。

AGE: 证书请求已经存在的时间,这里是 18 分钟。

SIGNERNAME: 签名者的名称,这里是 kubernetes.io/kube-apiserver-client,表示这是一个针对 Kubernetes API 服务器客户端的证书请求。

REQUESTOR: 发起请求的用户,这里是 kubernetes-admin。

REQUESTEDDURATION: 签发的证书有效期时长,这里是 20 分钟。当AGE字段时间达到20分钟时,就会过期。当过期后,集群的垃圾收集控制器会在1小时内删除掉该csr

CONDITION: 当前请求的状态。Approved,Issued 表示证书请求已经被批准,并且证书已经签发。

3.切换集群上下文,检查权限

[root@k8s-master cert_user]# kubectl config use-context test_wzry@kubernetes 
Switched to context "test_wzry@kubernetes".

查看集群中所有pod,会报错,因为该用户只有test命名空间下的操作权限

[root@k8s-master cert_user]# kubectl get pod -A
Error from server (Forbidden): pods is forbidden: User "test_wzry" cannot list resource "pods" in API group "" at the cluster scope

操作test命名空间下的资源

[root@k8s-master cert_user]# kubectl get pod -n test
NAME                           READY   STATUS              RESTARTS   AGE
test5-nginx-7885895787-wbv4b   0/1     ContainerCreating   0          92m

[root@k8s-master cert_user]# kubectl apply -f ../YamlTest/test_nginx.yml 
deployment.apps/test6-nginx created

[root@k8s-master cert_user]# kubectl logs -f -n test test6-nginx-58f8f74bbd-npx6s 
Error from server (BadRequest): container "nginx" in pod "test6-nginx-58f8f74bbd-npx6s" is waiting to start: ContainerCreating

[root@k8s-master cert_user]# kubectl delete deployments.apps -n test test6-nginx 
deployment.apps "test6-nginx" deleted

至此,该脚本针对单个命名空间下的操作都是成功的

4.普通用户操作

用生成的config文件操作命名空间下的资源

[root@k8s-master cert_user]# kubectl --kubeconfig=./config get pod -n test
NAME                           READY   STATUS              RESTARTS   AGE
test5-nginx-7885895787-wbv4b   0/1     ContainerCreating   0          93m

总结

本篇文章主要针对RBAC机制、csr以及用户权限划分做出了一个示例,对集群权限的严格把控,才能以更安全的方式维护集群

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

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

相关文章

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程&#xff1a;自回归生成 LLM&#xff08;如DeepSeek、ChatGPT、LLaMA系列等&#xff09;的推理本质是自回归生成&#xff1a;从初始输入&#xff08;如[CLS]或用户prompt&#xff09;开始&#xff0c;逐token预测下一个词&#xff0c;直到生成结束符&…

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…

Flutter_学习记录_video_player、chewie 播放视频

1. video_player 视频播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改这个文件&#xff1a;/android/app/src/main/AndroidMani…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…

达梦数据库查看字符集编码

select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR

Pac-Man(吃豆人) 游戏

目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…

【Spring】@PostConstruct详解

在 Java 开发中&#xff0c;尤其是在基于 Spring 框架的项目里&#xff0c;我们常常会遇到需要在对象创建并完成依赖注入后&#xff0c;执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的&#xff0c;它为我们提供了一种便捷且优雅的方式来处理对象的初始…

OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示

从企业管理器 13.4 版本更新 10 (RU10) 开始&#xff0c;ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中&#xff0c;单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…

Spring Security的作用

一、概述 Spring Security是一个框架&#xff0c;提供认证&#xff08;authentication&#xff09;、授权&#xff08;authorization&#xff09;和保护&#xff0c;以抵御常见攻击。对 常见漏洞 的保护提供了全面的支持&#xff0c;它对保护命令式和响应式应用程序有一流的支…

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…

数据类设计_图片类设计之4_规则类图形混合算法(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

cpu 多级缓存L1、L2、L3 与主存关系

现代 CPU 的多级缓存&#xff08;L1、L2、L3&#xff09;和主存&#xff08;DRAM&#xff09;构成了一个层次化的内存系统&#xff0c;旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析&#xff1a; 1. 缓存层次结构 现代 CPU 通…

基于Python+SQLite实现校园信息化统计平台

一、项目基本情况 概述 本项目以清华大学为预期用户&#xff0c;作为校内信息化统计平台进行服务&#xff0c;建立网页端和移动端校内信息化统计平台&#xff0c;基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求&#xff0c;如活动报名、实验室招募、多…

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

标题&#xff1a;[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点&#xff1a;二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…

vue组件库el-menu导航菜单设置index,地址不会变更的问题

请先确认 1.路由已配置好 route-index.js如下&#xff0c; 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库&#xff0c;并做修改 其中index与路由配置的地址一致 运行后发现点击菜单&#xff0c;url地址还是不变&#xff0c;查看组件库 Element - The worlds …

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器&#xff0c;再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作&#xff0c;包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器&#xff1a;管理…