k8s-配置与存储-配置管理

文章目录

    • 一、配置存储
    • 1.1 ConfigMap
      • 1.1.1.基于文件夹的创建方式
      • 1.1.2指定文件的创建方式
      • 1.1.3 配置文件创建configmap
    • 1.2 Secret
      • 1.2.1Secret的应用与Docker仓库 Secret设置
        • 1. Kubernetes 中的 Secrets:
        • 创建 Secret 示例:
        • 将 Secret 挂载到 Pod 中的示例:
        • 2. Docker 仓库中的 Secret:
        • 在 Kubernetes 中设置 Docker 仓库的 Secret 示例:
        • 在 Pod 中使用 Docker 仓库的 Secret 示例:
    • 1.3SubPath 的使用
      • 1.3.1 使用SubPath
    • 1.4ConfigMap的热更新
    • 1.5不可变的 Secret 和 ConfigMap

在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。
Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失。
kubernetes的Volume支持多种类型,比较常见的有下面几个:

  • 简单存储:EmptyDir、HostPath、NFS
  • 高级存储:PV、PVC
  • 配置存储:ConfigMap、Secret

一、配置存储

1.1 ConfigMap

1.1.1.基于文件夹的创建方式

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。
使用 kubectl create configmap -h 查看示例,构建 configmap 对象

[root@k8s-master ~]# mkdir config
[root@k8s-master ~]# cd config

[root@k8s-master config]# kubectl create configmap -h

image.png
创建两个配置文件

[root@k8s-master config]# mkdir test
[root@k8s-master config]# cd test/
[root@k8s-master test]# ls
[root@k8s-master test]# touch db.properties
[root@k8s-master test]# ls
db.properties
[root@k8s-master test]# vi db.properties

username=root
password=admin
[root@k8s-master test]# vi redis.properties
host:127.0.0.1
port:6379

#创建一个名为 test-dir-config 的 ConfigMap,其中包含来自指定目录的所有文件
[root@k8s-master config]# kubectl create configmap test-dir-config --from-file=test/
configmap/test-dir-config created
  • kubectl create configmap: 这是用于在 Kubernetes 中创建 ConfigMap 的命令。
  • test-dir-config: 这是您为新创建的 ConfigMap 指定的名称。
  • –from-file=test/: 这个标志指定了 ConfigMap 的数据来自哪个目录kubectl create configmap: 这是用于在 Kubernetes 中创建 ConfigMap 的命令。
# 获取ConfigMap 列表
[root@k8s-master config]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      15d
test-dir-config    2      103s

  • kube-root-ca.crt: 包含了一个数据项 ,存储根证书的 ConfigMap
  • test-dir-config: 包含了两个数据项。这是在之前的操作中创建的 ConfigMap,它从 test/ 目录中获取了两个文件的内容。
#查看详细信息
[root@k8s-master config]# kubectl describe cm test-dir-config

image.png

1.1.2指定文件的创建方式

[root@k8s-master config]# vi application.yml
spring:
  application:
    name: test app
server:
  port:8080

[root@k8s-master config]# kubectl create cm spring-boot-test-yaml --from-file=/root/config/application.yml
configmap/spring-boot-test-yaml created
# 获取ConfigMap 列表
[root@k8s-master config]# kubectl get cm
NAME                    DATA   AGE
kube-root-ca.crt        1      15d
spring-boot-test-yaml   1      20s
test-dir-config         2      12m
[root@k8s-master config]# kubectl describe cm spring-boot-test-yaml

image.png

1.1.3 配置文件创建configmap

创建configmap.yaml,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: dev
data:
  info: |
    username:admin
    password:123456

接下来,使用此配置文件创建configmapp

 创建configmap
[root@k8s-master config]# kubectl create -f configmap.yaml
configmap/configmap created
# 查看configmap详情
[root@k8s-master config]# kubectl describe cm configmap -n dev
Name:         configmap
Namespace:    dev
Labels:       <none>
Annotations:  <none>

Data
====
info:
----
username:admin
password:123456


BinaryData
====

Events:  <none>

接下来创建一个pod-configmap.yaml,将上面创建的configmap挂载进去

apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    volumeMounts: # 将configmap挂载到目录
    - name: config
      mountPath: /configmap/config
  volumes: # 引用configmap
  - name: config
    configMap:
      name: configmap

# 创建pod
[root@k8s-master config]#  kubectl create -f pod-configmap.yaml
pod/pod-configmap created
# 查看pod
[root@k8s-master config]# kubectl get pod pod-configmap -n dev
NAME            READY   STATUS    RESTARTS   AGE
pod-configmap   1/1     Running   0          15s

#进入容器
[root@k8s-master ~]# kubectl exec -it pod-configmap -n dev -- /bin/sh
# 
# cd  /configmap/config/
# ls
info
# more info
username:admin
password:123456

# 可以看到映射已经成功,每个configmap都映射成了一个目录
# key--->文件     value---->文件中的内容
# 此时如果更新configmap的内容, 容器中的值也会动态更新

1.2 Secret

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。

1.2.1Secret的应用与Docker仓库 Secret设置

1. Kubernetes 中的 Secrets:

在 Kubernetes 中,Secrets 可以用于以下目的:

  • 存储敏感数据: 比如数据库密码、API 密钥等。
  • 挂载到 Pod 中: Secrets 可以通过 Volume 挂载到 Pod 中,使应用程序能够读取敏感数据。这有助于将敏感信息与应用程序的配置分离开。
  • 用于身份验证: 在某些情况下,Secrets 也可以用于身份验证,例如在 Ingress 中配置 TLS 证书。
创建 Secret 示例:

1.首先使用base64对数据进行编码

#准备username
[root@k8s-master ~]# echo -n 'admin' | base64 
YWRtaW4=

 #准备password
[root@k8s-master ~]#  echo -n '123456' | base64
MTIzNDU2

2.接下来编写secret.yaml,并创建Secret

apiVersion: v1
kind: Secret
metadata:
  name: secret
  namespace: dev
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2

# 创建secret
[root@k8s-master config]#  kubectl create -f secret.yaml
secret/secret created
# 查看secret详情
[root@k8s-master config]#  kubectl describe secret secret -n dev
Name:         secret
Namespace:    dev
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  5 bytes


3.创建pod-secret.yaml,将上面创建的secret挂载进去:

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    volumeMounts: # 将secret挂载到目录
    - name: config
      mountPath: /secret/config
  volumes:
  - name: config
    secret:
      secretName: secret

# 创建pod
[root@k8s-master config]# kubectl create -f pod-secret.yaml
pod/pod-secret created

# 查看pod
[root@k8s-master config]# kubectl get pod pod-secret -n dev
NAME            READY   STATUS    RESTARTS   AGE
pod-secret      1/1     Running   0          2m28s

# 进入容器,查看secret信息,发现已经自动解码了
[root@k8s-master config]# kubectl exec -it pod-secret -- /bin/sh -n dev
/ # ls /secret/config/
password  username
/ # more /secret/config/username
admin
/ # more /secret/config/password
123456

另一种创建方法:

kubectl create secret generic my-secret \
  --from-literal=username=my-username \
  --from-literal=password=my-password

将 Secret 挂载到 Pod 中的示例:
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/myapp
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

2. Docker 仓库中的 Secret:

在 Docker 仓库中,Secrets 通常用于:

  • 拉取私有镜像: 如果您的 Docker 镜像存储库是私有的,您需要将 Docker 仓库的凭据存储在 Kubernetes 中的 Secret 中,以便 Pods 能够拉取镜像。
在 Kubernetes 中设置 Docker 仓库的 Secret 示例:
kubectl create secret docker-registry my-docker-secret \
  --docker-server=my-docker-registry.com \
  --docker-username=my-username \
  --docker-password=my-password \
  --docker-email=my-email@example.com

在 Pod 中使用 Docker 仓库的 Secret 示例:
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: my-docker-registry.com/myimage:latest
  imagePullSecrets:
  - name: my-docker-secret

这将使 Kubernetes 能够使用 my-docker-secret 中的凭据拉取 my-docker-registry.com/myimage:latest 这个私有 Docker 镜像

1.3SubPath 的使用

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
配置方式:

  1. 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
  2. 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:
......
volumeMounts:
- mountPath: /etc/nginx/nginx.conf # 挂载到哪里
name: config-volume # 使用哪个 configmap 或 secret
subPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:
name: nginx-conf # configMap 名字
items: # subPath 配置
key: nginx.conf # configMap 中的文件名
path: etc/nginx/nginx.conf # subPath 路径
[root@k8s-master etc]# kubectl get po
NAME                          READY   STATUS    RESTARTS       AGE
nginx-85b98978db-mkp29        1/1     Running   2 (3d3h ago)   12d
nginx-deploy-c4986b7f-8tplt   1/1     Running   2 (3d3h ago)   6d6h
nginx-deploy-c4986b7f-qltv6   1/1     Running   2 (3d3h ago)   6d6h

[root@k8s-master etc]# kubectl exec -it  nginx-deploy-c4986b7f-8tplt -- sh
# cd /etc
# cd nginx
# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf
# cat nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
#复制配置信息 退出容器
# exit

#创建nginx.conf文件
[root@k8s-master config]# vi nginx-conf
[root@k8s-master config]# ls
nginx-conf

 [root@k8s-master config]# kubectl create configmap nginx-conf-cm --from-file=./nginx-conf
configmap/nginx-conf-cm created
[root@k8s-master config]# kubectl describe cm nginx-conf-cm

Name:         nginx-conf-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx-conf:
----
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


BinaryData
====

Events:  <none>


存储的内容就是nginx-conf这个文件

[root@k8s-master config]# kubectl edit deploy nginx-deploy

1705312068272.png

        volumeMounts: # 挂在数据卷
        - name: nginx-conf # 数据卷的名称
          mountPath: '/etc/nginx' # 挂载的路径
      volumes: # 数据卷定义
      - name: nginx-conf # 数据卷的名称
        configMap: # 数据卷类型为 configmap
          name: nginx-conf-cm #configmap名字
          items:  # 要将 configmap中哪些数据挂在尽力啊
          - key: nginx-conf # 指定挂在哪个key
            path: nginx.conf # 挂在后该key重命名什么名字

[root@k8s-master config]# kubectl get po
NAME                           READY   STATUS             RESTARTS       AGE
nginx-85b98978db-mkp29         1/1     Running            2 (3d3h ago)   12d
nginx-deploy-7c6975968-t5w5b   0/1     CrashLoopBackOff   4 (62s ago)    2m37s
[root@k8s-master config]# kubectl edit deploy nginx-deploy
deployment.apps/nginx-deploy edited
# 在name: nginx后面加入
    command: ["/bin/sh", "-c","nginx daemon off;sleep 3600"]


[root@k8s-master config]# kubectl get po
NAME                            READY   STATUS    RESTARTS       AGE
nginx-deploy-55f7b46d59-lp5px   1/1     Running   0              22s
nginx-deploy-55f7b46d59-wrfjm   1/1     Running   0              20s

[root@k8s-master config]# kubectl exec -it nginx-deploy-55f7b46d59-lp5px  -- sh
# cd /etc/nginx
# ls
nginx.conf

进入容器后发现原来的一堆配置文件都不见了
得出结果:使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉.此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

1.3.1 使用SubPath


 [root@k8s-master config]# kubectl edit deploy nginx-deploy

 volumeMounts:
        - mountPath: /etc/nginx/nginx.conf
          name: nginx-conf
          subPath: etc/nginx/nginx.conf
          
 volumes:
      - configMap:
          defaultMode: 420
          items:
          - key: nginx-conf
            path: etc/nginx/nginx.conf
          name: nginx-conf-cm
        name: nginx-conf


[root@k8s-master config]#  kubectl get po
NAME                            READY   STATUS    RESTARTS        AGE
nginx-85b98978db-mkp29          1/1     Running   2 (3d20h ago)   12d
nginx-deploy-5588c8bc86-bhj9l   1/1     Running   0               35s
nginx-deploy-5588c8bc86-ltxvs   1/1     Running   0               34s
#进入容器
[root@k8s-master config]# kubectl exec -it nginx-deploy-5588c8bc86-bhj9l -- sh
#
# cd /etc/nginx
# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  nginx.conf  scgi_params  uwsgi_params  win-utf


配置了subPath后进入容器后发现 原来那些文件没有被覆盖掉了,这样就解决了加载配置覆盖原目录的问题。

1.4ConfigMap的热更新

我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?
这得分成几种情况:
默认方式:会更新,更新周期是更新时间 + 缓存时间
subPath:不会更新
变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的
对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置
但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可
1705374682085.png

  1. 通过 edit 命令直接修改 configmap
  2. 通过 replace 替换

由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file 参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现
# 该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换
kubectl create cm --from-file=nginx.conf --dry-run -o yaml | kubectl replace -f-

#查看当前的 ConfigMap
[root@k8s-master config]# kubectl get cm -n dev
NAME               DATA   AGE
configmap          1      3d19h

[root@k8s-master config]# ls
application.yml  file1.txt  nginx-conf  nginx-pod-configmap.yaml  secret.yaml
configmap.yaml   file2.txt  nginx.conf  pod-secret.yaml           test
#修改 ConfigMap 数据 
[root@k8s-master config]# vi configmap.yaml
    username:AAA
    password:BBB

#更新 ConfigMap 读取 configmap.yaml 文件中的数据,
#并使用 kubectl replace 将其更新到 configmap ConfigMap 中
[root@k8s-master config]# kubectl create cm configmap    -n dev --from-file=configmap.yaml --dry-run=client -o yaml | kubectl replace -f-
configmap/configmap replaced


[root@k8s-master config]# kubectl get pod pod-configmap -n dev
NAME            READY   STATUS    RESTARTS   AGE
pod-configmap   1/1     Running   0          15s

# 验证更新是否传递到 Pod
[root@k8s-master config]#  kubectl exec -it pod-configmap -n dev -- /bin/sh
# cd  /configmap/config/
# ls
configmap.yaml
# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: dev
data:
  info: |
    username:AAA
    password:BBB


确保挂载路径与 ConfigMap 中定义的路径一致,然后查看文件内容是否更新为新的用户名和密码。
这样,就成功地使用 kubectl 命令更新了 ConfigMap 并确保更新成功地传递到相关的 Pod 中

1.5不可变的 Secret 和 ConfigMap

**对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改.**这个配置项会锁定 ConfigMap,使其变得只读,防止运维人员或其他用户无意中修改关键配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# winfroms使用socket客户端服务端代码详解

文章目录 1️⃣ 通信相关说明1.1服务端与客户端1.2 信息发送原理1.3 信息接收原理 2️⃣ socket代码2.1 客户端代码2.2 服务端代码 3️⃣ 定时任务处理报文3.1 Timers定时任务 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4315141…

【LeetCode刷题笔记】242.有效的字母异位词

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

linux之权限管理

文章目录 一、使用情况1.1 场景&#xff1a;1.2 外包1.3 外包的情况 二、基础权限chmod三、ACL3.1 ACL是什么3.2 思考3.3 具体操作3.4 解决一起授权 一、使用情况 1.1 场景&#xff1a; 某个大公司&#xff0c;在一个部门&#xff0c;有一个经理和手下有两个员工&#xff0c;…

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、图书…

HarmonyOS学习--三方库

文章目录 一、三方库获取二、常用的三方库1. UI库&#xff1a;2. 网络库&#xff1a;3. 动画库&#xff1a; 三、使用开源三方库1. 安装与卸载2. 使用 四、问题解决1. zsh: command not found: ohpm 一、三方库获取 在Gitee网站中获取 搜索OpenHarmony-TPC仓库&#xff0c;在t…

爬取m3u8视频

网址&#xff1a;https://www.bhlsm.com/cupfoxplay/609-3-1/ 相关代码&#xff1a; #采集网址&#xff1a;https://www.bhlsm.com/cupfoxplay/609-3-1/ #正常视频网站&#xff1a;完整视频内容 # pip install pycryptodomex #流媒体文件&#xff1a;M3U8&#xff08;把完整的…

C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…

【电子书】云计算_大数据

资料 wx&#xff1a;1945423050&#xff0c;备注来源和目的 个人整理了一些互联网电子书 云计算_大数据 34招精通商业智能数据分析&#xff1a;Power BI和Tableau进阶实战.epubCloudera Hadoop大数据平台实战指南.epubDocker实战.epubDocker技术入门与实战 第2版.epubDocker技…

spark基础

文章目录 spark框架概述什么是spark起源spark VS hadoop(mapreduce)spark特点spark框架模块spark运行模式spark架构角色yarn角色saprk角色 小结&#xff1a;解决问题模块特点运行模式运行角色 spark环境搭建-local实验服务器环境基本原理本质角色分布搭建安装anaconda安装spark…

Redis 事务机制之ACID属性

事务属性 事务是对数据库进行读写的一系列操作。在事务执行时提供ACID属性保证&#xff1a; 包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;…

改进yolov5实现目标检测与语意分割项目

简介 基于ultralytics/yolov5多任务模型。同时实现yolo目标检测与语意分割以增加少量计算和显存为代价&#xff0c;同时完成目标检测和语义分割(1024512输入约增加350MB&#xff0c;同尺寸增加一个bisenet需要约1.3GB&#xff0c;两个单任务模型独立输入还有额外的延时)。模型…

【elementUi-table表格】 滚动条 新增监听事件; 滚动条滑动到指定位置;

1、给滚动条增加监听 this.dom this.$refs.tableRef.bodyWrapperthis.dom.scrollTop 0let _that thisthis.dom.addEventListener(scroll, () > {//获取元素的滚动距离let scrollTop _that.dom.scrollTop//获取元素可视区域的高度let clientHeight this.dom.clientHeigh…

Sass预处理器教程

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、sass是什么 Sass官方文档 www.sasscss.com/guide Sass中文网 www.sass.hk sass是一种css预处理语言&#xff0c;由Ruby语言开发&#x…

【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)

文章目录 七、回溯算法八、贪心算法九、动态规划9.1 背包问题9.2 01背包9.3 完全背包9.4 多重背包 十、图论10.1 深度优先搜索10.2 广度优先搜索10.3 并查集 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础…

4.8 Verilog过程连续赋值

关键词&#xff1a;解除分配&#xff0c;强制&#xff0c;释放 过程连续赋值是过程赋值的一种。赋值语句能够替换其他所有wire 或 reg 的赋值&#xff0c;改写wire 或 reg 类型变量的当前值。 与过程赋值不同的是&#xff0c;过程连续赋值表达式能被连续的驱动到wire 或 reg …

苹果发布iPhone 16:革命性创新重新定义智能手机体验

&#xff08;苹果总部&#xff0c;加利福尼亚州&#xff0c;2024年2月23日&#xff09;——今天&#xff0c;全球领先的科技公司苹果公司再次震撼世界&#xff0c;宣布推出iPhone 16&#xff0c;这款革命性的智能手机重新定义了人们对于手机的期望和体验。 iPhone 16的发布代表…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…

DM数据库学习之路(十八)DMHS数据实时同步软件部署及迁移测试

​​​​​ DMDRS介绍 产品介绍 达梦数据实时同步软件&#xff08;以下简称 DMDRS&#xff09;是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术&#xff0c;不依赖主机上源数据库的触发器或者规则&#xff0c;对主…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…

【前端素材】推荐优质后台管理系统Modernize平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和控制网站、应用程序或系统后台操作的软件工具&#xff0c;通常由授权用户&#xff08;如管理员、编辑人员等&#xff09;使用。它提供了一种用户友好的方式来管理网站或应用程序的内容、用户、数据等方面的操作&#xff0c;并且通常…