k8s控制器(五)_____DaemonSet

DaemonSet控制器

DaemonSet控制器是Kubernetes中的一种控制器,用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务:

  • 在每一个node节点运行一个存储服务,例如gluster,ceph。
  • 在每一个node节点运行一个日志收集服务,例如fluentd,logstash。
  • 在每一个node节点运行一个监控服务,例如Prometheus Node Exporter,zabbix agent等。

DaemonSet控制器的工作方式是,它会监视集群中的节点,并确保在每个节点上都有一个Pod实例在运行。如果节点增加或减少,DaemonSet 控制器会相应地调整 Pod 的副本数量,以确保每个节点都有一个Pod在运行。

DaemonSet日志收集EFK

使用StatefulSet部署elasticsearch三节点集群,使用headless service集群通信,部署动态存储为elasticsearch提供存储服务。
在这里插入图片描述

部署StorageClass

请参考https://blog.csdn.net/qq42004/article/details/137113713?spm=1001.2014.3001.5502

部署elasticsearch

官方网站https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html

  • 部署Service

    部署一个NodePort的类型的Service方便后面查询集群信息。

apiVersion: v1
kind: Namespace
metadata:
  name: efk
  labels:
    app: efk
---
apiVersion: v1
kind: Service
metadata:
  name: efk
  labels:
    app: efk
  namespace: efk
spec:
  clusterIP: None
  selector:
    app: efk
  ports:
  - name: efk-port-http
    port: 9200
  - name: efk-port-inside
    port: 9300
---
apiVersion: v1
kind: Service
metadata:
  name: efk-http
  labels:
    app: efk-http
  namespace: efk
spec:
  selector:
    app: efk
  ports:
  - name: efk-port-http
    port: 9200
    protocol: TCP
    targetPort: 9200
    nodePort: 32005
  type: NodePort


elasticsearch的9200端口用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控、以及其他任何使用HTTP协议的请求,所有的客户端库都会使用该端口与elasticsearch进行交互。9300端口是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。

  • 部署elasticsearch
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: efk
  labels:
    app: efk
  namespace: efk
spec:
  replicas: 3
  serviceName: efk 
  selector:
    matchLabels:
      app: efk
  template:
    metadata:
      name: efk-con
      labels:
        app: efk
    spec:
      hostname: efk 
      initContainers:
      - name: chmod-data
        image: docker.io/library/busybox:latest
        imagePullPolicy: IfNotPresent
        command:
        - sh
        - "-c"
        - |
           chown -R 1000:1000 /usr/share/elasticsearch/data
        securityContext:
           privileged: true
        volumeMounts:
        - name: data 
          mountPath: /usr/share/elasticsearch/data
      - name: vm-max-count
        image: docker.io/library/busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["sysctl","-w","vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: ulimit
        image: docker.io/library/busybox:latest
        imagePullPolicy: IfNotPresent
        command: 
           [
              "sh",
              "-c",
              "ulimit -Hl unlimited && ulimit -Sl unlimited && ulimit -n 65536 && id",
            ]
    
        securityContext:
          privileged: true
      containers:
      - name: efk
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.19
        imagePullPolicy: IfNotPresent
        resources:
          limits: 
            cpu: "1"
            #memory: "512Mi"
          requests:
            cpu: "0.5"  
            #memory: "256Mi"   
        env: 
        - name: cluster.name
          value: efk-log
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name   
        - name: discovery.seed_hosts
          value: "efk-0.efk,efk-1.efk,efk-2.elk"
        - name: cluster.initial_master_nodes
          value: "efk-0,efk-1,efk-2"
        - name: bootstrap.memory_lock
          value: "false"
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        ports:
        - containerPort: 9200
          name: port-http
          protocol: TCP
        - containerPort: 9300
          name: port-inside
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        - name: time
          mountPath: /etc/localtime
      volumes:
      - name: time
        hostPath: 
          path: /etc/localtime
          type: File 
    

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      storageClassName: "nfs-stgc-delete"
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi




在initContainers中修改部分系统参数(部署的时候可以用Docker跑一下部署版本elasticsearch看需要修改那些参数)

 securityContext:
      privileged: true

开启容器的特权模式。

 env: 
    - name: cluster.name
      value: elk-log
    - name: node.name
      valueFrom:
        fieldRef:
          fieldPath: metadata.name   
    - name: discovery.seed_hosts
      value: "efk-0.efk,efk-1.efk,efk-2.elk"
    - name: cluster.initial_master_nodes
      value: "efk-0,efk-1,efk-2"
    - name: bootstrap.memory_lock
      value: "false"
    - name: ES_JAVA_OPTS
      value: "-Xms512m -Xmx512m"
  1. node.name:处理elasticsearch中一个未引入元数据的报错。
  2. discovery.seed_hosts:配置节点发现。
  3. cluster.initial_master_nodes:当第一次启动一个全新的elasticsearch集群时,会有一个集群引导步骤,该步骤确定在 第一次选举中计算其选票的主合格节点集。在开发模式下,在未配置发现设置的情况下,此步骤由节点自身自动执行。由于这种自动引导本质上是不安全的,当您在生产模式下启动一个全新的集群时,您必须明确列出在第一次选举中应该计算其投票的主合格节点。此列表是使用cluster.initial_master_nodes设置设置的。在重新启动群集或向现有群集添加新节点时,不应使用此设置。
  4. ES_JAVA_OPTS:允许传递一些JVM(java虚拟机)的参数给elasticsearch进程。-Xms512m -Xmx512m指定了进行初始堆内存和最大内存大小为512M。
  5. bootstrap.memory_lock:锁定内存,禁用内存交换。k8s本身禁用了交换分区,此处设置为false(默认也是false)。

查看集群信息:

  • 查看节点状态:http://192.168.0.100:32005/_cat/nodes?v&pretty
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
10.244.1.245           28          79   4    3.63    2.97     1.78 cdfhilmrstw -      efk-2
10.244.1.244           30          79   3    3.63    2.97     1.78 cdfhilmrstw -      efk-0
10.244.2.235           51          67   5    0.70    0.73     0.67 cdfhilmrstw *      efk-1
  • 查看集群健康信息:http://192.168.0.100:32005/_cluster/health?pretty 状态信息为:green
{
  "cluster_name" : "efk-log",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 3,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
  • 查看集群的状态信息:http://192.168.0.100:32005/_cluster/state?pretty
{
  "cluster_name" : "efk-log",
  "cluster_uuid" : "STY6wpxzS0qHBy5XrjQRuw",
  "version" : 93,
  "state_uuid" : "bV0lB3d6TzOYIZc9WE92dg",
  "master_node" : "-KIR5smtTvCZE3RJSEPh1w",
  "blocks" : { },
  "nodes" : {
    "HEpcL5aSTdaEXdE_75319g" : {
      "name" : "efk-2",
      "ephemeral_id" : "ToczCgVFSCuloVO2gitEaA",
      "transport_address" : "10.244.1.245:9300",
      "attributes" : {
        "ml.machine_memory" : "3956289536",
        "ml.max_open_jobs" : "512",
        "xpack.installed" : "true",
        "ml.max_jvm_size" : "536870912",
        "transform.node" : "true"
      },
      "roles" : [
        "data",
        "data_cold",
        "data_content",
        "data_frozen",
        "data_hot",
        "data_warm",
        "ingest",
        "master",
        "ml",
        "remote_cluster_client",
        "transform"
      ]
    },
    "Qs7bNaTvS8CSdMmQuu9Jog" : {
      "name" : "efk-0",
      "ephemeral_id" : "Gdyw-MhAQhmeLl7k2Sm5HQ",
      "transport_address" : "10.244.1.244:9300",
      "attributes" : {
        "ml.machine_memory" : "3956289536",
        "ml.max_open_jobs" : "512",
        "xpack.installed" : "true",
        "ml.max_jvm_size" : "536870912",
        "transform.node" : "true"
      },
      "roles" : [
        "data",
        "data_cold",
        "data_content",
        "data_frozen",
        "data_hot",
        "data_warm",
        "ingest",
        "master",
        "ml",
        "remote_cluster_client",
        "transform"
      ]
    },
    "-KIR5smtTvCZE3RJSEPh1w" : {
      "name" : "efk-1",
      "ephemeral_id" : "J7o-nw8LQxaxw7O9kjvEIg",
      "transport_address" : "10.244.2.235:9300",
      "attributes" : {
        "ml.machine_memory" : "3956289536",
        "xpack.installed" : "true",
        "transform.node" : "true",
        "ml.max_open_jobs" : "512",
        "ml.max_jvm_size" : "536870912"
      },
      "roles" : [
        "data",
        "data_cold",
        "data_content",
        "data_frozen",
        "data_hot",
        "data_warm",
        "ingest",
        "master",
        "ml",
        "remote_cluster_client",
        "transform"
      ]
    }
  },
  .......

部署kibana

apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: efk
  labels:
    app: kibana
spec:
  selector:
    app: kibana
  ports:
  - name: port-kibana
    port: 5601
    appProtocol: TCP
    nodePort: 30006
    targetPort: 5601
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: kibana
  namespace: efk
  labels:
    app: kibana
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      name: kibana
      labels:
        app: kibana
    spec:
      nodeSelector:
        app: ng
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.17.19
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: "1"
          requests:
            cpu: "0.5"
        env:
          - name: ELASTICSEARCH_HOSTS
            value: http://efk:9200
        volumeMounts:
          - name: time
            mountPath: /etc/localtime
          - name: data-kibana
            mountPath: /etc/elk/kibana/data
            subPath: data
        ports:
        - name: kibana-port
          containerPort: 5601
      volumes:
      - name: time
        hostPath: 
          path: /etc/localtime
          type: File 
      - name: data-kibana
        hostPath:
          path: /mnt/kibana
env:
  - name: ELASTICSEARCH_HOSTS
    value: http://efk:9200

配置访问elasticsearch地址

DaemonSet部署fluentd

  • 创建配置文件
    k8s是基于Containerd部署的要读取的日志在/var/log/containers下,产生的cri日志需要进行解析不然会遇到格式错误的 JSON问题。简写一个配置文件:
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent
  labels:
    app: fluent
  namespace: efk
data:
  system.conf: |
    <source>
      @type tail
      format json
      path /var/log/containers/*.log
      parser cri
      tag kube.*
      read_from_head true
      <parse>
        @type cri 
        format regex
        #expression /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
        
      </parse>
    </source>
    <match kube.**>
      @type elasticsearch
      host efk.efk.svc.cluster.local
      port 9200
      logstash_format true
      logstash_prefix kube
      logstash_dateformat %Y.%m.%d
      include_tag_key true
      tag_key @log_name
    </match>

  • 部署fluentd

    fluentd官方文档:https://github.com/fluent/fluentd-kubernetes-daemonset/tree/master
    DaemonSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/

apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: efk
  labels:
    app: fluentd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentd
  labels:
    app: fluentd
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd
roleRef:
  kind: ClusterRole
  name: fluentd
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: fluentd
  namespace: efk
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: efk
  labels:
    app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      serviceAccount: fluentd
      serviceAccountName: fluentd
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        effect: "NoSchedule"
      initContainers:
      - name: init-fluentd
        image: docker.io/fluent/fluentd-kubernetes-daemonset:v1.16.5-debian-elasticsearch7-amd64-1.0
        imagePullPolicy: IfNotPresent
        command:
        - bash
        - "-c"
        - |
          cp /mnt/config-map/system.conf /mnt/conf.d
        volumeMounts:
        - name: conf
          mountPath: /mnt/conf.d
        - name: confg-map
          mountPath: /mnt/config-map
      containers:
      - name: fluentd
        image: docker.io/fluent/fluentd-kubernetes-daemonset:v1.16.5-debian-elasticsearch7-amd64-1.0
        imagePullPolicy: IfNotPresent
        env:
          - name: K8S_NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: FLUENT_ELASTICSEARCH_HOST
            value: "efk.efk.svc.cluster.local"
          - name: FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENTD_SYSTEMD_CONF
            value: disable
          - name: FLUENT_CONTAINER_TAIL_EXCLUDE_PATH
            value: /var/log/containers/fluent*
          - name: FLUENT_CONTAINER_TAIL_PARSER_TYPE
            value: /^(?<time>.+) (?<stream>stdout|stderr)( (?<logtag>.))? (?<log>.*)$/
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: containerslogs
          mountPath: /var/log/containers
          readOnly: true
        - name: conf 
          mountPath: /fluentd/etc/conf.d
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: containerslogs
        hostPath:
          path: /var/log/containers
      - name: conf
        emptyDir: {}
      - name: confg-map
        configMap:
          name: fluent
    

  • Deployments和Daemonset区别联系

DaemonSet与Deployments非常类似,它们都能创建Pod,这些Pod对应的进程都不希望被终止掉(例如,Web 服务器、存储服务器)。无状态的Service使用Deployments,比如前端Frontend服务,实现对副本的数量进行扩缩容、平滑升级,比基于精确控制Pod运行在某个主机上要重要得多。 需要Pod副本总是运行在全部或特定主机上,并需要先于其他Pod启动,当这被认为非常重要时,应该使用daemonset。

  • 更新DaemonSet

    如果修改了节点标签,DaemonSet 将立刻向新匹配上的节点添加Pod,同时删除不能够匹配的节点上的Pod。可以修改 DaemonSet创建的Pod。然而不允许对Pod的所有字段进行更新。当下次某节点(即使具有相同的名称的Pod)被创建时,DaemonSet Controller还会使用最初的模板。你可以删除一个DaemonSet。如果使用kubectl并指定 --cascade=false选项,则Pod将被保留在节点上。然后可以创建具有不同模板的新DaemonSet。具有不同模板的新 DaemonSet 将能够通过标签匹配并识别所有已经存在的 Pod。 如果有任何Pod需要替换,则DaemonSet根据它的updateStrategy来替换

  • 与 DaemonSet 中的 Pod 进行通信

  1. Push:将DaemonSet中的Pod配置为将更新发送到其他服务,例如统计数据库。
  2. NodeIP 和已知端口:DaemonSet中的Pod可以使用hostPort,从而可以通过节点IP访问到 Pod。客户端能通过某种方法获取节点 IP 列表,并且基于此也可以获取到相应的端口。
  3. DNS:创建具有相同Pod Selector 的Headless Service,然后通过使用endpoints资源或从DNS中检索到多个A记录来发现DaemonSet。
  4. Service:创建具有相同Pod Selector的Service,并使用该Service随机访问到某个节点上的daemonset pod(没有办法访问到特定节点)。
  • 污点和容忍度

DaemonSet控制器会自动将一组容忍度添加到DaemonSet Pod:

在这里插入图片描述

你也可以在DaemonSet的Pod模板中定义自己的容忍度并将其添加到DaemonSet Pod。

查看kibana

点击Discover添加index pattern根据步骤配置完成,再次点击Discover查看日志信息。

在这里插入图片描述

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

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

相关文章

Github copilot我用正版登录授权的,来体验一下吧

Github copilot 市面上的那种可以说是破解的&#xff0c;不是代码补全不稳定&#xff0c;就是chat不稳定&#xff0c;反正就是不怎样&#xff01; 下面是官网正版开通的&#xff0c;欢迎体验15天 体验地址&#xff1a;https://www.bilibili.com/read/cv33696436 这种copilo…

半导体存储电路知识点总结

目录 一、SR锁存器 1.SR锁存器的概念 2.作用 二、电平触发器&#xff08;Flip-Flop&#xff09; 1.时钟信号 2.电平触发的触发器电路结构 3.带异步置位复位的电平触发器 三、边沿触发器 1.特点 2.两个D触发器组成的边沿触发D触发器 3.CMOS边沿触发D触发器的典型电路 …

钉钉对接T+生成总账凭证

客户介绍&#xff1a; 某餐饮连锁企业是一个专注于特色风味徽州菜的餐饮品牌&#xff0c;总部位于杭州市&#xff0c;其推出的各式特色徽菜深受市场的好评&#xff0c;在杭州本地的餐饮市场中有着很强的竞争力。公司ERP使用用友T系统&#xff0c;通过钉钉管理员工费用报销流程…

20240328-1-Prophet面试题

Prophet面试题 1. 简要介绍Prophet 常见的时间序列分解方法&#xff1a; 将时间序列分成季节项 S t S_t St​&#xff0c;趋势项 T t T_t Tt​&#xff0c;剩余项 R t R_t Rt​&#xff0c;即对所有的 t ≥ 0 t≥0 t≥0 y t S t T t R t y_{t}S_{t}T_{t}R_{t} yt​St​Tt…

janus部署

配置和运行janus 1. 配置nginx 安装nginx&#xff0c;主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

【MySQL】20. 使用C语言链接

mysql connect mysql的基础&#xff0c;我们之前已经学过&#xff0c;后面我们只关心使用 要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;大家可以去官网下载 我们使用C接口库来进行连接 要正确使用&#xff0c;我们需要做一些准备工作&#xff1a; …

Servlet的文件上传下载

Servlet的文件上传|下载 二、文件上传实现 2.1实现思路 需要使用到Commons-FileUpload组件需要将jsp页面form表单的enctype属性值设置为“multipart/form-data”&#xff0c;Servlet中使用IO流实现文件的上传 2.2、实现过程 2.2.1新建web项目导入jar包 <dependency>…

weblogic oracle数据源配置

在weblogic console中配置jdbc oracle数据源 1. base_domain->Service->DataSources 在Summary of JDBC Data Sources中&#xff0c;点击New, 选择【Generic Data Source】通用数据源。 2. 设置数据源Name和JNDI name 注&#xff1a;设置的JNDI Name是Java AP中连接…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V

在人工智能领域&#xff0c;多模态模型的发展一直是科技巨头们竞争的焦点。 近日&#xff0c;马斯克旗下的X AI公司发布了其最新的多模态模型——Grok-1.5 Vision&#xff08;简称Grok-1.5V&#xff09;&#xff0c;这一模型在处理文本和视觉信息方面展现出了卓越的能力&#x…

Elasticsearch分布式搜索

实用篇-ES-环境搭建 ES是elasticsearch的简称。我在SpringBoot学习 数据层解决方案 的时候&#xff0c;写过一次ES笔记&#xff0c;可以结合一起看一下。 之前在SpringBoot里面写的相关ES笔记是基于Windows的&#xff0c;现在我们是基于docker容器来使用&#xff0c;需要你们提…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

【CicadaPlayer】prepare和start的触发和异步处理

主线程可以直接用SuperMediaPlayer 但SuperMediaPlayer 的处理是异步的。实际上msgproc的目的在于异步处理外部请求 例如,启动后会先设置view,这个与播放流程无关,但是是必须要让播放器拥有的。用户点击prepare是直接调用SuperMediaPlayer的Prepare接口,才会触发url的设置 …

数据结构--栈,队列,串,广义表

3.栈 &#xff08;先进后出&#xff09; 栈是一种特殊的线性表&#xff0c;只能从一端插入或删除操作。 4.队列 4.1 4.1.1初始化 4.1.2判断队列是否为空 4.1.3判断队列是否为满 4.1.4入队 4.1.5出队 4.1.6打印队列 4.1.7销毁队列 5.串 5.1 串的定义 由零个或者任意多…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

VMware安装Linux虚拟机(rocky9)

软件准备&#xff1a; VMware虚拟机ISO系统镜像文件 选择创建虚拟机→典型→下一步→点击稍后安装操作系统 选择Linux系统和对应版本 输入虚拟机名称和选择保存位置 设置磁盘大小 根据需要自定义硬件配置→完成 然后点击编辑虚拟机设置→CD/DVD→选择ISO镜像 然后开启虚拟机→…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是重复数了几条或漏掉了几条。于是她来就来求助你&#xff0c;然而你也不会啊&#xff01;写一个程序来帮帮她吧。 题目描述 给你一个…

【CSS面试题】Flex实现九宫格

考察知识&#xff1a; flex布局 水平垂直居中的实现 初始效果 代码关键&#xff1a;给父盒子添加以下属性 flex-wrap: wrap; /* 允许换行 */justify-content: space-around; /* 主轴对齐方式 */align-content: space-around; /* 多行在侧轴上的对齐方式 */<!DOCTYPE html&…