k8s 使用 helm 文件部署 8.12.2 es 分角色集群

文章目录

    • @[toc]
  • 环境介绍
  • 添加 helm 仓库
  • 下载 elasticsearch chart 包
  • 配置 secret 文件
    • tls 证书
    • 用户名和密码
  • 部署 master 节点
  • 部署 ingest 节点
  • 部署 data 数据节点
    • 创建 pv 和 pvc
  • 节点验证
  • 部署 kibana
    • 配置 secret 文件
      • 用户名和密码
      • 随机密钥
    • 创建 kibana_login 用户
    • 下载 kibana chart 包
    • 部署 kibana

只开启了用户密码的认证,并没有开启 https

环境介绍

节点

添加 helm 仓库

helm repo add elastic https://helm.elastic.co

下载 elasticsearch chart 包

helm pull elastic/elasticsearch --version 8.5.1

配置 secret 文件

  • 因为官方自动创建的证书有效期都很短,我们要自己创建一个

用 es 镜像创建一个 docker 容器

docker run -it --rm --name es-cert-create docker.elastic.co/elasticsearch/elasticsearch:8.12.2 bash

tls 证书

  • 生成 ca 证书,指定证书有效期
    • Please enter the desired output file [elastic-stack-ca.p12] 要求写 ca 证书的文件名字,可以回车,默认名字是 elastic-stack-ca.p12
    • Enter password for elastic-stack-ca.p12 : 给 ca 证书设置密码,根据实际场景选择
elasticsearch-certutil ca --days 36500
  • 生成 cert 证书文件
    • 上面有配置 ca 证书输出文件名称的,把 elastic-stack-ca.p12 改成自己对应的名字
    • Enter password for CA (elastic-stack-ca.p12) : 输入创建 ca 证书时候的密码,没设置直接回车
    • Please enter the desired output file [elastic-certificates.p12]: 设置 cert 证书文件的名字,默认是 elastic-certificates.p12
    • Enter password for elastic-certificates.p12 : cert 证书设置密码,根据实际场景选择
elasticsearch-certutil cert --ca elastic-stack-ca.p12 --days 36500

验证证书到期时间

# p12 证书转换成 pem 证书,期间输入一次密码
openssl pkcs12 -in elastic-certificates.p12 -out cert.pem -nodes
# 查看证书到期时间
openssl x509 -in cert.pem -noout -enddate

从容器内复制出来

docker cp es-cert-create:/usr/share/elasticsearch/elastic-certificates.p12 ./elastic-certificates.p12

生成 secret,后期可以导出成 yaml,去其他环境直接使用

kubectl create secret -n es-logs generic elastic-certificates --from-file=elastic-certificates.p12

用户名和密码

  • elastic 是用户名
  • Passw0rd@123 是对应的密码
  • 写入 secret 是需要 base64 加密的
  • 一定要使用 echo -n,避免换行导致 readiness 脚本失败
cat <<EOF > elastic-credentials-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: elastic-credentials
  namespace: es-logs
  labels:
    app: "elasticsearch"
type: Opaque
data:
  username: $(echo -n 'elastic' | base64)
  password: $(echo -n 'Passw0rd@123' | base64)
EOF

应用到 k8s 集群

kubectl apply -f elastic-credentials-secret.yaml

解压包

tar xf elasticsearch-8.5.1.tgz

备份 values.yaml 文件

mv elasticsearch/values.yaml{,.tmp}

完整 value 文件比较长,以下配置文件,仅提供需要修改的内容

部署 master 节点

cd elasticsearch
# 复制一份 master-values.yaml
cp values.yaml.tmp master-values.yaml

修改 master-values.yaml 文件

# es 集群的名称
clusterName: "es-cluster"
# es 节点的角色
roles:
  - master
minimumMasterNodes: 1
esConfig:
  elasticsearch.yml: |
    cluster.initial_master_nodes: ["es-cluster"]
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
# 自己创建了证书,这里不需要自动创建
createCert: false
# 创建的用户密码要赋值,注意 secret 名字别错了,这个影响 readiness 探针
extraEnvs:
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username
# 用户密码为了不在 value 文件里面明文展示,前期手动创建了 secret
secret:
  enabled: false
# 配置 ssl secret 的 volume 挂载
secretMounts:
  - name: elastic-certificates
    secretName: elastic-certificates
    path: /usr/share/elasticsearch/config/certs
    defaultMode: 0755
# 部署的镜像 tag
imageTag: "8.12.2"
# 配置 es 的 jvm
esJavaOpts: "-Xmx1g -Xms1g"
# 配置 pod 资源限制
## limits.memory 配置成上面 jvm 的值乘以 1.25 或者 1.5,这些需要根据实际的资源来配置
## requests.cpu 和 requests.memory 也要根据实际集群资源来配置,超出了集群现有的 request 会导致 pod 无法被调度
resources:
  requests:
    cpu: "1000m"
    memory: "1Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"
# master 节点不需要数据持久化
persistence:
  enabled: false
# 节点亲和性,如果需要 es 启动到固定的几个节点,需要配置一下
nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - 192.168.11.192
        - 192.168.11.194
        - 192.168.11.195
# 没有开启 https 的配置,这个参数会影响 readiness 探针
protocol: http
# 是否启动测试 pod 测试集群状态,默认是开启,可以自定义
tests:
  enabled: false

部署 master 节点

helm install es-master ./ -f master-values.yaml -n es-logs

返回下面这些信息,说明 es 正在启动

NAME: es-master
LAST DEPLOYED: Tue Jul  2 23:25:28 2024
NAMESPACE: es-logs
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=es-logs -l app=es-cluster-master -w
2. Retrieve elastic user's password.
  $ kubectl get secrets --namespace=es-logs es-cluster-master-credentials -ojsonpath='{.data.password}' | base64 -d

部署 ingest 节点

# 复制一份 ingest-values.yaml
cp values.yaml.tmp ingest-values.yaml

修改 ingest-values.yaml 文件

clusterName: "es-cluster"
nodeGroup: "ingest"
roles:
  - ingest
  - remote_cluster_client
esConfig:
  elasticsearch.yml: |
    cluster.initial_master_nodes: ["es-cluster"]
    discovery.seed_hosts: ["es-cluster-master-headless"]
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
 # 自己创建了证书,这里不需要自动创建
createCert: false
# 创建的用户密码要赋值,注意 secret 名字别错了,这个影响 readiness 探针
extraEnvs:
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username
# 用户密码为了不在 value 文件里面明文展示,前期手动创建了 secret
secret:
  enabled: false
# 配置 ssl secret 的 volume 挂载
secretMounts:
  - name: elastic-certificates
    secretName: elastic-certificates
    path: /usr/share/elasticsearch/config/certs
    defaultMode: 0755
# 部署的镜像 tag
imageTag: "8.12.2"
# 配置 es 的 jvm
esJavaOpts: "-Xmx1g -Xms1g"
# 配置 pod 资源限制
## limits.memory 配置成上面 jvm 的值乘以 1.25 或者 1.5,这些需要根据实际的资源来配置
## requests.cpu 和 requests.memory 也要根据实际集群资源来配置,超出了集群现有的 request 会导致 pod 无法被调度
resources:
  requests:
    cpu: "1000m"
    memory: "1Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"
# ingest 节点不需要数据持久化
persistence:
  enabled: false
# 节点亲和性,如果需要 es 启动到固定的几个节点,需要配置一下
nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - 192.168.11.192
        - 192.168.11.194
        - 192.168.11.195
# 没有开启 https 的配置,这个参数会影响 readiness 探针
protocol: http
# 是否启动测试 pod 测试集群状态,默认是开启,可以自定义
tests:
  enabled: false

部署 ingest 节点

helm install es-ingest ./ -f ingest-values.yaml -n es-logs

部署 data 数据节点

# 复制一份 data-values.yaml
cp values.yaml.tmp data-values.yaml

修改 data-values.yaml 文件

clusterName: "es-cluster"
nodeGroup: "data"
roles:
  - data
  - data_content
  - data_hot
  - data_warm
  - data_cold
  - ingest
  - ml
  - remote_cluster_client
  - transform
esConfig:
  elasticsearch.yml: |
    cluster.initial_master_nodes: ["es-cluster-master"]
    discovery.seed_hosts: ["es-cluster-master-headless"]
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
# 自己创建了证书,这里不需要自动创建
createCert: false
# 创建的用户密码要赋值,注意 secret 名字别错了,这个影响 readiness 探针
extraEnvs:
  - name: ELASTIC_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: password
  - name: ELASTIC_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials
        key: username
# 用户密码为了不在 value 文件里面明文展示,前期手动创建了 secret
secret:
  enabled: false
# 配置 ssl secret 的 volume 挂载
secretMounts:
  - name: elastic-certificates
    secretName: elastic-certificates
    path: /usr/share/elasticsearch/config/certs
    defaultMode: 0755
# 部署的镜像 tag
imageTag: "8.12.2"
# 配置 es 的 jvm
esJavaOpts: "-Xmx1g -Xms1g"
# 配置 pod 资源限制
## limits.memory 配置成上面 jvm 的值乘以 1.25 或者 1.5,这些需要根据实际的资源来配置
## requests.cpu 和 requests.memory 也要根据实际集群资源来配置,超出了集群现有的 request 会导致 pod 无法被调度
resources:
  requests:
    cpu: "1000m"
    memory: "1Gi"
  limits:
    cpu: "1000m"
    memory: "2Gi"
# 节点亲和性,如果需要 es 启动到固定的几个节点,需要配置一下
nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - 192.168.11.198
        - 192.168.11.194
        - 192.168.11.195
# 没有开启 https 的配置,这个参数会影响 readiness 探针
protocol: http
# 是否启动测试 pod 测试集群状态,默认是开启,可以自定义
tests:
  enabled: false

创建 pv 和 pvc

本地创建目录,那个 es 固定在哪个节点,就去哪个节点创建对应的目录

mkdir -p /elastic/es-cluster-data-0
mkdir -p /elastic/es-cluster-data-1
mkdir -p /elastic/es-cluster-data-2
chmod -R 777 /elastic/es-cluster-data-0
chmod -R 777 /elastic/es-cluster-data-1
chmod -R 777 /elastic/es-cluster-data-2
  • 我这边直接使用 localpath 的 pv 做的持久化
  • pvc 的名字是 clusterName-nodeGroup-clusterName-nodeGroup-sts副本序号,按照我的配置文件,三副本,pvc 的名字就是 es-cluster-data-es-cluster-data-0es-cluster-data-es-cluster-data-1es-cluster-data-es-cluster-data-2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: es-cluster-data-es-cluster-data-0
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 30Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: es-cluster-data-es-cluster-data-0
    namespace: es-logs
  hostPath:
    path: /elastic/es-cluster-data-0
    type: "DirectoryOrCreate"
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - 192.168.11.198
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-cluster-data-es-cluster-data-0
  namespace: es-logs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  volumeName: es-cluster-data-es-cluster-data-0
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: es-cluster-data-es-cluster-data-1
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 30Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: es-cluster-data-es-cluster-data-1
    namespace: es-logs
  hostPath:
    path: /elastic/es-cluster-data-1
    type: "DirectoryOrCreate"
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - 192.168.11.194
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-cluster-data-es-cluster-data-1
  namespace: es-logs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  volumeName: es-cluster-data-es-cluster-data-1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: es-cluster-data-es-cluster-data-2
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 30Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: es-cluster-data-es-cluster-data-2
    namespace: es-logs
  hostPath:
    path: /elastic/es-cluster-data-2
    type: "DirectoryOrCreate"
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - 192.168.11.195
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-cluster-data-es-cluster-data-2
  namespace: es-logs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  volumeName: es-cluster-data-es-cluster-data-2

生成 pv 和 pvc

k apply -f pv-pvc.yaml

查看 pvc 是不是显示 Bound

k get pvc -n es-logs

部署 data

helm install es-data ./ -f data-values.yaml -n es-logs

节点验证

k exec -it -n es-logs es-cluster-master-0 -- curl -s -u "elastic:Passw0rd@123" "localhost:9200/_cat/nodes?v"

这里是 3 个 master,3 个 ingest 和 3 个 data

ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.22.27.22            43          87   1    0.37    0.84     0.55 cdhilrstw -      es-cluster-data-1
172.22.11.101           37          87   1    0.07    0.43     0.29 ir        -      es-cluster-ingest-0
172.22.84.48            36          86   1    2.26    1.61     0.85 ir        -      es-cluster-ingest-1
172.22.92.6             39          87   1    0.04    0.11     0.12 cdhilrstw -      es-cluster-data-0
172.22.84.49            38          86   1    2.26    1.61     0.85 cdhilrstw -      es-cluster-data-2
172.22.27.20            20          43   1    0.37    0.84     0.55 m         -      es-cluster-master-2
172.22.11.100           53          45   2    0.07    0.43     0.29 m         *      es-cluster-master-0
172.22.84.47            69          43   1    2.26    1.61     0.85 m         -      es-cluster-master-1
172.22.27.21            44          87   1    0.37    0.84     0.55 ir        -      es-cluster-ingest-2

部署 kibana

配置 secret 文件

用户名和密码

上面的方法部署的 es,默认生成的 kibana_system 会没有权限访问,8.12 版本的 kibana 不允许使用 superuser 角色来访问 es 集群,这里要重新创建一个用户,所以先创建一个 secret 文件

  • kibana_login 是用户名
  • Passw0rd@123 是对应的密码
  • 写入 secret 是需要 base64 加密的
  • 一定要使用 echo -n,避免换行导致 readiness 脚本失败
cat <<EOF > elastic-credentials-kibana-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: elastic-credentials-kibana
  namespace: es-logs
  labels:
    app: "kibana"
type: Opaque
data:
  username: $(echo -n 'kibana_login' | base64)
  password: $(echo -n 'Passw0rd@123' | base64)
EOF

随机密钥

cat <<EOF > elastic-encryptionkey-kibana-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: elastic-encryptionkey-kibana
  namespace: es-logs
  labels:
    app: "kibana"
type: Opaque
data:
  reporting: $(cat /dev/urandom | tr -dc '_A-Za-z0-9' | head -c 50 | base64)
  security: $(cat /dev/urandom | tr -dc '_A-Za-z0-9' | head -c 50 | base64)
  encryptedsavedobjects: $(cat /dev/urandom | tr -dc '_A-Za-z0-9' | head -c 50 | base64)
EOF

应用到 k8s 集群

k apply -f elastic-credentials-kibana-secret.yaml
k apply -f elastic-encryptionkey-kibana-secret.yaml

创建 kibana_login 用户

k exec -it -n es-logs es-cluster-master-0 -- curl -s -XPOST -u "elastic:Passw0rd@123" "localhost:9200/_security/user/kibana_login" -H 'Content-Type: application/json' -d '
{
  "password" : "Passw0rd@123",
  "roles" : [ "kibana_system","superuser" ],
  "full_name" : "kibana_login",
  "email" : "kibana_login@mail.com",
  "metadata" : {
    "intelligence" : 7
  }
}'

返回 {"created":true} 说明用户创建成功了,用这个用户访问一下,能返回节点信息,说明这个用户可以被 kibana 使用

k exec -it -n es-logs es-cluster-master-0 -- curl -s -XGET -u "kibana_login:Passw0rd@123" "localhost:9200/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip"

下载 kibana chart 包

helm pull elastic/kibana --version 8.5.1

解压 chart 包

tar xf kibana-8.5.1.tgz

部署 kibana

备份 values.yaml

cd kibana
cp values.yaml{,.tmp}

修改 values.yaml

# 让 kibana 连接 ingest
elasticsearchHosts: "http://es-cluster-ingest-headless:9200"
elasticsearchCertificateSecret: elastic-certificates
elasticsearchCertificateAuthoritiesFile: elastic-certificates.p12
# 改成上面创建的 kibana_login 用户这个 secret 名字
elasticsearchCredentialSecret: elastic-credentials-kibana
# 增加一个变量,kibana 中文界面
extraEnvs:
  - name: I18N_LOCALE
    value: zh-CN
  - name: ELASTICSEARCH_PASSWORD
    valueFrom:
      secretKeyRef:
        name: elastic-credentials-kibana
        key: password
  - name: ELASTICSEARCH_USERNAME
    valueFrom:
      secretKeyRef:
        name: elastic-credentials-kibana
        key: username
  - name: KIBANA_REPORTING_KEY
    valueFrom:
      secretKeyRef:
        name: elastic-encryptionkey-kibana
        key: reporting
  - name: KIBANA_SECURITY_KEY
    valueFrom:
      secretKeyRef:
        name: elastic-encryptionkey-kibana
        key: security
  - name: KIBANA_ENCRYPTEDSAVEDOBJECTS_KEY
    valueFrom:
      secretKeyRef:
        name: elastic-encryptionkey-kibana
        key: encryptedsavedobjects
# 修改 tag
imageTag: "8.12.2"
kibanaConfig:
  kibana.yml: |
    elasticsearch.requestTimeout: 300000
    xpack.encryptedSavedObjects.encryptionKey: ${KIBANA_ENCRYPTEDSAVEDOBJECTS_KEY}
    xpack.reporting.encryptionKey: ${KIBANA_REPORTING_KEY}
    xpack.security.encryptionKey: ${KIBANA_SECURITY_KEY}
    server.maxPayload: 10485760
    elasticsearch.username: ${ELASTICSEARCH_USERNAME}
    elasticsearch.password: ${ELASTICSEARCH_PASSWORD}
# 开个 nodeport
service:
  type: NodePort
  # 可以自定义,也可以不写,让 k8s 自己随机一个
  nodePort: "31560"

修改 templates/deployment.yaml

      ## volumes 下面的
        - name: elasticsearch-certs
          secret:
            secretName: {{ .Values.elasticsearchCertificateSecret }}
        ## env 下面的
          - name: ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES
            value: "{{ template "kibana.home_dir" . }}/config/certs/{{ .Values.elasticsearchCertificateAuthoritiesFile }}"
          - name: ELASTICSEARCH_SERVICEACCOUNTTOKEN
            valueFrom:
              secretKeyRef:
                name: {{ template "kibana.fullname" . }}-es-token
                key: token
                optional: false
        ## volumeMounts 下面的
          - name: elasticsearch-certs
            mountPath: {{ template "kibana.home_dir" . }}/config/certs
            readOnly: true

部署 kibana

helm install kibana ./ -f values.yaml -n es-logs --no-hooks

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

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

相关文章

结合数据索引结构看SQL的真实执行过程

引言 关于数据库设计与优化的前几篇文章中&#xff0c;我们提到了数据库设计优化应该遵守的指导原则、数据库底层的索引组织结构、数据库的核心功能组件以及SQL的解析、编译等。这些其实都是在为SQL的优化、执行的理解打基础。 今天这篇文章&#xff0c;我们以MySQL中InnoDB存…

软件测评机构:关于软件验收测试作用与实施步骤全解析

软件验收测试是指在软件项目交付给用户之前进行的一系列测试活动&#xff0c;其主要目的是验证软件是否符合用户需求和设计规范&#xff0c;以确保软件的质量和稳定性。 软件验收测试在软件开发生命周期的最后阶段进行&#xff0c;起到了至关重要的作用。它能够帮助客户确认软…

AI PC(智能电脑)技术分析

一文看懂AI PC&#xff08;智能电脑&#xff09; 2024年&#xff0c;英特尔、英伟达等芯片巨头革新CPU技术&#xff0c;融入AI算力&#xff0c;为传统PC带来质的飞跃&#xff0c;引领智能计算新时代。 2024年&#xff0c;因此被叫作人工智能电脑&#xff08;AI PC&#xff09;…

【elementui】记录解决el-tree开启show-checkbox后,勾选一个叶结点后会自动折叠的现象

第一种解决方案&#xff1a;设置default-expand-keys的值为当前选中的key值即可 <el-treeref"tree"class"checkboxSelect-wrap":data"treeData"show-checkboxnode-key"id":expand-on-click-node"true":props"defau…

MATLAB——循环语句

一、for end语句 在该语法中&#xff0c;循环变量是用于迭代的变量名&#xff0c;它会在每次循环迭代中从向量或矩阵中取出一列的值。数值向量或者矩阵则表示了循环变量可以取值的范围&#xff0c;通常根据实际需要事先给定。一旦循环变量遍历完数值向量或者矩阵中的所有值&…

初试成绩占比百分之70!计算机专硕均分340+!华中师范大学计算机考研考情分析!

华中师范大学&#xff08;Central China Normal University&#xff09;简称“华中师大”或“华大”&#xff0c;位于湖北省会武汉&#xff0c;是中华人民共和国教育部直属重点综合性师范大学&#xff0c;国家“211工程”、“985工程优势学科创新平台”重点建设院校&#xff0c…

苹果公司的Wifi定位服务(WPS)存在被滥用的风险

安全博客 Krebs on Security 2024年5月21日发布博文&#xff0c;表示苹果公司的定位服务存在被滥用风险&#xff0c;通过 "窃取"WPS 数据库&#xff0c;可以定位部队行踪。 相关背景知识 手机定位固然主要依赖卫星定位&#xff0c;不过在城市地区&#xff0c;密集的…

YOLOv10全网最新创新点改进系列:融合GSConv+Slim Neck,双改进、双增强,替换特征融合层实现, 轻量化涨点改进策略,有效涨点神器!

YOLOv10全网最新创新点改进系列&#xff1a;融合GSConvSlim Neck&#xff0c;双改进、双增强&#xff0c;替换特征融合层实现&#xff0c; 轻量化涨点改进策略&#xff0c;有效涨点神器&#xff01; 所有改进代码均经过实验测试跑通&#xff01;截止发稿时YOLOv10已改进40&…

vue中的坑·

常规 1.使用watch时&#xff0c;immediate true会在dom挂载前执行 2.使用this.$attrs和props 可以获取上层非原生属性&#xff08;class/id&#xff09; 多层次嵌套引用 设置的时候直接赋值&#xff0c;修改的时候即使用的双向绑定加上$set / nextick / fouceUpdate都不会同步…

MySQL表的练习

二、创建表 1、创建一个名称为db_system的数据库 create database db_system; 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user 字段 类型 约束 备注 id 整形 主键&#xff0c;自增长 id N…

探索设计的未来:了解设计师对生成式人工智能(AIGC)工具的采用

在数字化浪潮的推动下&#xff0c;设计行业正经历着一场革命性的变革。随着生成式人工智能&#xff08;AIGC&#xff09;技术的发展&#xff0c;设计师们迎来了前所未有的机遇与挑战。这些工具不仅重塑了传统的设计流程&#xff0c;还为设计师们提供了更广阔的创意空间和更高效…

vue模板语法v-html

模板语法v-html vue使用一种基于HTML的模板语法&#xff0c;使我们能够声明式的将其组件实例的数据绑定到呈现的DOM上&#xff0c;所有的vue模板都是语法层面的HTML&#xff0c;可以被符合规范的浏览器和HTML解释器解析。 一.文本插值 最基本的数据绑定形式是文本插值&#…

理解神经网络的通道数

理解神经网络的通道数 1. 神经网络的通道数2. 输出的宽度和长度3. 理解神经网络的通道数3.1 都是错误的图片惹的祸3.1.1 没错但是看不懂的图3.1.2 开玩笑的错图3.1.3 给人误解的图 3.2 我或许理解对的通道数3.2.1 动图演示 1. 神经网络的通道数 半路出嫁到算法岗&#xff0c;额…

【算法训练记录——Day41】

Day41——动态规划Ⅲ 1.理论基础——代码随想录2.纯01背包_[kamacoder46](https://kamacoder.com/problempage.php?pid1046)3.leetcode_416分割等和子集 背包&#xff01;&#xff01; 1.理论基础——代码随想录 主要掌握01背包和完全背包 物品数量&#xff1a; 只有一个 ——…

顶级5款有用的免费IntelliJ插件,提升你作为Java开发者的旅程

在本文中&#xff0c;我们将深入探讨IntelliJ IDEA插件——那些可以提升你生产力的神奇附加组件&#xff0c;并微调你的代码以达到卓越。我们将探索5款免费插件&#xff0c;旨在将你的开发水平提升到一个新的高度。 1. Test Data 使用Test Data插件进行上下文操作 作为开发者&a…

昇思学习打卡-5-基于Mindspore实现BERT对话情绪识别

本章节学习一个基本实践–基于Mindspore实现BERT对话情绪识别 自然语言处理任务的应用很广泛&#xff0c;如预训练语言模型例如问答、自然语言推理、命名实体识别与文本分类、搜索引擎优化、机器翻译、语音识别与合成、情感分析、聊天机器人与虚拟助手、文本摘要与生成、信息抽…

基于用户的协同过滤算法

目录 原理&#xff1a; 计算相似度&#xff1a; 步骤&#xff1a; 计算方法&#xff1a;Jaccard相似系数、余弦相似度。 推荐 原理&#xff1a; 先“找到相似用户”&#xff0c;再“找到他们喜欢的物品”--->人以群分。即&#xff0c;给用户推荐“和他兴趣相似的其他用…

运维管理一体化:构建多维一体化的运维体系

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay 摘要&#xff1a;笔者根据自身的技术和行业理解&#xff0c;解析运维一体化的内涵和实践。 涉及关键词&#xff1a;一体化运维、平台化运维、数智化运维、运维PaaS、运维工具系统、蓝鲸等。 本文作者&#xff1a;嘉为蓝鲸运维…

微信小程序 typescript 开发日历界面

1.界面代码 <view class"o-calendar"><view class"o-calendar-container" ><view class"o-calendar-titlebar"><view class"o-left_arrow" bind:tap"prevMonth">《</view>{{year}}年{{month…