小阿轩yx-Kubernertes日志收集

小阿轩yx-Kubernertes日志收集

前言

  • 在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等

有哪些日志需要收集

  • 日志收集与分析很重要,为了更加方便的处理异常

简单总结一些比较重要的需要收集日志

  • 服务器系统日志
  • Kubernetes 组件日志
  • 应用程序日志

除了这些日志外,可能还存在其它很多需要采集的日志,比如网关日志、服务之间调用链日志

日志采集工具有哪些

ELK 和 EFK

传统的架构中

  • 比较成熟且流行的日志收集平台是 ELK(Elasticsearch+Logstash+Kibana),其中 Logstash 负责采集日志,并输出给 Elasticsearch,之后用 Kibana 进行展示。
  • 几乎所有的服务都可以进行容器化
  • ELK 技术栈同样可以部署到 Kubernetes 集群中,也可以进行相关的日志收集

但是由于 Logstash 比较消耗系统资源,并且配置稍微有点复杂,因此 Kubernetes 官方提出了 EFK(Elasticsearch+Fluentd+Kibana)的解决方案

相对于 ELK 中的 Logstash

  • Fluentd 采用一锅端的形式,可以直接将某些日志文件中的内容存储至 Elasticsearch,然后通过 Kibana进行展示。

Fluentd 缺陷

  • 它只能收集控制台日志(程序直接输出到控制台的日志),不能收集非控制台的日志,所以很难满足生产环境的需求
  • 因为大部分情况下,没有遵循云原生理念开发的程序,往往会输出很多日志文件,这些容器内的日志无法采集
  • 除非在每个 Pod 内添加一个 sidecar,将日志文件的内容进行 tail -f 转换成控制台日志,但这也是非常麻烦的。

另一个问题

  • 大部分公司内都有很成熟的 ELK 平台,如果再搭建一个 EFK 平台,属于重复,当然用来存储日志的 Elasticsearch 集群不建议搭建在 Kubernetes 集群中,因为会非常浪费 Kubernetes 集群的资源,所以大部分情况下通过 Fluentd 采集日志输出到外部的 Elasticsearch 集群中。

总结

  • Fluentd 功能有限,Logstash 太重,所以需要一个中和的工具进行日志的收集工作,此时就可以采用一个轻量化的收集工具:Filebeat

Filebeat

早期的 ELK 架构中

  • 日志收集均以 Logstash 为主,Logstash 负责收集和解析日志,对内存、CPU、IO 资源的消耗比较高,但是 Filebeat 所占系统的 CPU 和内存几乎可以忽略不计。

由于 Filebeat 本身是比较轻量级的日志采集工具,因此 Filebeat 经常被用于以 Sidecar 的形式配置在 Pod 中,用来采集容器内冲虚输出的自定义日志文件。

  • Filebeat 同样可以采用 DaemonSet 的形式部署在 Kubernetes 集群中,用于采集系统日志和程序控制台输出的日志。
  • Fluentd 和 Logstash 可以将采集的日志输出到 Elasticsearch 集群,Filebeat 同样可以将日志直接存储到 Elasticsearch 中,但是为了更好的分析日志或者减轻 Elasticsearch 的压力,一般都是将日志先输出到 Kafka,再由 Logstash 进行简单的处理,最后输出到 Elasticsearch 中。

新贵 Loki

  • 上述讲的无论是 ELK、EFK 还是 Filebeat,都需要用到Elasticsearch 来存储数据

Elasticsearch

  • 本身就像一座大山,维护难度和资源使用都是偏高的。

对于很多公司而言,热别是创新公司,可能并不想大费周章的去搭建一个 ELK、EFK或者其他重量级的日志平台,刚开始的人力投入可能是大于收益的,所以就需要一个更轻量级的日志收集平台。

一个基于 Kubernetes 平台的原生日志收集平台 Loki stack 应运而生,解决了上述的问题和难点,一经推出,就受到了用户的青睐。

Loki

  • 是 Grafana Labs 开源的一个日志聚合系统。

优势

  • 支持水平扩展、高可用、多租户的

Loki 的架构图

Loki 主要包含的组件

  • Loki:主服务器,负责日志的存储和査询,参考了prometheus 服务发现机制,将标签添加到日志流,而不是想其他平台一样进行全文索引。
  • Promtail:负责收集日志并将其发送给 Loki,主要用于发现采集目标以及添加对应 Labe1,最终发送给 Loki。
  • Grafana:用来展示或查询相关日志,可以在页面査询指定标签 Pod 的日志。

和其他工具相比

  • 虽然 Loki 不如其他技术栈功能灵活,但是 Loki 不对日志进行全文索引,仅索引相关日志的元数据,所以 Loki 操作起来更简单、更省成本。
  • 而且 Loki 是基于 Kubernetes 进行设计的,可以很方便的部署在 Kubernetes 上,并且对集群的 Pod 进行日志采集,采集时会将 Kubernetes 集群中的一些元数据自动添加到日志中,让技术人员可以根据命名空间、标签字段进行日志的过滤,可以很快的定位到相关日志。

对于平台的选择,没有最好,只有最合适

  • 比如公司内已经有了很成熟的 ELK平台,那么我们可以直接采用 Fluentd 或 Filebeat,然后将 Kubernetes 的日志输出到已存在的 Elasticsearch集群中即可。
  • 如果公司并没有成熟的平台支持,又不想耗费很大的精力和成本去建立一个庞大的系统,那么 Loki stack 将会是一个很好的选择。

使用 EFK 收集控制台日志

  • 首先我们使用 EFK 收集 Kubernetes 集群中的日志
  • 本实验是在 Kubernetes 集群中启动一个 Elasticsearch 集群,如果企业已经有了 Elasticsearch 集群,可以直接将日志输出到已有的Elasticsearch集群中。

首先将 images-elk 镜像文件通过 Xftp 上传至 master、node01、node02(101、102、103)

将 efk-7.10.2 文件单独上传至 master(101)

这一步开启会话同步

进入镜像文件三个节点同时导入镜像 

主机一

[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img.sh

主机二

[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh

主机三

[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh

取消会话同步

部署 Elasticsearch+Fluentd+Kibana

下载需要的部署文档

https://github.com/dotbalo/k8s.git

  • get clone
  • 本案例已经下载好,可以直接使用

进入 ELK 目录

[root@k8s-master ~]# cd efk-7.10.2/

创建 EFK 所用的命名空间

[root@k8s-master efk-7.10.2]# kubectl create -f create-logging-namespace.yaml
namespace/logging created

创建 Elasticsearch 群集(已有该平台可以不创建)

[root@k8s-master efk-7.10.2]# kubectl create -f es-service.yaml
service/elasticsearch-logging created
  • 为 es 集群创建服务,以便为Fluentd 提供数据传入的端口

获取 SVC 状态信息

[root@k8s-master efk-7.10.2]# kubectl get svc -n logging
NAME                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)            AGE
elasticsearch-logging   ClusterIP   None         <none>        9200/TCP,9300/TCP  20s
  • 9200 端口:用于所有通过 HTTP 协议进行的 API 调用。包括搜索、聚合、监控、以及其他任何使用HTTP 协议的请求。所有的客户端库都会使用该端口与 Elasticsearch 进行交互。
  • 9300 端口:是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。

将文件创建出来

[root@k8s-master efk-7.10.2]# kubectl create -f es-statefulset.yaml
serviceaccount/elasticsearch-logging created
clusterrole,rbac.authorization.k8s.io/elasticsearch-logging created
clusterrolebinding.rbac.authorization.k8s.io/elasticsearch-logging created
statefulset.apps/elasticsearch-logging created
  • 创建 es 集群

获取 pod 的状态

[root@k8s-master efk-7.10.2]# kubectl get pod -n logging
NAME                       READY   STATUS     RESTARTS    AGE
elasticsearch-logging-0    1/1     Running    0           5m21s       

创建 Kibana(已有该平台可以不创建)

[root@k8s-master efk-7.10.2]# kubectl create -f kibana-deployment.yaml -f kibana-service.yaml
deployment.apps/kibana-logging created
service/kibana-logging created    

修改 Fluentd 的部署文件

  • 由于在 Kubernetes 集群中,可能不需要对所有的机器都采集日志,因此可以更改 Fluentd 的部署文件。

添加一个 NodeSelector,只部署至需要采集日志的主机即可

[root@k8s-master efk-7.10.2]# grep "nodeSelector" fluentd-es-ds.yaml -A 3
nodeSelector:
        fluentd: "true"
      volumes:
      - name: varlog

为需要采集日志的服务器设置标签

[root@k8s-master efk-7.10.2]# kubectl label node k8s-node01 fluentd=true
node/k8s-node01 labeled
[root@k8s-master efk-7.10.2]# kubectl label node k8s-node02 fluentd=true
node/k8s-node02 labeled
[root@k8s-master efk-7.10.2]# kubectl label node k8s-master fluentd=true

获取 node 节点的标签信息

[root@k8s-master efk-7.10.2]# kubectl get node -l fluentd=true --show-labels
NAME         STATUS   ROLES     AGE   VERSION    LABELS
k8s-master   Ready    <none>    8d    v1.23.6    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes,io/hostname=k8s-master01,kubernetes,io/os=linux,node.kubernetes.io/node=
k8s-node01   Ready    <none>    8d    v1.23.6    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes,io/hostname=k8s-master01,kubernetes,io/os=linux,node.kubernetes.io/node=
k8s-node02   Ready    <none>    8d    v1.23.6    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes,io/hostname=k8s-master01,kubernetes,io/os=linux,node.kubernetes.io/node=

创建 Fluentd

[root@k8s-master efk-7.10.2]# kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml
serviceaccount/fluentd-es created
clusterrole.rbac.authorization.k8s,io/fluentd-es created
clusterrolebinding.rbac.authorization.k8s,io/fluentd-es createddaemonset.apps/fluentd-es-v3.1.1 created
configmap/fluentd-es-config-v0.2.1 created 

fluentd 的 ConfigMap 有一个字段需要注意,在 fluentd-es-configmap.yaml 文件的最后有一个output.conf:

host elasticsearch-logging
port 9200

此处的配置将收集到得数据输出到指定的 Elasticsearch 集群中,由于创建 Elasticsearch 集群时会自动创建一个名为 elasticsearch-logging 的 Service,因此默认 Fluentd 会将数据输出到前面创建的 Elasticsearch 集群中。

如果企业已经存在一个成熟的 ELK 平台,可以创建一个同名的 Service 指向该集群,然后就能输出到现有的 Elasticsearch 集群中。

例如

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-logging
  namespace: logging
spec:
  type: ExternalName
  externalName: www.es.com
  • externalName: www.es.com:指向了外部 es 主机的地址或域名
<match **>
...
     host elasticsearch-logging
     port 9200
     logstash format true
...
   </match>
  • host elasticsearch-logging:指定 fluentd 获取的日志要发往的主机
  • port 9200:目标es 主机的端口号
  • logstash_format true:指定是否使用常规的 index 命名格式,(1ogstash-%.%m.%d),默认为 false

Kibana 的使用

确认创建的 Pod 已经成功启动

[root@k8s-master efk-7.10.2]# kubectl get pod -n logging
NAME                               READY    STATUS    RESTARTS    AGE
elasticsearch-logging-0            1/1      Running   0           34m
fluentd-es-v3.1.1-7pm5p            1/1      Running   0           92s
fluentd-es-v3.1.1-wddc9            1/1      Running   0           15m
kibana-logging-7df48fb7b4-frfj6    1/1      Running   0           33m

查看 kibana 暴露的端口

[root@k8s-master efk-7.10.2]# kubectl get svc -n logging
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP    PORT(S)              AGE
elasticsearch-logging   ClusterIP   None            <none>         9200/TCP,9300/TCP    35m
kibana-logging          NodePort    10.104.162.209  <none>         5601:32734/TCP       34m

访问 kibana

  • 使用任意一个部署了 kube-proxy 服务的节点的 IP+32734 端口即可访问 kibana。

https://192.168.10.101:32734/kibana

创建一个 Pod 进行日志采集

编写 nginx 部署文件

[root@k8s-master efk-7.10.2]# cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
            protocol: TCP

部署该 Dployment

[root@k8s-master efk-7.10.2]# kubectl create -f nginx-service.yaml

查看 pod 状态

[root@k8s-master efk-7.10.2]# kubectl get pod
NAME                                   READY    STATUS    RESTARTS    AGE
mynginx-deployment-86655474f9-74whc    1/1      Running   0           34m
mynginx-deployment-86655474f9-zc5xh    1/1      Running   0           92s

查看暴露的端口

[root@k8s-master efk-7.10.2]# kubectl get svc -n default
NAME         TYPE            CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP       10.96.0.1      <none>         443/TCP        13d
mynginx      LoadBalancer    10.109.192.36  <none>         80:32019/TCP   12m

客户端访问测试

[root@k8s-master efk-7.10.2]# curl 192.168.10.101:32019

到 kibana 上查看

使用 Filebeat 收集自定义文件日志

基于云原生 12 要素开发的程序,一般会将日志直接输出到控制台,并非是指定一个文件存储日志,这一点和传统架构还是有区别的。

公司内的程序并非都是基于云原生要素开发

  • 一些年代已久的程序,这类程序如果部署至 Kubernetes 集群中,就需要考虑如何将输出至本地文件的日志采集到 Elasticsearch。

之前了解到 Filebeat 是一个非常轻量级的日志收集工具,可以将其和应用程序部署至一个 Pod中,通过 Volume 进行日志文件的共享,之后 Filebeat 就可以采集里面的数据,并推送到日志平台。

本案例为了减轻 Elasticsearch 的压力

  • 引入 Kafka 消息队列来缓存日志数据,之后通过Logstash 简单处理一下日志,最后再输出到 Elasticsearch 集群。
  • 这种架构在生产环境中也是常用的架构,因为日志数量可能比较多,同时也需要对其进行加工。
  • 当然 Fluentd 也可以将日志输出到 Kafka。

安装 helm 客户端(如果已有此工具,可跳过此步骤)

下载安装包

https://get.helm.sh/helm-v3.6.2-linux-amd64.atr.gzhttp://https://get.helm.sh/helm-v3.6.2-linux-amd64.atr.gz

解压

[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz

查看版本

[root@k8s-master ~]# helm version
version.BuildInfo{Version:"v3.6.2",
GitCommit:"ee407bdf364942bcb8e8c665f82e15aa28009b71",GitTreestate:"clean",
GoVersion:"go1.16.5"}

创建 Kafka 和 Logstash

进入 filebeat 目录

[root@k8s-master ~]# cd elk-7.10.2/filebeat/

查看 zookeeper 状态

[root@k8s-master filebeat]# kubectl get pod -n logging -l app.kubernetes.io/name=zookeeper
  • -l:指定标签
  • 等一会,部署好显示状态为 Running

部署 kafka

[root@k8s-master filebeat]# helm install kafka kafka/ -n logging

查看 kafka 状态

[root@k8s-master filebeat]# kubectl get pod -n logging -l app.kubernetes.io/component=kafka
  • 等一会,部署好显示状态为 Running

创建 logstash 服务

[root@k8s-master filebeat]# kubectl create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging

注入 Filebeat Sidecar

创建一个模拟程序

[root@k8s-master filebeat]# kubectl create -f filebeat-cm.yaml -f app-filebeat.yaml -n logging

查看 pod 状态

[root@k8s-master filebeat]# kubectl get pod -n logging
[root@k8s-master filebeat]# kubectl get svc -n logging
[root@k8s-master filebeat]# kubectl get svc
  • 这个 mynginx 的 svc 是创建在了 default 的命名空间的。

查看日志中的内容

[root@k8s-master filebeat]# kubectl exec app-ddf4b6db9-thtbs -n logging -- tail /opt/date.log

最后返回主目录删除 EFK

[root@k8s-master ~]# rm -rf images-efk/
  • 最后删除整个 EFK 目录文件,不要影响后面的 Loki 实验

Loki

安装 Loki Stack(如果已安装,忽略此步骤)

首先将 images-loki 镜像文件通过 Xftp 上传至 master、node01、node02(101、102、103)

将 loki 文件单独上传至 master(101)

解压

[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz

将文件拷贝到指定目录下

[root@k8s-master ~]# cp linux-amd64/helm /usr/bin

添加安装源

[root@k8s-master ~]# helm repo add grafana

下载 loki-stack(如已有离线包,忽略此步骤)

https://grafana.github.io/helm-charts

[root@k8s-master ~]# helm repo update
grafana" has been added to your repositories
Hang tight while we grab the latest from your chart repositories......Successfully got an update from the "grafana" chart repository

其他安装源
helm repo add loki https://grafana.github.io/loki/charts && helm repo update

查看列表

[root@k8s-master ~]# helm repo list

查看版本信息

[root@k8s-master ~]# helm search repo loki-stack
NAME                        CHART VERSION    APP VERSION    DESCRIPTION
grafana/loki-stack2.8.3     v2.6.1           loki: like Prometheus,but for logs.

拉取

[root@k8s-master ~]# helm pull grafana/loki-stack --version 2.8.3

创建 Loki 命名空间

[root@k8s-master ~]# kubectl create ns loki
namespace/loki created

解压 Loki 源码包

[root@k8s-master ~]# tar zxvf loki-stack-2.8.3.tgz

创建 Loki Stack

[root@k8s-master ~]# helm upgrade --install loki loki-stack --set grafana.enabled=true --set grafana.service.type=NodePOrt -n loki
Release "loki" does not exist. Installing it now.
W0903 18:20:24.050253
36913 warnings.go:70]policy/v1betal PodsecurityPolicy is deprecated in v1.21+,unavailable in v1.25+W0903 18:20:24.05224336913 warnings.go:70]policy/v1beta1 PodsecurityPolicy isdeprecated in v1.21+,unavailable in v1.25+36913 warnings.go:70]policy/v1betal PodsecurityPolicy isW0903 18:20:24.055204deprecated in v1.21+,unavailable in v1.25+
W0903 18:20:24.14278636913 warnings.go:70]policy/v1beta1 PodsecurityPolicy isdeprecated in v1.21+,unavailable in v1.25+
W0903 18:20:24.14297636913 warnings.go:70]policy/v1betal PodsecurityPolicy isdeprecated in v1.21+,unavailable in v1.25+
36913 warnings.go:70]policy/v1beta1 PodsecurityPolicy isW0903 18:20:24.143197deprecated in v1.21+,unavailable in v1.25+NAME: loki
LAST DEPLOYED:Sat sep 3 18:20:23 2022NAMESPACE: loki
STATUS:deployed
REVISION:1
NOTES :
The Loki stack has been deployed to your cluster. Loki can now be added as a datasourcein Grafana.
See http://docs.grafana.org/features/datasources/loki/ for more detail.

查看 Pod 状态

[root@k8s-master ~]# kubectl get pod -n loki
NAME                             READY    STATUS    RESTARTS    AGE
loki-0                           1/1      Running   0           2m12s
loki-grafana-64977c65f6-f26jk    1/1      Running   0           34m
loki-promtail-6bv2f              1/1      Running   0           92s
loki-promtail-xhlfc              1/1      Running   0           2m12s
loki-promtail-zscq9              1/1      Running   0           2m12s

查看暴露的端口

[root@k8s-master efk-7.10.2]# kubectl get svc -n loki
NAME             TYPE            CLUSTER-IP        EXTERNAL-IP    PORT(S)        AGE
loki             ClusterIP       10.111.100.11     <none>         3100/TCP       2m40s
loki-grafana     LoadBalancer    10.96.88.143      <none>         80:32734/TCP   2m40s
loki-headless    ClusterIP       None              <none>         3100/TCP       2m40s
loki-memberlist  ClusterIP       None              <none>         7946/TCP       2m40s

查看 grafana 的密码

[root@k8s-master ~]# kubectl get secret loki-grafana --namespace loki -o jsonpath="{.data.admin-password}" | base64 --decode;echo
AfA2tYlsaPdy6hk1DB0xYfB7YZLf0501JsGtwcBV

修改密码

[root@k8s-master ~]# kubectl exec -it loki-grafana-595d45d694-htg29 -n loki -c grafana grafana-cli admin reset-admin-password admin
  • 账号为:admin

登录

  • https://192.168.10.101:32734

创建一个 Pod 进行日志采集

(还是前面的 pod)

编写 nginx 部署文件

[root@k8s-master ~]# cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
            protocol: TCP

部署该 Dployment

[root@k8s-master ~]# kubectl create -f nginx-service.yaml

查看 pod 状态

[root@k8s-master ~]# kubectl get pod
NAME                                 READY    STATUS    RESTARTS    AGE
mynginx-deployment-86655474f9-74whc  1/1      Running   0           2m12s
mynginx-deployment-86655474f9-zc5xh  1/1      Running   0           2m12s

查看暴露的端口

[root@k8s-master ~]# kubectl get svc -n default
NAME             TYPE            CLUSTER-IP        EXTERNAL-IP    PORT(S)        AGE
kubernetes       ClusterIP       10.96.0.1         <none>         443/TCP       13d
mynginx          LoadBalancer    10.109.192.36     <pending>      80:32019/TCP   12m

客户端访问测试

[root@k8s-master ~]# curl 192.168.10.101:32019

在 Loki 中查看此 Pod 的日志

{namespace="default",pod="mynginx-deployment-668d5454cb-lldng"}
{namespace="kube-system"}
{namespace="kube-system",pod="calico-node-gwtqw"}

小阿轩yx-Kubernertes日志收集

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

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

相关文章

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http&#xff0c;它的端口是443&#xff0c;它的协议是tcp协议。建立连接和普通的tcp是一样的&#xff0c;都是三次握手和四次挥手&#xff0c;但是它三次握手之后有一个步骤&#xff1a;SSL或者TLS握手的过程&#xff0c…

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍&#xff1a; Confluence是一个专业的企业知识管理与协同软件。使用简单&#xff0c;但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论&#xff0c;信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

【C++】手动实现nique_ptr智能指针

1、自己实现封装了一个智能指针&#xff0c;并且使用了模板 目录 代码实现&#xff1a; 输出结果如下&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;template <typename T> class UniquePtr { private:T *ptr;public://默认构造函…

H5 响应式精品网站推荐导航源码

源码名称&#xff1a;响应式精品网站推荐导航源码 源码介绍&#xff1a;一款响应式精品网站推荐导航源码&#xff0c;可以自己修改代码替换图标图片和指向网址。背景图支持自动替换&#xff0c;背景图可以在img.php中修改 需求环境&#xff1a;H5 下载地址&#xff1a; http…

【MADRL】多智能体深度确定性策略梯度(MADDPG )算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代&#xff0c;Java作为一门成熟且广泛应用的编程语言&#xff0c;一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓&#xff0c;掌握其核心概念与高级特性&#xff0c;并通过实战案例提升编程技…

MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略

MLM&#xff1a;多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略 目录 相关文章 AI之MLM&#xff1a;《MM-LLMs: Recent Advances in MultiModal Large Language Models多模态大语言模型的最新进展》翻译与解读 MLM之CLIP&#xff1a;CLIP…

012.Oracle-索引

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题&#xff1a; LLM 模型因为有大量的参数&#xff0c;以及 next token 的预测方式&#xff0c;导致 LLM 模…

攻防世界 unseping

unseping 攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客 这道题对我来说还是有点难&#xff0c;什么oct绕过命令执行第一次遇到捏&#xff0c;所以基本是跟着别人的wp写的&#xff0c;一点点记录吧 先对源码进行分析 <?php highlight_file(__FILE…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程&#xff08;快速&#xff09;少单算子调用&#xff0c;快速验证算法逻辑IC…

打造个性化时装购物平台:Spring Boot框架的实践

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

面试必备:接口自动化测试精选面试干货

一、 请问你是如何做接口测试的&#xff1f; 大体来说&#xff0c;经历以下过程&#xff1a;接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说&#xff0c;接口测试流程分成以下九步&#xff1a; 第一步&am…

2024年,女生到底适合转行ui设计还是软件测试?

作为2024年的就业选择来说&#xff0c;软件测试和UI设计发展都挺不错的 选择这两个方向转行的女生很多。但具体选择测试还是UI设计&#xff0c;最好还是根据你个人的兴趣爱好以及长期的发展路径去选择 比如&#xff1a;薪资、工作稳定性、后续晋升空间、学习难度等等方面~ 如…

Kafka【十三】消费者消费消息的偏移量

偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下&#xff0c;消费者如果不指定消费主题数据的偏移量&#xff0c;那么消费者启动消费时&#xff0c;无论当前主题之前存储了多少历史数据&#xff0c;消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…

论文解读 | KDD2024 演化图上的森林矩阵快速计算

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者直播讲解回放&#xff01; 作者简介 孙浩鑫&#xff0c;复旦大学博士生&#xff0c;主要研究方向为大规模图上快速算法设计。 概述 森林矩阵在网络科学、观点动力学和机器学习相关应用中…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点&#xff1a; 第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲&#xff0c;本课时知识点会涉及案例分析题&#xff08;25分&#xff09;。在历年考试中&#xff0c;案例题对该部分内容都有固定考查&#xff0c;综合知识选择题目中有固定分值…

关于C++数组越界的异常

数组越界一般是很难发现的,而且并不是每次都会崩溃. 比如说定义一个数字 #DEFINE MAX_ARRAY 5 int m_IntArray[MAX_ARRAY]; 我们在初始化的时候,故意给他越界,这个时候一般是不会报错的. for(int i0;i<15;i) { m_IntArray[i]0; } 尤其是全局变量,居然一点提示都没有,局部变…

基于约束大于规范的想法,封装缓存组件

架构&#xff1f;何谓架构&#xff1f;好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架&#xff0c;可以让其他开发人员减少不必要的代码开发量&#xff1b;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源&#xff0c;实现最高的程序效率…