k8s七

2023-11-08

参考资料:深入剖析Kubernetes-张磊

这篇文章主要介绍Kubernetes中第三个重要编排对象DaemonSet守护进程的实现原理及使用方法。

一、DaemonSet 简介

DaemonSet:服务守护进程,它的主要作用是在Kubernetes集群的所有节点中运行我们部署的守护进程,相当于在集群节点上分别部署Pod副本,如果有新节点加入集群,Daemonset会自动的在该节点上运行我们需要部署的Pod副本,相反如果有节点退出集群,Daemonset也会移除掉部署在旧节点的Pod副本。

DaemonSet的主要特征:

  • 这个 Pod 运行在 Kubernetes 集群里的每一个节点(Node)上;
  • 每个节点上只会运行一个这样的 Pod 实例;
  • 如果新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;
  • 而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。

DaemonSet常用场景:

  • 网络插件的 Agent 组件,如(Flannel,Calico)需要运行在每一个节点上,用来处理这个节点上的容器网络;
  • 存储插件的 Agent 组件,如(Ceph,Glusterfs)需要运行在每一个节点上,用来在这个节点上挂载F远程存储目录;
  • 监控系统的数据收集组件,如(Prometheus Node Exporter,Cadvisor)需要运行在每一个节点上,负责这个节点上的监控信息搜集。
  • 日志系统的数据收集组件,如(Fluent,Logstash)需要运行在每一个节点上,负责这个节点上的日志信息搜集。

二、DaemonSet的实现原理

DaemonSet 开始运行的时机,很多时候比整个 Kubernetes 集群出现的时机都要早。比如在创建Kubernetes集群后,Node节点上由于没有可用的容器网络,集群节点的状态会是NotReady,普通的Pod将无法运行,我们就需要通过DaemonSet 部署一个网络插件的 Agent 组件。下面我们来了解下DaemonSet如何设计实现的。

1. DaemonSet是如何确保每个节点只运行一个Pod?

  1. 首先DaemonSet的控制器模型DaemonSet Controller先从从 Etcd 里获取所有的 Node 列表;
  2. 然后遍历所有的 Node检查,当前这个 Node节点上是不是有一个携带了我们定义标签的 Pod 在运行;
  3. 如果没有定义的 Pod,那么就意味着要在这个 Node 上创建这样一个 Pod;
  4. 如果有定义的 Pod,但是数量大于 1,那就说明要调用 Kubernetes API 把多余的 Pod 从这个 Node 上删除掉;
  5. 如果正好只有一个定义的 Pod,那说明这个节点是正常的。

2. 如何只在指定的节点上运行Pod?

首先我们会想到使用nodeSelector字段来指定Node的名字,但是在 Kubernetes 项目里,nodeSelector 其实已经是一个将要被废弃的字段了。因为,现在有了一个新的、功能更完善的字段可以代替它,即:nodeAffinity。·举个例子:

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: metadata.name
            operator: In
            values:
            - node-geektime

上面文件定义了spec.affinity字段,它是 Pod 里和调度相关的一个字段,然后又定义了一个nodeAffinity(节点关系)。这里它的定义含义是:

  • requiredDuringSchedulingIgnoredDuringExecution:它的意思是说,这个 nodeAffinity 必须在每次调度的时候予以考虑。同时,这也意味着你可以设置在某些情况下不考虑这个 nodeAffinity;
  • 这个 Pod,将来只允许运行在“metadata.name”是“node-geektime”的节点上;
  • operator: In(即:部分匹配;如果你定义 operator: Equal,就是完全匹配)

DaemonSet Controller 会在创建 Pod 的时候,自动在这个 Pod 的 API 对象资源里,加上这样一个 nodeAffinity 定义。其中,需要绑定的节点名字,正是当前正在遍历的这个 Node。当然,DaemonSet 并不需要修改用户提交的 YAML 文件里的 Pod 模板,而是在向 Kubernetes 发起请求之前,直接修改根据模板生成的 Pod 对象。

3. 污点与容忍

在经过上面的流程后,DaemonSet 还会给这个 Pod 自动加上另外一个与调度相关的字段,叫作tolerations(容忍)。这个字段意味着这个 Pod,会“容忍”(Toleration)某些 Node 的“污点”(Taint),即可以在有污点的节点调度运行,继而保证每个节点上都会被调度一个 Pod。

DaemonSet 自动添加的tolerations 字段,格式如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: with-toleration
spec:
  tolerations:
  - key: node.kubernetes.io/unschedulable
    operator: Exists
    effect: NoSchedule

举个例子:在 Kubernetes 项目中,当一个节点的网络插件尚未安装时,这个节点就会被自动加上名为node.kubernetes.io/network-unavailable的“污点”。而通过这样一个 Toleration,调度器在调度这个 Pod 的时候,就会忽略当前节点上的“污点”,从而成功地将网络插件的 Agent 组件调度到这台机器上启动起来。

...
template:
    metadata:
      labels:
        name: network-plugin-agent
    spec:
      tolerations:
      - key: node.kubernetes.io/network-unavailable
        operator: Exists
        effect: NoSchedule

尽管DaemonSet Pod遵守污染(taint)和容忍(toleration),但以下容忍会根据相关特性自动添加到DaemonSet 管理的Pod中。

Toleration Key 影响 版本 描述
node.kubernetes.io/not-ready NoExecute 1.13+ 当存在节点问题(如网络分区)时,DaemonSet pod不会被驱逐。
node.kubernetes.io/unreachable NoExecute 1.13+ 当存在节点问题(如网络分区)时,DaemonSet pod不会被驱逐。
node.kubernetes.io/disk-pressure NoSchedule 1.8+
node.kubernetes.io/memory-pressure NoSchedule 1.8+
node.kubernetes.io/unschedulable NoSchedule 1.12+ 在默认的调度程序中,DaemonSet pod允许不可调度的属性。
node.kubernetes.io/network-unavailable NoSchedule 1.12+ 使用主机网络的DaemonSet pod,默认调度器允许网络不可用属性。

K8S的调度策略还有很多,会在后面文章中专门介绍

三、使用DaemonSet控制器部署Fluentd

现在我们通过DaemonSet部署日志收集组件Fluentd,具体的来了解DaemonSet的使用方法。
DaemonSet管理的是一个 fluentd-elasticsearch 镜像的 Pod,

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: k8s.gcr.io/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

可以看到,DaemonSet 跟 Deployment 其实非常相似,只不过是没有 replicas 字段,
它也使用 selector选择管理所有携带了name=fluentd-elasticsearch标签的 Pod。而这些 Pod 的模板,也是用 template 字段定义的。在这个字段中,我们定义了一个使用 fluentd-elasticsearch:1.20 镜像的容器,这个镜像通过 fluentd 将 Docker 容器里的日志转发到 ElasticSearch 中。而且这个容器挂载了两个 hostPath 类型的 Volume,分别对应宿主机的 /var/log 目录和 /var/lib/docker/containers 目录,然后也定义了容忍master上的污点。

需要注意的是,Docker 容器里应用的日志,默认会保存在宿主机的 /var/lib/docker/containers/{{. 容器 ID}}/{{. 容器 ID}}-json.log 文件里,所以这个目录正是 fluentd 的搜集目标。还有我们一般在创建DaemonSet对象时都应该加上resources字段进行资源的限制,防止它占用过多的宿主机资源。

创建资源对象

$ kubectl create -f fluentd-elasticsearch.yaml
$ kubectl get ds -n kube-system fluentd-elasticsearch
NAME                    DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd-elasticsearch   2         2         2         2            2           <none>          1h
$ kubectl get pod -n kube-system -l name=fluentd-elasticsearch
NAME                          READY     STATUS    RESTARTS   AGE
fluentd-elasticsearch-dqfv9   1/1       Running   0          53m
fluentd-elasticsearch-pf9z5   1/1       Running   0          53m

创建资源对象后,可以看到启动了两个Pod对象,这是因为DaemonSet会根据集群的节点来控制Pod的数量,有几个节点就会起相应的几个Pod对象,确保每个节点都有一个pod对象运行。

四、DaemonSet的版本管理

查看DaemonSet历史版本

$ kubectl rollout history daemonset fluentd-elasticsearch -n kube-system
daemonsets "fluentd-elasticsearch"
REVISION  CHANGE-CAUSE
1         <none>

更新DaemonSet中的镜像版本到 v2.2.0

$ kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=k8s.gcr.io/fluentd-elasticsearch:v2.2.0 --record -n=kube-system

--record :更新使用到的命令会出现在 DaemonSet 的 rollout history 历史版本里面。

查看镜像更新状态

$ kubectl rollout status ds/fluentd-elasticsearch -n kube-system
Waiting for daemon set "fluentd-elasticsearch" rollout to finish: 0 out of 2 new pods have been updated...
Waiting for daemon set "fluentd-elasticsearch" rollout to finish: 0 out of 2 new pods have been updated...
Waiting for daemon set "fluentd-elasticsearch" rollout to finish: 1 of 2 updated pods are available...
daemon set "fluentd-elasticsearch" successfully rolled out

Deployment 管理这些版本,靠的是“一个版本对应一个 ReplicaSet 对象”。而DaemonSet 控制器操作的直接就是 Pod,所以不会有 ReplicaSet 这样的对象参与其中。

那么,它的这些版本又是如何维护的呢?所谓,一切皆对象!在 Kubernetes 项目中,任何你觉得需要记录下来的状态,都可以被用 API 对象的方式实现。当然,“版本”也不例外。Kubernetes v1.7 之后添加了一个 API 对象,名叫 ControllerRevision,专门用来记录某种 Controller 对象的版本,ControllerRevision 其实是一个通用的版本管理对象。这样,Kubernetes 项目就巧妙地避免了每种控制器都要维护一套冗余的代码和逻辑的问题。

查看 fluentd-elasticsearch对应的 ControllerRevision:

$ kubectl get controllerrevision -n kube-system -l name=fluentd-elasticsearch
NAME                               CONTROLLER                             REVISION   AGE
fluentd-elasticsearch-64dc6799c9   daemonset.apps/fluentd-elasticsearch   2          1h

查看当前controllerrevision的事件信息

$ kubectl describe controllerrevision fluentd-elasticsearch-64dc6799c9 -n kube-system
Name:         fluentd-elasticsearch-64dc6799c9
Namespace:    kube-system
Labels:       controller-revision-hash=2087235575
              name=fluentd-elasticsearch
Annotations:  deprecated.daemonset.template.generation=2
              kubernetes.io/change-cause=kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=k8s.gcr.io/fluentd-elasticsearch:v2.2.0 --record=true --namespace=kube-system
API Version:  apps/v1
Data:
  Spec:
    Template:
      $ Patch:  replace
      Metadata:
        Creation Timestamp:  <nil>
        Labels:
          Name:  fluentd-elasticsearch
      Spec:
        Containers:
          Image:              k8s.gcr.io/fluentd-elasticsearch:v2.2.0
          Image Pull Policy:  IfNotPresent
          Name:               fluentd-elasticsearch
...
Revision:                  2
Events:                    <none>

可以看到,这个 ControllerRevision 对象,实际上是在 Data 字段保存了该版本对应的完整的 DaemonSet 的 API 对象。并且,在 Annotation 字段保存了创建这个对象所使用的 kubectl 命令。

回滚DaemonSet历史版本

$ kubectl rollout undo daemonset fluentd-elasticsearch --to-revision=1 -n kube-system
daemonset.extensions/fluentd-elasticsearch rolled back

这个 kubectl rollout undo 操作,实际上相当于读取到了Revision=1的 ControllerRevision 对象保存的 Data 字段。而这个 Data 字段里保存的信息,就是 Revision=1 时这个 DaemonSet 的完整 API 对象。

总结:在这篇文章中主要介绍了Kubernetes中第三个重要的编排对象DaemonSet,相比于 Deployment,DaemonSet 只管理 Pod 对象,然后通过 nodeAffinity 和 Toleration 这两个调度器的小功能,保证了每个节点上有且只有一个 Pod。与此同时,DaemonSet 通过使用 ControllerRevision,来保存和管理自己对应的“版本”。其中StatefulSet编排对象也是使用 ControllerRevision 进行版本管理的,这是因为在 Kubernetes 项目里,ControllerRevision 其实是一个通用的版本管理对象。


上篇文章:k8s五 | Pod的作业副本与滚动更新Deployment
系列文章:深入理解Kuerneters
参考资料:深入剖析Kubernetes-张磊


关注公众号回复【k8s】关键词获取视频教程及更多资料:
前行技术圈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s七 的相关文章

  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 如何检查Docker中是否安装了python包?

    我使用Dockerfile成功构建了一个容器 但是 我的代码在容器中不起作用 如果我手动安装所有软件包 它确实有效 我假设我搞砸了一些导致 docker 没有正确安装软件包的事情 所以 我想检查Docker容器中是否安装了python包 最
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 是否可以将应用服务的发布方法从 Code 转换为 Docker?

    我已经设置了一个 Azure 应用服务 Linux 发布方法 Code 并设置了适当的管道来构建和部署我的代码 nodejs 现在我需要对运行我的代码的主机进行更多控制 需要 poppler 在开发 测试中 我创建了新的应用程序服务并选择
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 在带有参数的 docker 容器中运行“apk add”命令[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试跑步 apk add pkg 在未启动的基于 alpine linux 的容器中 谁能告诉我以下命令有什么问题 docker r
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 等待 pod 附加或挂载卷的超时已过期

    我在裸机上的 ubuntu 上安装 kubernetes 我部署了1个master和3个worker 然后部署 rook 一切工作正常 但是当我想在其上部署 wordpress 时 我收到此错误 无法为 Pod 挂载卷 wordpress
  • 如何使用 Docker for Mac 向 docker awslogs 驱动程序提供凭证?

    我正在尝试使用泊坞窗awslogs 驱动程序 https docs docker com engine admin logging awslogs 并收到以下错误 docker 来自守护程序的错误响应 无法初始化日志记录 驱动程序 NoCr
  • docker-compose 将镜像推送到 aws ecr

    是否可以让 docker compose 构建镜像并将其推送到远程存储库 现在我做的是 docker compose 然后我做 docker compose config services 循环遍历名称重建图像名称和标签 然后执行 dock

随机推荐

  • 依赖注入之@Value原理(整体流程)

    Autowired等注解 Spring依赖注入之 Autowired Qualifier Primary Priority注解用法 Spring依赖注入之 Autowired Qualifier Primary Priority注解原理 上
  • win10 蓝牙耳机已连接但是耳机仍没有声音,音频仍是扬声器输出问题的出现条件及解决方案

    此问题可能分电脑分耳机类型出现 本人因耳机Fill CC2连接笔记本频繁出现此问题故以此文记录 问题出现原因 疑似 1 笔记本后台挂的程序应用过多 且笔记本开机通电时间过长 2 连接蓝牙耳机时笔记本扬声器正在发声 解决方法 27条消息 wi
  • 【xgboost】贝叶斯自动调参代码

    工作中 很多场景下会用到xgboost模型 如风控 催收 营销 推荐等待 在用xgboost模型进行模型训练的时候 也经常用贝叶斯自动调参来搜索最优的参数 现在把相关的代码贴出来 供大家参考 目前是支持了xgboost和lightgbm模型
  • VS2010安装失败解决办法

    1 运行regedit打开注册表 2 找到HKEY LOCAL MACHINE SOFWARE Microsoft Internet Explorer MAIN 3 MAIN子键的权限问题 修改成 允许完全控制 MAIN子键点击右键里弹出权
  • 解决Vue引入百度地图JSSDK:BMap is undefined 问题

    百度地图官网文档介绍使用JSSDK时 仅提供了三种引入方式 script引入 异步加载 npm install vue baidu map save 或 cnpm install vue baidu map save 全局引入 但vue项目
  • 每天一练——斐波那契数列前N项之和

    什么是斐波那契数列 斐波那契数列就是前两项之和会等于第三项 斐波那契数列通常以一为起始 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 正如我所说的前两项之和会等于第三项以此类推 那么
  • 【Unity3D】Unity5.6的Mecanim Animator动画系统结合MMD4Mecanim插件舞蹈动画

    1 下载MMD4Mecanim 官网 http stereoarts jp 我用的是最新版的MMD4Mecanim Beta 20170423 zip Unity是5 6 0版本的 2 解压后导入MMD4Mecanim unitypacka
  • 打印机漏洞(rce)

    20210510 0 出发 在翻阅论文的时候 突然想起来之前的时候 看到过一些打印机的漏洞 然后就在谷歌上搜索了一下 printer rce 然后找到了这篇文章 A Sheep in Wolf s Clothing Finding RCE
  • 老鸟重写程序需要准备点什么

    整体来说 老鸟工作已久 对语言 架构 算法 性能 安全 业务 各类型特点会掌控能力更高 但是年久未动手 不免生疏 为此专门整理需要的基本内容 可以抽空回味一下 在紧急上手之后 两周内查缺补漏 区别与新手面对任何问题的一脸懵逼 老鸟对所有技术
  • Redis配置优化

    Redis Redis 远程字典服务器 是一个开源的 使用c语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化 采用key value 键值对 的存储形式 是目前分布式架构中不可或缺的一环 Redis服务器程序是单进程模型 也
  • 21世纪的管理挑战

    朋友很早前推荐看的德鲁克系列 最近在孔网搞到了 顺便在此记录读书笔记和想法 如下 第一章 管理的新范式 管理是企业管理 新学科 公共管理 不同组织的任务和挑战也不存在巨大的差异 企业必须具有一个恰当的组织形式 组织不是绝对的 它是提高人们在
  • 科学计数法 C语言

    题目 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法 其满足正则表达式 1 9 0 9 E 0 9 即数字的整数部分只有 1 位 小数部分至少有 1 位 该数字及其指数部分的正负号即使对正数也必定明确给出 现以科学计数法的格式给
  • gcc (GNU编译器套件)

    gcc GNU编译器套件 编辑 GNU编译器套件 GNU Compiler Collection 包括 C C Objective C Fortran Java Ada和 Go语言的前端 也包括了这些语言的库 如libstdc libgcj
  • va_list(),va_start(),va_arg(),va_end()

    va list va start va arg va end 详解 一 写一个简单的可变参数的C函数 下面我们来探讨如何写一个简单的可变参数的C函数 写可变参数的C函数要在程序中用到以下这些宏 void va start va list a
  • python redis 获取所有key

    使用scan代替getKeys 线上的登录用户有几百万 数据量比较多 keys算法是遍历算法 复杂度是O n 也就是数据越多 时间越高 数据量达到几百万 keys这个指令就会导致 Redis 服务卡顿 因为 Redis 是单线程程序 顺序执
  • Nodejs——时间戳与日期相互转换

    时间格式化的库 silly datetime 安装 npm i silly datetime save var sillyDateTime require silly datetime 获取当前时间 并转换为年月份 时分秒的格式 conso
  • Mybatis 插入大量数据性能问题的解决(Caused by: java.sql.SQLException: ORA-04030: 在尝试分配 2024 字节 (kxs-heap-c,kg hs)

    最近写的需求 需要频繁的往数据库中插入大量的数据 多达上万条 最后导致oracle 数据库直接挂掉了 这个问题肯定要解决的 主要的原因就是一次性插入这么多数据 oracle 数据库承受不住 最后 报Caused by java sql SQ
  • linux 汇编 cqo,x64asm: 包括内存汇编程序,解析器和链接器的C ++库

    x64asm x64asm is a c 11 library for working with x86 64 assembly It provides a parser in memory assembler and linker and
  • oracle表的常见字段类型有哪些,Oracle数据库的字段类型

    字 段 类 型 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes N
  • k8s七

    参考资料 深入剖析Kubernetes 张磊 目录标题 一 DaemonSet 简介 二 DaemonSet的实现原理 1 DaemonSet是如何确保每个节点只运行一个Pod 2 如何只在指定的节点上运行Pod 3 污点与容忍 三 使用D