一、什么是Pod?
Pod是kubernetes中你可以创建和部署的最小也是最简的单位。一个Pod代表着集群中运行的一个进程。
Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubernetes中应用的一个实例,可能由一个或者多个容器组合在一起共享资源。
在Kubrenetes集群中Pod有如下两种使用方式:
一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位——一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
Pod中共享的环境包括Linux的namespace,cgroup和其他可能的隔绝环境,这一点跟Docker容器一致。在Pod的环境中,每个容器中可能还有更小的子隔离环境。
Pod中的容器共享IP地址和端口号,它们之间可以通过localhost
互相发现。它们之间可以通过进程间通信,需要明白的是同一个Pod下的容器是通过lo网卡进行通信。例如SystemV信号或者POSIX共享内存。不同Pod之间的容器具有不同的IP地址,不能直接通过IPC通信。
Pod中的容器也有访问共享volume的权限,这些volume会被定义成pod的一部分并挂载到应用容器的文件系统中。
就像每个应用容器,pod被认为是临时实体。在Pod的生命周期中,pod被创建后,被分配一个唯一的ID(UID),调度到节点上,并一致维持期望的状态直到被终结(根据重启策略)或者被删除。如果node死掉了,分配到了这个node上的pod,在经过一个超时时间后会被重新调度到其他node节点上。一个给定的pod(如UID定义的)不会被“重新调度”到新的节点上,而是被一个同样的pod取代,如果期望的话甚至可以是相同的名字,但是会有一个新的UID(查看replication controller获取详情)。
二、Pod中如何管理多个容器?
Pod中可以同时运行多个进程(作为容器运行)协同工作。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境和依赖,它们总是被同时调度。
注意在一个Pod中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如下图所示:
Pod中可以共享两种资源:网络和存储。
每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost
互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
可以Pod指定多个共享的Volume。Pod中的所有容器都可以访问共享的volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。
三、使用Pod
通常把Pod分为两类:
自主式Pod : 这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。
控制器管理的Pod: Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。如下图:
每个Pod都有一个特殊的被称为“根容器”的Pause 容器。 Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器。
Kubernetes设计这样的Pod概念和特殊组成结构有什么用意?????
原因一:在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了,此时是算整体挂了么?那么引入与业务无关的Pause容器作为Pod的根容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
原因二:Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了业务容器之间的通信问题,也解决了容器之间的文件共享问题。
四、Pod的持久性和终止
(1)Pod的持久性
Pod在设计支持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐 。
通常,用户不需要手动直接创建Pod,而是应该使用controller(例如Deployments),即使是在创建单个Pod的情况下。Controller可以提供集群级别的自愈功能、复制和升级管理。
(2)Pod的终止
因为Pod作为在集群的节点上运行的进程,所以在不再需要的时候能够优雅的终止掉是十分必要的(比起使用发送KILL信号这种暴力的方式)。用户需要能够放松删除请求,并且知道它们何时会被终止,是否被正确的删除。用户想终止程序时发送删除pod的请求,在pod可以被强制删除前会有一个宽限期,会发送一个TERM请求到每个容器的主进程。一旦超时,将向主进程发送KILL信号并从API server中删除。如果kubelet或者container manager在等待进程终止的过程中重启,在重启后仍然会重试完整的宽限期。
示例流程如下:
用户发送删除pod的命令,默认宽限期是30秒;
在Pod超过该宽限期后API server就会更新Pod的状态为“dead”;
在客户端命令行上显示的Pod状态为“terminating”;
跟第三步同时,当kubelet发现pod被标记为“terminating”状态时,开始停止pod进程:
如果在pod中定义了preStop hook,在停止pod前会被调用。如果在宽限期过后,preStop hook依然在运行,第二步会再增加2秒的宽限期;
向Pod中的进程发送TERM信号;
跟第三步同时,该Pod将从该service的端点列表中删除,不再是replication controller的一部分。关闭的慢的pod将继续处理load balancer转发的流量;
过了宽限期后,将向Pod中依然运行的进程发送SIGKILL信号而杀掉进程。
Kublete会在API server中完成Pod的的删除,通过将优雅周期设置为0(立即删除)。Pod在API中消失,并且在客户端也不可见。
删除宽限期默认是30秒。 kubectl delete
命令支持 —grace-period=>
选项,允许用户设置自己的宽限期。如果设置为0将强制删除pod。在kubectl>=1.5版本的命令中,你必须同时使用 --force
和 --grace-period=0
来强制删除pod。
Pod的强制删除是通过在集群和etcd中将其定义为删除状态。当执行强制删除命令时,API server不会等待该pod所运行在节点上的kubelet确认,就会立即将该pod从API server中移除,这时就可以创建跟原pod同名的pod了。这时,在节点上的pod会被立即设置为terminating状态,不过在被强制删除之前依然有一小段优雅删除周期。
五、Pause容器
Pause容器,又叫Infra容器。我们检查node节点的时候会发现每个node上都运行了很多的pause容器,例如如下。
[root@k8s-node01 ~]# docker ps |grep pause
0cbf85d4af9e k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_myapp-848b5b879b-ksgnv_default_0af41a40-a771-11e8-84d2-000c2972dc1f_0
d6e4d77960a7 k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_myapp-848b5b879b-5f69p_default_09bc0ba1-a771-11e8-84d2-000c2972dc1f_0
5f7777c55d2a k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_kube-flannel-ds-pgpr7_kube-system_23dc27e3-a5af-11e8-84d2-000c2972dc1f_1
8e56ef2564c2 k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_client2_default_17dad486-a769-11e8-84d2-000c2972dc1f_1
7815c0d69e99 k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_nginx-deploy-5b595999-872c7_default_7e9df9f3-a6b6-11e8-84d2-000c2972dc1f_2
b4e806fa7083 k8s.gcr.io /pause:3.1 " /pause " 7 days ago Up 7 days k8s_POD_kube-proxy-vxckf_kube-system_23dc0141-a5af-11e8-84d2-000c2972dc1f_2
kubernetes中的pause容器主要为每个业务容器提供以下功能:
在pod中担任Linux命名空间共享的基础;
启用pid命名空间,开启init进程。
如图:
[root@k8s-node01 ~]# docker run -d --name pause -p 8880 :80 k8s.gcr.io/pause:3.1
d3057ceb54bc6565d28ded2c33ad2042010be73d76117775c130984c3718d609
[root@k8s -node01 ~]# cat <> nginx.conf
> error_log stderr;
> events { worker_connections 1024 ; }
> http {
> access_log /dev/stdout combined;
> server {
> listen 80 default_server;
> server_name example.com www.example.com;
> location / {
> proxy_pass http:// 127.0.0.1:2368;
> }
> }
> }
> EOF
[root@k8s -node01 ~]# docker run -d --name nginx -v `pwd `/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx
d04f848b7386109085ee350ebb81103e4efc7df8e48da18404efb9712f926082
[root@k8s -node01 ~]# docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
332c86a722f71680b76b3072e85228a8d8e9608456c653edd214f06c2a77f112
现在访问http://192.168.56.12:8880/就可以看到ghost博客的界面了。
解析
pause容器将内部的80端口映射到宿主机的8880端口,pause容器在宿主机上设置好了网络namespace后,nginx容器加入到该网络namespace中,我们看到nginx容器启动的时候指定了--net=container:pause
,ghost容器同样加入到了该网络namespace中,这样三个容器就共享了网络,互相之间就可以使用localhost
直接通信,--ipc=contianer:pause --pid=container:pause
就是三个容器处于同一个namespace中,init进程为pause
,这时我们进入到ghost容器中查看进程情况。
[root@k8s -node01 ~]# docker exec -it ghost /bin/bash
root@d3057ceb54bc: /var/lib/ghost# ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1012 4 ? Ss 03 :48 0 :00 /pause
root 6 0.0 0.0 32472 780 ? Ss 03 :53 0 :00 nginx: master process nginx -g daemon off;
systemd + 11 0.0 0.1 32932 1700 ? S 03 :53 0 :00 nginx: worker process
node 12 0.4 7.5 1259816 74868 ? Ssl 04 :00 0 :07 node current/index.js
root 77 0.6 0.1 20240 1896 pts/0 Ss 04 :29 0 :00 /bin/bash
root 82 0.0 0.1 17496 1156 pts/0 R+ 04 :29 0 :00 ps axu
在ghost容器中同时可以看到pause和nginx容器的进程,并且pause容器的PID是1。而在kubernetes中容器的PID=1的进程即为容器本身的业务进程。
六、init容器
Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:
Init 容器总是运行到成功完成为止。
每个 Init 容器都必须在下一个 Init 容器启动之前成功完成。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy
为 Never,它不会重新启动。
七、Pod的生命周期
(1)Pod phase(Pod的相位)
Pod 的 status
在信息保存在 PodStatus 中定义,其中有一个 phase
字段。
Pod 的相位(phase)是 Pod 在其生命周期中的简单宏观概述。该阶段并不是对容器或 Pod 的综合汇总,也不是为了做为综合状态机。
Pod 相位的数量和含义是严格指定的。除了本文档中列举的状态外,不应该再假定 Pod 有其他的 phase
值。
下面是 phase
可能的值:
挂起(Pending) :API Server创建了Pod资源对象并已经存入了etcd中,但是它并未被调度完成,或者仍然处于从仓库下载镜像的过程中。
运行中(Running) :Pod已经被调度到某节点之上,并且所有容器都已经被kubelet创建完成。
成功(Succeeded) :Pod 中的所有容器都被成功终止,并且不会再重启。
失败(Failed) :Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unknown) :因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
下图是Pod的生命周期示意图,从图中可以看到Pod状态的变化。
(2)Pod的创建过程
Pod是Kubernetes的基础单元,了解其创建的过程,更有助于理解系统的运作。
①用户通过kubectl或其他API客户端提交Pod Spec给API Server。
②API Server尝试将Pod对象的相关信息存储到etcd中,等待写入操作完成,API Server返回确认信息到客户端。
③API Server开始反映etcd中的状态变化。
④所有的Kubernetes组件通过"watch"机制跟踪检查API Server上的相关信息变动。
⑤kube-scheduler(调度器)通过其"watcher"检测到API Server创建了新的Pod对象但是没有绑定到任何工作节点。
⑥kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新到API Server。
⑦调度结果新消息由API Server更新到etcd,并且API Server也开始反馈该Pod对象的调度结果。
⑧Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker engine进行启动容器,并将容器的状态结果返回到API Server。
⑨API Server将Pod信息存储到etcd系统中。
⑩在etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。
(3)Pod的状态
Pod 有一个 PodStatus 对象,其中包含一个 PodCondition 数组。 PodCondition 数组的每个元素都有一个 type
字段和一个 status
字段。type
字段是字符串,可能的值有 PodScheduled、Ready、Initialized 和 Unschedulable。status
字段是一个字符串,可能的值有 True、False 和 Unknown。
(4)Pod存活性探测
在pod生命周期中可以做的一些事情。主容器启动前可以完成初始化容器,初始化容器可以有多个,他们是串行执行的,执行完成后就推出了,在主程序刚刚启动的时候可以指定一个post start 主程序启动开始后执行一些操作,在主程序结束前可以指定一个 pre stop 表示主程序结束前执行的一些操作。在程序启动后可以做两类检测 liveness probe(存活性探测) 和 readness probe(就绪性探测) 。如下图:
探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的Handler。其存活性探测的方法有以下三种:
ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
TCPSocketAction: 对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction: 对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。
设置exec探针举例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness -exec
name: liveness -exec
spec:
containers:
- name: liveness-exec-demo
image: busybox
args: [ " /bin/sh " ," -c " ," touch /tmp/healthy;sleep 60;rm -rf /tmp/healthy; " sleep 600 ]
livenessProbe:
exec:
command: [ " test " ," -e " ," /tmp/healthy " ]
上面的资源清单中定义了一个Pod 对象, 基于 busybox 镜像 启动 一个 运行“ touch/ tmp/ healthy; sleep 60; rm- rf/ tmp/ healthy; sleep 600” 命令 的 容器, 此 命令 在 容器 启动 时 创建/ tmp/ healthy 文件, 并于 60 秒 之后 将其 删除。 存活 性 探针 运行“ test -e/ tmp/ healthy” 命令 检查/ tmp/healthy 文件 的 存在 性, 若 文件 存在 则 返回 状态 码 0, 表示 成功 通过 测试。
设置HTTP探针举例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness -http
name: liveness -http
spec:
containers:
- name: liveness-http-demo
image: nginx: 1.12 -alpine
ports:
- name: http
containerPort: 80
lifecycle:
postStart:
exec:
command: [ " /bin/sh " ," -c " ," echo healthy > /usr/share/nginx/html/healthy " ]
livenessProbe:
httpGet:
path: /healthy
port: http
scheme: HTTP
上面 清单 文件 中 定义 的 httpGet 测试 中, 请求 的 资源 路径 为“/ healthy”, 地址 默认 为 Pod IP, 端口 使用 了 容器 中 定义 的 端口 名称 HTTP, 这也 是 明确 为 容器 指明 要 暴露 的 端口 的 用途 之一。
设置TCP探针举例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness -tcp
name: liveness -tcp
spec:
containers:
- name: liveness-tcp-demo
image: nginx: 1.12 -alpine
ports:
- name: http
containerPort: 80
livenessProbe:
tcpSocket:
port: http
上面的资源清单文件,向Pod IP的80/tcp端口发起连接请求,并根据连接建立的状态判断Pod存活状态。
每次探测都将获得以下三种结果之一:
成功:容器通过了诊断。
失败:容器未通过诊断。
未知:诊断失败,因此不会采取任何行动。
Kubelet 可以选择是否执行在容器上运行的两种探针执行和做出反应:
livenessProbe
: 指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success
。
readinessProbe
: 指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure
。如果容器不提供就绪探针,则默认状态为 Success
。
(5)livenessProbe和readinessProbe使用场景
如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活探针; kubelet 将根据 Pod 的restartPolicy
自动执行正确的操作。
如果希望容器在探测失败时被杀死并重新启动,那么请指定一个存活探针,并指定restartPolicy
为 Always 或 OnFailure。
如果要仅在探测成功时才开始向 Pod 发送流量,请指定就绪探针。在这种情况下,就绪探针可能与存活探针相同,但是 spec 中的就绪探针的存在意味着 Pod 将在没有接收到任何流量的情况下启动,并且只有在探针探测成功后才开始接收流量。
如果您希望容器能够自行维护,您可以指定一个就绪探针,该探针检查与存活探针不同的端点。
请注意,如果您只想在 Pod 被删除时能够排除请求,则不一定需要使用就绪探针;在删除 Pod 时,Pod 会自动将自身置于未完成状态,无论就绪探针是否存在。当等待 Pod 中的容器停止时,Pod 仍处于未完成状态。
(6)Pod的重启策略
PodSpec 中有一个 restartPolicy
字段,可能的值为 Always、OnFailure 和 Never 。默认为 Always。 restartPolicy
适用于 Pod 中的所有容器。restartPolicy
仅指通过同一节点上的 kubelet 重新启动容器。失败的容器由 kubelet 以五分钟为上限的指数退避延迟(10秒,20秒,40秒...)重新启动,并在成功执行十分钟后重置。pod一旦绑定到一个节点,Pod 将永远不会重新绑定到另一个节点。
(7)Pod的生命
一般来说,Pod 不会消失,直到人为销毁他们。这可能是一个人或控制器。这个规则的唯一例外是成功或失败的 phase
超过一段时间(由 master 确定)的Pod将过期并被自动销毁。
有三种可用的控制器:
使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure
或 Never
的 Pod。
对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy
为 Always 的 Pod。
提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。
所有这三种类型的控制器都包含一个 PodTemplate。建议创建适当的控制器,让它们来创建 Pod,而不是直接自己创建 Pod。这是因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
如果节点死亡或与集群的其余部分断开连接,则 Kubernetes 将应用一个策略将丢失节点上的所有 Pod 的 phase
设置为 Failed。
(8)livenessProbe解析
[root@k8s-master ~]# kubectl explain pod.spec.containers.livenessProbe
KIND: Pod
VERSION: v1
RESOURCE: livenessProbe
exec command 的方式探测 例如 ps 一个进程
failureThreshold 探测几次失败 才算失败 默认是连续三次
periodSeconds 每次的多长时间探测一次 默认10s
timeoutSeconds 探测超市的秒数 默认1s
initialDelaySeconds 初始化延迟探测,第一次探测的时候,因为主程序未必启动完成
tcpSocket 检测端口的探测
httpGet http请求探测
举个例子:定义一个liveness的pod资源类型,基础镜像为busybox,在busybox这个容器启动后会执行创建/tmp/test的文件啊,并删除,然后等待3600秒。随后定义了存活性探测,方式是以exec的方式执行命令判断/tmp/test是否存在,存在即表示存活,不存在则表示容器已经挂了。
[root@k8s-master ~]# vim liveness.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness -exec-pod
namespace: default
labels:
name: myapp
spec:
containers:
- name: livess-exec
image: busybox:latest
imagePullPolicy: IfNotPresent
command: [ " /bin/sh " ," -c " ," touch /tmp/test; sleep 30; rm -f /tmp/test; sleep 3600 " ]
livenessProbe:
exec:
command: [ " test " ," -e " ," /tmp/test " ]
initialDelaySeconds: 1
periodSeconds: 3
[root@k8s -master ~]# kubectl apply -f lineness.yaml
(9)资源需求和资源限制
在Docker的范畴内,我们知道可以对运行的容器进行请求或消耗的资源进行限制。而在Kubernetes中,也有同样的机制,容器或Pod可以进行申请和消耗的资源就是CPU和内存。CPU属于可压缩型资源,即资源的额度可以按照需求进行收缩。而内存属于不可压缩型资源,对内存的收缩可能会导致无法预知的问题。
资源的隔离目前是属于容器级别,CPU和内存资源的配置需要Pod中的容器spec字段下进行定义。其具体字段,可以使用"requests"进行定义请求的确保资源可用量。也就是说容器的运行可能用不到这样的资源量,但是必须确保有这么多的资源供给。而"limits"是用于限制资源可用的最大值,属于硬限制。
在Kubernetes中,1个单位的CPU相当于虚拟机的1颗虚拟CPU(vCPU)或者是物理机上一个超线程的CPU,它支持分数计量方式,一个核心(1core)相当于1000个微核心(millicores),因此500m相当于是0.5个核心,即二分之一个核心。内存的计量方式也是一样的,默认的单位是字节,也可以使用E、P、T、G、M和K作为单位后缀,或者是Ei、Pi、Ti、Gi、Mi、Ki等形式单位后缀。
资源需求举例:
apiVersion: v1
kind: Pod
metadata:
name: nginx -pod
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: " 128Mi "
cpu: " 200m "
上面的配置清单中,nginx请求的CPU资源大小为200m,这意味着一个CPU核心足以满足nginx以最快的方式运行,其中对内存的期望可用大小为128Mi,实际运行时不一定会用到这么多的资源。考虑到内存的资源类型,在超出指定大小运行时存在会被OOM killer杀死的可能性,于是该请求值属于理想中使用的内存上限。
资源限制举例:
容器的资源需求只是能够确保容器运行时所需要的最少资源量,但是并不会限制其可用的资源上限。当应用程序存在Bug时,也有可能会导致系统资源被长期占用的情况,这就需要另外一个limits属性对容器进行定义资源使用的最大可用量。CPU是属于可压缩资源,可以进行自由地调节。而内存属于硬限制性资源,当进程申请分配超过limit属性定义的内存大小时,该Pod将会被OOM killer杀死。如下:
[root@k8s-master ~]# vim memleak-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: memleak -pod
labels:
app: memleak
spec:
containers:
- name: simmemleak
image: saadali /simmemleak
resources:
requests:
memory: " 64Mi "
cpu: " 1 "
limits:
memory: " 64Mi "
cpu: " 1 "
[root@k8s -master ~]# kubectl apply -f memleak-pod.yaml
pod /memleak-pod created
[root@k8s -master ~]# kubectl get pods -l app=memleak
NAME READY STATUS RESTARTS AGE
memleak -pod 0 /1 OOMKilled 2 12s
[root@k8s -master ~]# kubectl get pods -l app=memleak
NAME READY STATUS RESTARTS AGE
memleak -pod 0 /1 CrashLoopBackOff 2 28s
Pod资源默认的重启策略为Always,在memleak因为内存限制而终止会立即重启,此时该Pod会被OOM killer杀死,在多次重复因为内存资源耗尽重启会触发Kunernetes系统的重启延迟,每次重启的时间会不断拉长,后面看到的Pod的状态通常为"CrashLoopBackOff"。
这里还需要明确的是,在一个Kubernetes集群上,运行的Pod众多,那么当节点都无法满足多个Pod对象的资源使用时,是按照什么样的顺序去终止这些Pod对象呢??
Kubernetes是无法自行去判断的,需要借助于Pod对象的优先级进行判定终止Pod的优先问题。根据Pod对象的requests和limits属性,Kubernetes将Pod对象分为三个服务质量类别:
Guaranteed:每个容器都为CPU和内存资源设置了相同的requests和limits属性的Pod都会自动归属于该类别,属于最高优先级。
Burstable:至少有一个容器设置了CPU或内存资源的requests属性,单不满足Guaranteed类别要求的资源归于该类别,属于中等优先级。
BestEffort:未对任何容器设置requests属性和limits属性的Pod资源,自动归于该类别,属于最低级别。
顾名思义,最低级别,死得越快!
转载于:https://www.cnblogs.com/linuxk/p/9569618.html
你可能感兴趣的:(Kubernetes学习之路(十一)之Pod状态和生命周期管理)
70道Spring Boot面试八股文(答案、分析和深入提问)整理
守护海洋的猫
spring boot 面试 后端 java
1.什么是RESTfulWeb服务?如何在SpringBoot中创建一个RESTfulWeb服务?回答什么是RESTfulWeb服务?RESTfulWeb服务是基于REST(RepresentationalStateTransfer)架构风格构建的网络服务。REST的核心思想是利用HTTP协议的标准方法(如GET、POST、PUT、DELETE等)来操作资源。每个资源在服务中都有一个URI(统一资
图解前馈神经网络(FNN)
Zucker N
深度学习 神经网络 人工智能 深度学习
目录编辑1.前馈神经网络介绍2.网络结构3.模型工作示例4.总结1.前馈神经网络介绍前馈神经网络(FeedforwardNeuralNetwork,FNN)是一种最简单、最经典的神经网络结构,它是人工神经网络的基础形式之一。前馈神经网络是一种信息只沿一个方向传播的神经网络。它由多个神经元(或称为节点)组成,这些神经元被组织成不同的层,包括输入层、隐藏层和输出层。信息从输入层开始,经过一层或多层隐藏
Qt Embedded性能优化详解
HiRuyue
QT
QtEmbedded是挪威公司的图形化界面开发工具QT的嵌入式版本,它通过QTAPI与LinuxI/O以及Framebuffer直接交互,拥有较高的运行效率,而且整体采用面向对象编程,拥有良好地体系架构和编程模式.QtEmbedded和Qt一样,在4.5版本之后提供了三种不同的授权协议GPL,LGPL和Commercial。长久以来,虽然使用QtEmbedded在作开发,但对QtEmbedded的
深入理解 QObject的作用
@hdd
Qt qt
QObject作为Qt库中所有对象的基类,其地位无可替代。几乎Qt框架内的每一个类,无论是负责构建用户界面的QWidget,还是专注于数据处理与呈现的QAbstractItemModel,均直接或间接继承自QObject。这种继承体系赋予Qt类库高度的一致性和可扩展性,使得开发者能够基于统一的接口和特性进行开发,极大地提高了开发效率和代码的可读性。从底层实现来看,QObject内部维护了一套元数据
C 语言文件操作
Hello__nibuhao
c++ c语言
在C语言中,文件操作是通过标准库中的文件输入输出函数来实现的。最常用的文件操作函数包括读取和写入文件的函数。常见的文件操作函数有:1.打开文件:fopen()fopen()函数用于打开一个文件,返回一个文件指针(FILE*),该指针可以用于后续的文件操作。FILE*fopen(constchar*filename,constchar*mode);filename:文件的路径或文件名。mode:打开
三、详细解释:系统管理与监控命令
猫猫虫。
#Linux linux ubuntu
1.ps–查看进程状态用途:显示当前系统的进程状态。语法:ps[选项]常用选项:aux:显示所有用户的进程(详细信息)。-ef:显示所有进程(完整格式)。-u用户名:显示指定用户的进程。输出字段:PID:进程ID。USER:进程所有者。%CPU:CPU占用率。%MEM:内存占用率。COMMAND:启动进程的命令。示例:#查看所有进程的详细信息psaux#查找与Nginx相关的进程psaux|gre
新产品来袭~适用于新能源电力的霍尔传感器
Acrelgq23
自动化 运维
安科瑞电气顾强霍尔电流传感器:由安科瑞(Acrel)生产,用于电流测量和监控,基于霍尔效应原理,适用于电力系统、工业自动化和能源管理等领域。安科瑞霍尔电流传感器AHBC-400SS11-GJ1特点:高精度测量:基于霍尔效应,测量精度高(±0.5%)。非接触式测量:安全性高,安装方便。宽电流测量范围:0-400A(可定制)。多种输出方式:4-20mA、0-5V或数字信号(如RS485)。抗干扰能力强
绿色低碳转型中的多场景有序充电
ACRELKY
物联网 汽车
摘要:公共交通是城市的“动脉”,在城市公交车辆逐渐新能源化的当下,对充电桩资源进行集约化一体化管理,实现充电资源的有效利用;根据电池充放电特性及行车作业计划,制定合理的充电策略是保证城市“动脉”畅通的关键所在。在当今全球气候变化和环境保护的大背景下,推动公交绿色低碳转型已成为城市可持续发展的重要任务。多场景有序充电作为一项创新的技术和管理模式,正为公交绿色低碳转型注入强大动力。关键词:公共交通,一
Python爬虫 +数据采集分析:淘宝商品评论页面数据接口
代码逐梦人
爬虫技能晋升路线 python 爬虫 开发语言
Python爬虫+数据采集分析:淘宝商品评论页面数据接口一、引言在当今数字化商业时代,电商平台的数据蕴含着巨大的价值。淘宝作为全球知名的电商平台,其商品评论数据能反映消费者的真实反馈、偏好和需求,对于商家优化产品、制定营销策略,以及研究人员进行市场分析等都具有重要意义。然而,直接从淘宝商品评论页面采集数据并非易事,淘宝有严格的反爬机制。为了高效、合法地获取这些数据,利用数据接口是一种可行的解决方案
java后端开发day19--学生管理系统升级
元亓亓亓
java后端开发 java 开发语言
(以下内容全部来自上述课程)1.要求及思路1.总体框架2.注册3.登录4.忘记密码2.代码1.javabeanpublicclassUser1{privateStringusername;privateStringpassword;privateStringpersonID;privateStringphoneNumber;publicUser1(){}publicUser1(Stringuser
图像处理:模拟色差的生成
何以为皇
图像处理 人工智能
图像处理:模拟色差的实战案例在做瓷砖瑕疵检测的过程中,需要检测色差。但在实际生产环境中,瓷砖色差检测的数据量较少,无法直接获取足够的数据来训练和优化深度学习模型。于是就考虑通过人为生成色差数据的方式来扩充数据集,进行色差的模拟。1.什么是色差?色差(ColorDifference)是指两种颜色之间的视觉差异。在色彩科学中,CIEDE2000是目前最先进的色差计算方法之一。然而,CIEDE1976也
Nginx与API安全:OAuth2与JWT验证的守护神盾
墨瑾轩
一起学学Nginx【一】 nginx 安全 网络
关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣开篇:API安全的奇幻冒险嗨,勇敢的网络安全骑士们!今天我们要一起踏上一段保卫API安全的奇幻冒险。在这个数字王国中,我们的使命是确保只有合法的勇士才能访问珍贵的数据宝藏。我们将使用强大的Nginx,结合神秘的OAuth2和JWT验证,来铸造我们坚不可摧的守护
041集——选取若干点生成三角网(CAD—C#二次开发入门)
山水CAD筑梦人
CAD C#二次开发 c# 数据库 java
随机生成2000个三维点并生成三角网,效果如下:随机生成20个点,效果如下:附部分代码如下:publicclassNTS三角网{publicstaticintnumPoints=20;[CommandMethod("xx")]publicvoid在NTSdemo(){//获取当前文档和编辑器Documentdoc=Application.DocumentManager.MdiActiveDocum
随想录Day 64| 图论part01
转行中的小石头
图论 深度优先 算法 数据结构 leetcode c++
随想录Day64|图论part01深度搜索广度搜索98所有可达路径题目描述给定一个有n个节点的有向无环图,节点编号从1到n。请编写一个函数,找出并返回所有从节点1到节点n的路径。每条路径应以节点编号的列表形式表示。输入描述第一行包含两个整数N,M,表示图中拥有N个节点,M条边后续M行,每行包含两个整数s和t,表示图中的s节点与t节点中有一条路径输出描述输出所有的可达路径,路径中所有节点之间空格隔开
掌握 ElasticSearch 精准查询:Term Query 与 Filter 详解
全端工程师
elasticsearch elasticsearch 大数据 搜索引擎
掌握ElasticSearch精准查询:TermQuery与Filter详解一、引言(Introduction)二、准备工作:创建索引和添加示例数据三、TermQuery:精准匹配3.1`term`查询:单个值的精准匹配3.2`terms`查询:多个值的精准匹配3.3`term`vs.`match_phrase`四、Filter:高效过滤4.1什么是Filter?4.2Queryvs.Filter
如何在 Hugging Face 上下载和使用模型—全面指南
Hello.Reader
人工智能 python语言 运维 人工智能 机器学习 ai
1.引言在自然语言处理(NLP)领域,HuggingFace已成为一个不可忽视的平台。无论你是从事学术研究还是在工业中应用NLP技术,HuggingFace都为你提供了丰富的预训练模型和工具库,这些资源大大加速了NLP任务的开发和部署。HuggingFace提供的模型库涵盖了从文本分类到文本生成、从机器翻译到问答系统等各种NLP任务。这些模型大多是由社区贡献并经过大规模数据训练的,使用它们可以帮助
双指针专题4:区间最大和
williamzhou_2013
算法 c++ 双指针
描述给定n个正整数组成的数列a1,a2,⋅⋅⋅,an和一个整数m。求出这个数列中的一个子区间[i,j],也就是在这个数列中连续的数字使得这个子区间的和在不超过m的情况下最大。如果有多个区间符合要求,请输出最靠前的那一个区间。输入描述输入共两行。第一行,两个整数n,m;第二行,n个整数a输出描述一行,三个整数,表示符合题意的区间的左端点、右端点和累加和。解释一个样例:mx=-1,l1=-1,r1=-
变形的宽搜 育才官网 HN036 涂色游戏
williamzhou_2013
算法 宽度优先 c++
描述李老师喜欢玩一种涂色游戏:一个由n × n个单元格组成的白色格子纸,按照事先给定的m次操作,一个接一个地把白色单元格涂黑,总共在纸上涂m个不同的单元格。李老师想知道,在涂黑的过程中,要出现一个边长为3的黑色方块,需要进行多少次操作?输入描述第一行包含两个整数n和m(1 ≤ n ≤ 1000,分别表示方格纸的大小和操作次数)然后,m行包含操作的描述。第i行包含两个整数xi,yi(1 ≤ xi,
股指期货套利例子(金融期货套利的例子)
v527209157
区块链
股指期货套利是什么意思,怎么才可以股指期货套利?楼上的朋友都说的太复杂。。。我通俗一点说吧。。股指期货套利有几种套发。1。股指期货跨月套利,比方说,多12月合约,空10月合约,认为股指期货合约之间价差不合理,价差偏大或者是偏小,认为价差日后将会回归理性,做套利。2。股指期货期现套利:方法1:股指期货和基金套利,跟etf或者是指数型基金,或者其他股票型基金套利,认为股指期货价格偏高,而实际基金价格偏
安全面试2
白初&
面试题目总结 面试 职场和发展
文章目录简单描述一下什么是水平越权,什么是垂直越权,我要发现这两类漏洞,那我代码审计要注意什么地方水平越权:垂直越权:水平越权漏洞的审计重点垂直越权漏洞的审计重点解释一下ssrf漏洞原理攻击场景修复方法横向移动提权win权限提升Linux权限提升include和require区别绕waf的常见姿势log4g有哪些混淆绕过的方法文件上传绕过XSS绕过内存马常见实现方式:内存马的特点内存马的检测简单描
实战:用Spring Boot构建电商系统中的API接口
AI天才研究院
Python实战 自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
作者:禅与计算机程序设计艺术1.简介1998年,在经历了无数的创新革命之后,互联网成为科技界最重要的分支之一。随着时间的推移,互联网已经成为人类信息化革命的源头。如今的电子商务网站数量达到数百亿,这些网站都具有大规模的用户群体、丰富的内容、高频的交易、海量数据等特征。电商行业近几年有了很多变革,比如大数据分析、物流管理、供应链管理、订单评价、信用卡支付等等。其中API接口开发对于电商系统而言尤其重
创新思维培养:激发团队创造力的方法
AI天才研究院
计算 ChatGPT DeepSeek R1 & 大数据AI人工智能大模型 java python javascript kotlin golang 架构 人工智能 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM 系统架构设计 软件哲学 Agent 程序员实现财富自由
引言创新思维的重要性在当今快速变化且竞争激烈的商业环境中,创新思维已经成为企业持续发展和竞争力的关键因素。创新不仅仅体现在产品和服务上,还渗透到了管理、运营和营销等多个方面。创新思维是一种能够帮助个体和团队在既定框架内突破限制、发现问题、提出解决方案的能力。《创新思维培养:激发团队创造力的方法》这本书正是为了帮助读者理解和掌握这一关键能力而编写的。它旨在探讨创新思维的理论基础、实践应用以及培养策略
JWT令牌认证介绍及安全风险
墨痕诉清风
渗透常识研究 web安全 安全
目录1.JWT认证介绍2.为什么使用的JWT认证,而不是Session认证?2.1基于传统的Session认证3.JWT认证流程4.JWT的结构4.1名词解释4.2JWT组成JWT第一部分:标头HeaderJWT第二部分:有效载荷PayloadJWT第三部分:签名Signature5.JWT的使用6.封装Jwt工具类JavaKotlin7.案例:用户登录和退出登录8.关于JWT认证的安全漏洞8.1
蓝桥杯专题之递归+dfs+bfs篇
胃口很大的一条小蛇仔
dfs bfs 算法
题目列表:2013年:第39级台阶2014年:李白打酒,地宫取宝2015年:牌型种数2016年:方格填数,剪邮票2018年:全球变暖2019年:迷宫2020年:走方格,七段码2022年模拟赛:2021变1的最短操作数2022年第一次模拟赛:15级台阶2022年国赛:扩散1.第39级台阶小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着
什么是 QGraphicsWidget 和 QGraphicsScene ?
七贤岭双花红棍
Qt Charts 小课堂 qt
QGraphicsWidget和QGraphicsScene是Qt框架中用于构建复杂2D图形界面的核心类,属于GraphicsViewFramework的一部分。它们提供了强大的功能来管理、显示和交互复杂的图形元素。1.QGraphicsSceneQGraphicsScene是一个场景类,用于管理多个图形项(QGraphicsItem或其子类)。它充当了一个容器,负责管理所有图形项的布局、事件处理
QChart Class Reference
七贤岭双花红棍
Qt Charts 小课堂 qt
QChart是Qt框架中用于绘制图表的类,属于QtCharts模块。它提供了一种简单而强大的方式来创建各种类型的图表,如折线图、柱状图、饼图、散点图等。QChart可以与QChartView结合使用,将图表嵌入到应用程序的GUI中。QChart的核心功能多种图表类型:支持折线图、柱状图、饼图、散点图、面积图等多种图表类型。数据管理:通过QAbstractSeries的子类(如QLineSeries
End-to-End Object Detection with Transformers
M1kk0
目标检测 计算机视觉 神经网络
End-to-EndObjectDetectionwithTransformers会议:2020ECCV论文:https://arxiv.org/abs/2005.12872代码:https://github.com/facebookresearch/detr创新点:\作者摒弃了基于anchor、NMS等这种需要手工设计的模块,和R-CNN系列、YOLO系列,以及其他anchor-free的方法都
error: conversion to non-scalar type requested。请求转换为非标量类型
逻各斯
c语言 c++
非标量类型和标量类型是无法相互转换的(貌似)什么是标量,什么是非标量?标量类型就是没法再细分的变量,比如指针变量、int变量等。非标量类型就是可以再细分的变量,比如struct类型、类,这些都有成员变量,是可再细分的
云计算管理工具有哪些?
qfyangsheng
虚拟机要运行在虚拟机软件里,而虚拟机软件运行在物理机上。一台物理机通过虚拟机软件可以虚拟出多个虚拟机,虚拟机里再安装Windows或者Linux操作系统及各种应用软件,然后用户通过远程桌面等方式连接到虚拟机并使用虚拟机中的应用软件。如果一个云中心只有一台物理机,那么只要一个虚拟机软件即可,到此一个最小的准云端就创建完成了。云端最核心的部分就是虚拟化软件、中央存储设备和虚拟机管理工具(有的人喜欢称云
Linux云计算运维有前景吗?
老男孩IT教育
linux 服务器
伴随着云计算技术的发展,越来越多的企业和组织开始使用云服务来部署和运行他们的应用程序和服务,因此对云计算技术人才的需求量也持续增长,那么Linux云计算运维有前景吗?这应该是很多人关心的问题,我们来探讨一下。综合情况来讲,Linux云计算运维的前景非常广阔。随着云计算和大数据技术的快速发展,Linux作为云计算领域的主流操作系统,其重要性日益凸显,越来越多的企业和组织将其IT基础设施迁移上云,以提
安装数据库首次应用
Array_06
java oracle sql
可是为什么再一次失败之后就变成直接跳过那个要求
enter full pathname of java.exe的界面
这个java.exe是你的Oracle 11g安装目录中例如:【F:\app\chen\product\11.2.0\dbhome_1\jdk\jre\bin】下的java.exe 。不是你的电脑安装的java jdk下的java.exe!
注意第一次,使用SQL D
Weblogic Server Console密码修改和遗忘解决方法
bijian1013
Welogic
在工作中一同事将Weblogic的console的密码忘记了,通过网上查询资料解决,实践整理了一下。
一.修改Console密码
打开weblogic控制台,安全领域 --> myrealm -->&n
IllegalStateException: Cannot forward a response that is already committed
Cwind
java Servlets
对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。 示例代码:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // Thi
基于流的装饰设计模式
木zi_鸣
设计模式
当想要对已有类的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。
自定义的类成为装饰类
模仿BufferedReader,对Reader进行包装,体现装饰设计模式
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象功能,提供更强的功能。
装饰模式比继承灵活,避免继承臃肿,降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能该
Linux中的uniq命令
被触发
linux
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行。在正常情 况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如 果输入文件用“- ”表示,则从标准输入读取。
AD:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个
正则表达式Pattern
肆无忌惮_
Pattern
正则表达式是符合一定规则的表达式,用来专门操作字符串,对字符创进行匹配,切割,替换,获取。
例如,我们需要对QQ号码格式进行检验
规则是长度6~12位 不能0开头 只能是数字,我们可以一位一位进行比较,利用parseLong进行判断,或者是用正则表达式来匹配[1-9][0-9]{4,14} 或者 [1-9]\d{4,14}
&nbs
Oracle高级查询之OVER (PARTITION BY ..)
知了ing
oracle sql
一、rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句:
select e.ename, e.job, e.sal, e.deptno
from scott.emp e,
(se
Python调试
矮蛋蛋
python pdb
原文地址:
http://blog.csdn.net/xuyuefei1988/article/details/19399137
1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:
IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:
http://www.ibm.com/d
webservice传递自定义对象时函数为空,以及boolean不对应的问题
alleni123
webservice
今天在客户端调用方法
NodeStatus status=iservice.getNodeStatus().
结果NodeStatus的属性都是null。
进行debug之后,发现服务器端返回的确实是有值的对象。
后来发现原来是因为在客户端,NodeStatus的setter全部被我删除了。
本来是因为逻辑上不需要在客户端使用setter, 结果改了之后竟然不能获取带属性值的
java如何干掉指针,又如何巧妙的通过引用来操作指针————>说的就是java指针
百合不是茶
C语言的强大在于可以直接操作指针的地址,通过改变指针的地址指向来达到更改地址的目的,又是由于c语言的指针过于强大,初学者很难掌握, java的出现解决了c,c++中指针的问题 java将指针封装在底层,开发人员是不能够去操作指针的地址,但是可以通过引用来间接的操作:
定义一个指针p来指向a的地址(&是地址符号):
Eclipse打不开,提示“An error has occurred.See the log file ***/.log”
bijian1013
eclipse
打开eclipse工作目录的\.metadata\.log文件,发现如下错误:
!ENTRY org.eclipse.osgi 4 0 2012-09-10 09:28:57.139
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContai
spring aop实例annotation方法实现
bijian1013
java spring AOP annotation
在spring aop实例中我们通过配置xml文件来实现AOP,这里学习使用annotation来实现,使用annotation其实就是指明具体的aspect,pointcut和advice。1.申明一个切面(用一个类来实现)在这个切面里,包括了advice和pointcut
AdviceMethods.jav
[Velocity一]Velocity语法基础入门
bit1129
velocity
用户和开发人员参考文档
http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html
注释
1.行级注释##
2.多行注释#* *#
变量定义
使用$开头的字符串是变量定义,例如$var1, $var2,
赋值
使用#set为变量赋值,例
【Kafka十一】关于Kafka的副本管理
bit1129
kafka
1. 关于request.required.acks
request.required.acks控制者Producer写请求的什么时候可以确认写成功,默认是0,
0表示即不进行确认即返回。
1表示Leader写成功即返回,此时还没有进行写数据同步到其它Follower Partition中
-1表示根据指定的最少Partition确认后才返回,这个在
Th
lua统计nginx内部变量数据
ronin47
lua nginx 统计
server {
listen 80;
server_name photo.domain.com;
location /{set $str $uri;
content_by_lua '
local url = ngx.var.uri
local res = ngx.location.capture(
java-11.二叉树中节点的最大距离
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class MaxLenInBinTree {
/*
a. 1
/ \
2 3
/ \ / \
4 5 6 7
max=4 pass "root"
Netty源码学习-ReadTimeoutHandler
bylijinnan
java netty
ReadTimeoutHandler的实现思路:
开启一个定时任务,如果在指定时间内没有接收到消息,则抛出ReadTimeoutException
这个异常的捕获,在开发中,交给跟在ReadTimeoutHandler后面的ChannelHandler,例如
private final ChannelHandler timeoutHandler =
new ReadTim
jquery验证上传文件样式及大小(好用)
cngolon
文件上传 jquery验证
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="jquery1.8/jquery-1.8.0.
浏览器兼容【转】
cuishikuan
css 浏览器 IE
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
碰到频率:100%
解决方案:CSS里 *{margin:0;padding:0;}
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
daizj
shell $# $? 特殊变量
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
$echo $$
运行结果
29949
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个
程序设计KISS 原则-------KEEP IT SIMPLE, STUPID!
dcj3sjt126com
unix
翻到一本书,讲到编程一般原则是kiss:Keep It Simple, Stupid.对这个原则深有体会,其实不仅编程如此,而且系统架构也是如此。
KEEP IT SIMPLE, STUPID! 编写只做一件事情,并且要做好的程序;编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口。这就是UNIX哲学.所有的哲学真 正的浓缩为一个铁一样的定律,高明的工程师的神圣的“KISS 原
android Activity间List传值
dcj3sjt126com
Activity
第一个Activity:
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import a
tomcat 设置java虚拟机内存
eksliang
tomcat 内存设置
转载请出自出处:http://eksliang.iteye.com/blog/2117772
http://eksliang.iteye.com/
常见的内存溢出有以下两种:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
------------
Android 数据库事务处理
gqdy365
android
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。事
Java 打开浏览器
hw1287789687
打开网址 open浏览器 open browser 打开url 打开浏览器
使用java 语言如何打开浏览器呢?
我们先研究下在cmd窗口中,如何打开网址
使用IE 打开
D:\software\bin>cmd /c start iexplore http://hw1287789687.iteye.com/blog/2153709
使用火狐打开
D:\software\bin>cmd /c start firefox http://hw1287789
ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
justjavac
chrome Google google api chrome插件
Chrome Web Store 安装地址: https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice
由于众所周知的原因,只需替换一个域名就可以继续使用Google提供的前端公共库了。 同样,通过script标记引用这些资源,让网站访问速度瞬间提速吧
进程VS.线程
m635674608
线程
资料来源:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 2、IIS服务器默认采用多线程模式 3、多进程优缺点 优点:
多进程模式最大
Linux下安装MemCached
字符串
memcached
前提准备:1. MemCached目前最新版本为:1.4.22,可以从官网下载到。2. MemCached依赖libevent,因此在安装MemCached之前需要先安装libevent。2.1 运行下面命令,查看系统是否已安装libevent。[root@SecurityCheck ~]# rpm -qa|grep libevent libevent-headers-1.4.13-4.el6.n
java设计模式之--jdk动态代理(实现aop编程)
Supanccy2013
java DAO 设计模式 AOP
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
&
Spring 4.2新特性-对java8默认方法(default method)定义Bean的支持
wiselyman
spring 4
2.1 默认方法(default method)
java8引入了一个default medthod;
用来扩展已有的接口,在对已有接口的使用不产生任何影响的情况下,添加扩展
使用default关键字
Spring 4.2支持加载在默认方法里声明的bean
2.2
将要被声明成bean的类
public class DemoService {