Kubernetes学习之污点
一、认识污点
污点(taints)是定义在节点之上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上除非该Pod对象具有接纳节点污点的容忍度。而容忍度(tolerations)是定义在Pod对象上的键值型属性数据,用于配置其可容忍的节点污点,而且调度器仅能将Pod对象调度至其能够容忍该节点污点的节点之上,如下图所示:
节点选择器(nodeSelector)和节点亲和性(nodeAffinity)两种调度方式都是通过在Pod对象上添加标签选择器来完成对特定类型节点标签的匹配,它们实现的是由Pod选择节点的机制。而污点和容忍度则是通过向节点添加污点信息来控制Pod对象的调度结果,从而赋予了节点控制器何种Pod对象能够调度于其上的主控权。简单来说,节点亲和性使得Pod对象被吸引到一类特定的节点,而污点则相反,它提供了让节点排斥特定Pod对象的能力。
Kubernetes使用PodToleratesNodeTains预选策略和TaintTolerationPriority优选函数来完成此种类型的高级调度机制。
二、定义污点和容忍度
污点定义在节点的nodeSpec中,而容忍度则定义在Pod的podSpec中,它们都是键值型数据,但又都额外支持一个效果(effect)标记,语法格式为"key=value:effect",其中key和value的用法及格式与资源注解信息相似,而effect则用于定义对Pod对象的排斥等级,它主要包含以下三种类型:
NodeSchedule:不能容忍此污点的新Pod对象不可调度至当前节点,数据强制型约束关系,节点上现存的Pod对象不受影响。
PreferNoScheduke:NoSchedule的柔性约束版本,即不能容忍此污点的新Pod对象尽量不要调度至当前节点,不过无其他节点可供调度时也会允许接受相应的Pod对象。节点上现存的Pod对象不受影响。
NoExecute:不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,而且节点上现存的Pod对象因节点污点变动或Pod容忍度变动而不再满足匹配规则时,Pod对象将被驱逐。
在Pod对象上定义容忍度时,它支持两种操作符:一种是等值比较(Equal),表示容忍度与污点必须在key、value和effect三者之上完全匹配;另一种是存在性判断(Exists),表示二者的key和effect必须完全匹配,而容忍度中的value字段要使用空值。
另外,一个节点可以配置使用多个污点,而一个Pod对象也可以由多个容忍度,不过二者在进行匹配检查时应遵循如下逻辑:
1)首先处理每个有着与之匹配的容忍度的污点。
2)对于不能匹配到的污点,如果存在一个污点使用了NoSchedule效用标识,则拒绝调度Pod对象至此节点;若没有任何一个使用了NoSchedule效用标识,但至少有一个使用看PreferNoScheduler,则应该尽量避免将Pod对象调度至此节点。
3)如果至少有一个不匹配的污点使用了NoExecute效用标识,则节点将立即驱逐Pod对象,或者不予调度至给定节点;另外,即便容忍度可以匹配到使用了NoExecute效用标识的污点,若在定义了容忍度时还同时使用了tolerationSeconds属性定义了容忍时限,则超出时限后其也将被节点驱逐。
使用kubeadm部署的Kubernetes集群,其Master节点将自动添加污点信息以阻止不能容忍此污点的Pod对象调度至此节点之上,实现反允许Master的相关组件的Pod才能允许与此节点,因此,用户手动创建的未特意添加容忍此污点容忍度的Pod对象将不会被调度至此节点:
]# kubectl describe node master
Name: master
Roles: master
Labels: beta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=masterkubernetes.io/os=linuxnode-role.kubernetes.io/master=
Annotations: flannel.alpha.coreos.com/backend-data: {"VtepMAC":"8a:cc:22:e3:28:53"}flannel.alpha.coreos.com/backend-type: vxlanflannel.alpha.coreos.com/kube-subnet-manager: trueflannel.alpha.coreos.com/public-ip: 172.16.2.200kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.socknode.alpha.kubernetes.io/ttl: 0volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Wed, 15 Jul 2020 16:26:00 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
Lease:HolderIdentity: masterAcquireTime: <unset>RenewTime: Tue, 22 Sep 2020 09:49:42 +0800
Conditions:Type Status LastHeartbeatTime LastTransitionTime Reason Message---- ------ ----------------- ------------------ ------ -------NetworkUnavailable False Tue, 22 Sep 2020 09:47:34 +0800 Tue, 22 Sep 2020 09:47:34 +0800 FlannelIsUp Flannel is running on this nodeMemoryPressure False Tue, 22 Sep 2020 09:47:21 +0800 Wed, 15 Jul 2020 16:25:59 +0800 KubeletHasSufficientMemory kubelet has sufficient memory availableDiskPressure False Tue, 22 Sep 2020 09:47:21 +0800 Wed, 15 Jul 2020 16:25:59 +0800 KubeletHasNoDiskPressure kubelet has no disk pressurePIDPressure False Tue, 22 Sep 2020 09:47:21 +0800 Wed, 15 Jul 2020 16:25:59 +0800 KubeletHasSufficientPID kubelet has sufficient PID availableReady True Tue, 22 Sep 2020 09:47:21 +0800 Wed, 15 Jul 2020 17:16:52 +0800 KubeletReady kubelet is posting ready status
Addresses:InternalIP: 172.16.2.200Hostname: master
Capacity:cpu: 4ephemeral-storage: 51175Mihugepages-1Gi: 0hugepages-2Mi: 0memory: 7990076Kipods: 110
Allocatable:cpu: 4ephemeral-storage: 48294789041hugepages-1Gi: 0hugepages-2Mi: 0memory: 7887676Kipods: 110
System Info:Machine ID: edc36d4e55854bb8a47f6baaa3669426System UUID: FA864D56-406F-6A4E-3DAA-42759CDE496ABoot ID: 4d2a5087-67b4-4d5f-a89d-ae3eaa20e0bcKernel Version: 3.10.0-1127.el7.x86_64OS Image: CentOS Linux 7 (Core)Operating System: linuxArchitecture: amd64Container Runtime Version: docker://19.3.12Kubelet Version: v1.18.5Kube-Proxy Version: v1.18.5
PodCIDR: 10.244.0.0/24
PodCIDRs: 10.244.0.0/24
Non-terminated Pods: (13 in total)Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE--------- ---- ------------ ---------- --------------- ------------- ---istio-system grafana-b54bb57b9-hmd5t 10m (0%) 0 (0%) 0 (0%) 0 (0%) 31distio-system istiod-54d84dc79c-5t7xv 10m (0%) 0 (0%) 100Mi (1%) 0 (0%) 34distio-system kiali-d45468dc4-7xgls 10m (0%) 0 (0%) 0 (0%) 0 (0%) 34distio-system prometheus-79fb649b4d-lwtz8 10m (0%) 0 (0%) 0 (0%) 0 (0%) 34dkube-system coredns-66bff467f8-h7rjz 100m (2%) 0 (0%) 70Mi (0%) 170Mi (2%) 68dkube-system coredns-66bff467f8-jvqf8 100m (2%) 0 (0%) 70Mi (0%) 170Mi (2%) 68dkube-system etcd-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 68dkube-system kube-apiserver-master 250m (6%) 0 (0%) 0 (0%) 0 (0%) 68dkube-system kube-controller-manager-master 200m (5%) 0 (0%) 0 (0%) 0 (0%) 68dkube-system kube-flannel-ds-amd64-26qv9 100m (2%) 100m (2%) 50Mi (0%) 50Mi (0%) 68dkube-system kube-proxy-255z5 0 (0%) 0 (0%) 0 (0%) 0 (0%) 68dkube-system kube-scheduler-master 100m (2%) 0 (0%) 0 (0%) 0 (0%) 68dkubernetes-dashboard dashboard-metrics-scraper-779f5454cb-n8rln 0 (0%) 0 (0%) 0 (0%) 0 (0%) 66d
Allocated resources:(Total limits may be over 100 percent, i.e., overcommitted.)Resource Requests Limits-------- -------- ------cpu 890m (22%) 100m (2%)memory 290Mi (3%) 390Mi (5%)ephemeral-storage 0 (0%) 0 (0%)hugepages-1Gi 0 (0%) 0 (0%)hugepages-2Mi 0 (0%) 0 (0%)
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Starting 2m27s kubelet, master Starting kubelet.Normal NodeAllocatableEnforced 2m27s kubelet, master Updated Node Allocatable limit across podsNormal NodeHasSufficientMemory 2m26s (x8 over 2m27s) kubelet, master Node master status is now: NodeHasSufficientMemoryNormal NodeHasNoDiskPressure 2m26s (x8 over 2m27s) kubelet, master Node master status is now: NodeHasNoDiskPressureNormal NodeHasSufficientPID 2m26s (x7 over 2m27s) kubelet, master Node master status is now: NodeHasSufficientPIDNormal Starting 2m15s kube-proxy, master Starting kube-proxy.
.
不过,有一些系统级的应用,如kube-porxy或者kube-flannel等等,都在资源创建时就添加上了相应的容忍度以确保它们被DaemonSet控制器创建时能够调度至Master节点上运行一个实例:
]# kubectl describe pods kube-flannel-ds-amd64-26qv9 -n kube-system
Name: kube-flannel-ds-amd64-26qv9
Namespace: kube-system
Priority: 0
Node: master/172.16.2.200
Start Time: Wed, 15 Jul 2020 18:04:28 +0800
Labels: app=flannelcontroller-revision-hash=56c5465959pod-template-generation=1tier=node
Annotations: <none>
Status: Running
IP: 172.16.2.200
IPs:IP: 172.16.2.200
Controlled By: DaemonSet/kube-flannel-ds-amd64
Init Containers:install-cni:Container ID: docker://b5e12ba497c79bff60c78d3fcff5dce28c25d50dffa4db6af921e2bb6644d68bImage: quay.io/coreos/flannel:v0.12.0-amd64Image ID: docker-pullable://quay.io/coreos/flannel@sha256:6d451d92c921f14bfb38196aacb6e506d4593c5b3c9d40a8b8a2506010dc3e10Port: <none>Host Port: <none>Command:cpArgs:-f/etc/kube-flannel/cni-conf.json/etc/cni/net.d/10-flannel.conflistState: TerminatedReason: CompletedExit Code: 0Started: Tue, 22 Sep 2020 09:47:28 +0800Finished: Tue, 22 Sep 2020 09:47:28 +0800Ready: TrueRestart Count: 16Environment: <none>Mounts:/etc/cni/net.d from cni (rw)/etc/kube-flannel/ from flannel-cfg (rw)/var/run/secrets/kubernetes.io/serviceaccount from flannel-token-7h6kv (ro)
Containers:kube-flannel:Container ID: docker://40143210f311560a1e7181622c573077f959c2635a9eda4e0075bd4d48057056Image: quay.io/coreos/flannel:v0.12.0-amd64Image ID: docker-pullable://quay.io/coreos/flannel@sha256:6d451d92c921f14bfb38196aacb6e506d4593c5b3c9d40a8b8a2506010dc3e10Port: <none>Host Port: <none>Command:/opt/bin/flanneldArgs:--ip-masq--kube-subnet-mgrState: RunningStarted: Tue, 22 Sep 2020 09:47:30 +0800Last State: TerminatedReason: ErrorExit Code: 2Started: Wed, 16 Sep 2020 09:31:15 +0800Finished: Mon, 21 Sep 2020 09:18:05 +0800Ready: TrueRestart Count: 21Limits:cpu: 100mmemory: 50MiRequests:cpu: 100mmemory: 50MiEnvironment:POD_NAME: kube-flannel-ds-amd64-26qv9 (v1:metadata.name)POD_NAMESPACE: kube-system (v1:metadata.namespace)Mounts:/etc/kube-flannel/ from flannel-cfg (rw)/run/flannel from run (rw)/var/run/secrets/kubernetes.io/serviceaccount from flannel-token-7h6kv (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:run:Type: HostPath (bare host directory volume)Path: /run/flannelHostPathType: cni:Type: HostPath (bare host directory volume)Path: /etc/cni/net.dHostPathType: flannel-cfg:Type: ConfigMap (a volume populated by a ConfigMap)Name: kube-flannel-cfgOptional: falseflannel-token-7h6kv:Type: Secret (a volume populated by a Secret)SecretName: flannel-token-7h6kvOptional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: :NoSchedulenode.kubernetes.io/disk-pressure:NoSchedulenode.kubernetes.io/memory-pressure:NoSchedulenode.kubernetes.io/network-unavailable:NoSchedulenode.kubernetes.io/not-ready:NoExecutenode.kubernetes.io/pid-pressure:NoSchedulenode.kubernetes.io/unreachable:NoExecutenode.kubernetes.io/unschedulable:NoSchedule
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SandboxChanged 5m56s kubelet, master Pod sandbox changed, it will be killed and re-created.Normal Pulled 5m54s kubelet, master Container image "quay.io/coreos/flannel:v0.12.0-amd64" already present on machineNormal Created 5m54s kubelet, master Created container install-cniNormal Started 5m54s kubelet, master Started container install-cniNormal Pulled 5m53s kubelet, master Container image "quay.io/coreos/flannel:v0.12.0-amd64" already present on machineNormal Created 5m53s kubelet, master Created container kube-flannelNormal Started 5m52s kubelet, master Started container kube-flannel
.
这类Pod也是构成Kubernetes系统的基础且关键性的组件,它们甚至还定义了更大的容忍度。这上面某kube-flannel实例的容忍度定义来看,它还能容忍那些报告了磁盘压力或内存压力的节点,以及未就绪的节点和不可达的节点,以确保它们能在任何状态下正常调度至集群节点上运行。
三、管理节点上的污点
任何符合其键值规范要求的字符串均可以用于定义污点信息:仅可使用字母、数字、连线符、点号和下划线。且仅能以字母或数字开头,其中键名的长度上限为253个字符,值最长为63个字符。实践中,污点通常用于描述具体的部署规划,它们的键名形如node-type、node-role、node-project或node-geo等等,因此还可以在必要时带上域名以描述其额外的信息,如node-type.ilinux.io等等。使用"kubectl taint"命令即可向节点添加污点,命令的语法格式如下:
kubectl taint nodes <node-name> <key>=<value>:<effect> ...
1)为node1节点打污点
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 1 11s 10.244.1.153 node1 <none> <none>]# kubectl taint nodes node1 node-type=production:NoSchedule
node/node1 tainted
2)查看污点信息并查看之前的Pod是否受影响
# kubectl get nodes node1 -o go-template={{.spec.taints}}
[map[effect:NoSchedule key:node-type value:production]]]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 1 11s 10.244.1.153 node1 <none> <none>
此时可以看到,node1上已有的Pod对象不受影响,但是新创建的Pod若是不能容忍此污点将不能再被调度至此节点上。
3)更换Node1上的污点标识
]# kubectl taint nodes node1 node-type=production:PreferNoSchedule
node/node1 tainted]# kubectl get nodes node1 -o go-template={{.spec.taints}}
[map[effect:PreferNoSchedule key:node-type value:production] map[effect:NoSchedule key:node-type value:production]]
可以看到,对同一个节点再打上污点,即便是同一个键值数据,若其效用标识不同,则其也分属于不同的污点信息。
4)运行一个测试Pod查看是否可以调度至Node1上
]# kubectl apply -f pod-demo.yaml
pod/pod-demo created]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 8s 10.244.2.98 node2 <none> <none>
可以看到,新创建的Pod对象由于没有添加污点容忍度,所以不会再调度至Node1上了
5)对Node2打上NoExecute标识的污点
]# kubectl taint nodes node2 node-type=dev:NoExecute
node/node2 tainted]# kubectl get nodes node2 -o go-template={{.spec.taints}}
[map[effect:NoExecute key:node-type value:dev]]]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 0/2 Terminating 4 2m30s 10.244.2.98 node2 <none> <none>
可以看到,由于Node2节点上的标识是NoExecute,所以Pod对象会被驱逐走,不会在Node2节点上运行,但是又没有定义容忍度,所以无法被调度,只能退出。
6)删除Node2上标识为"NoExecute"的污点
]# kubectl taint nodes node2 node-type=dev:NoExecute-
node/node2 untainted]# kubectl get nodes node2 -o go-template={{.spec.taints}}
<no value>
7)删除指定键名的所有污点
]# kubectl taint nodes node1 node-type-
node/node1 untainted]# kubectl get nodes node1 -o go-template={{.spec.taints}}
<no value>
8)删除节点上的全部污点信息
]# kubectl patch nodes node1 -p '{"spec":{"taints":[]}}'
node/node1 patched]# kubectl get nodes node1 -o go-template={{.spec.taints}}
<no value>
四、Pod对象的容忍度
Pod对象的容忍度可通过其spec.tolerations字段进行添加,根据使用的操作符不同,主要有两种可用的形式:一种是与污点信息完全匹配的等值关系;另一种是判断污点信息存在性的匹配方式。
1)给集群节点打上污点
]# kubectl taint nodes node1 node-type=production:PreferNoSchedule
node/node1 tainted]# kubectl taint nodes node2 node-role=node2:PreferNoSchedule
node/node2 tainted
2)创建Pod对象并定义Equal的容忍度
]# cat toleratins-pods-equal.yaml
apiVersion: v1
kind: Pod
metadata: name: pod-demonamespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1- name: test-podimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresenttolerations:- key: "node-type"operator: "Equal"value: "Production"effect: "NoExecute"tolerationSeconds: 3600]# kubectl apply -f toleratins-pods.yaml
pod/pod-demo created
3)查看Pod对象的调度运行信息
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 1 6s 10.244.1.154 node1 <none> <none>
可以看到,由于此Pod定义了接受node-type=production的污点容忍度,所以该Pod对象可容忍Node1上的污点,所以可以在Node上运行。
4)创建Pod对象并定义Exists的容忍度
]# cat toleratins-pods-exists.yaml
apiVersion: v1
kind: Pod
metadata: name: pod-demo-2namespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: ikubernetes/myapp:v1- name: test-pod-2image: ikubernetes/myapp:v1imagePullPolicy: IfNotPresenttolerations:- key: "node-role"operator: "Exists"effect: "NoExecute"tolerationSeconds: 3600]# kubectl apply -f toleratins-pods-exists.yaml
pod/pod-demo-2 created
5)查看Pod对象的调度运行信息
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo-2 2/2 Running 0 5s 10.244.1.158 node2 <none> <none>
.
可以看到由于Node2上定义了node-role的键值对污点,并且pod-demo-2对象上定义了此键值对的容忍度,所以Pod对象被成功调度至Node2节点之上了。
实践中,若集群中的一组机器专门用于为运行非生产型的容器应用而备置,而且它们可能随时按需上下线,那么就应该为其添加污点信息,以确保仅那些能容忍污点的非生产型Pod对象可以调度其上。另外,某些有着特殊硬件的节点需要专门用于运行一类有着此类硬件资源需求的Pod对象时,例如,那些有着SSD或GPU的设备,也应该为其添加污点信息以排除其他的Pod对象。
五、问题节点标识
Kubernetes自1.6版本起支持使用污点自动标识问题节点,它通过节点控制器在特定条件下自动为节点添加污点信息实现。它们都使用NoExecute效用标识,因此不能容忍此类污点的现有Pod对象也会遭到驱逐。目前,内建使用的此类污点包含如下几个:
node.kubernetes.io/not-ready:节点进入"NotReady"状态时被自动添加的污点。
node.alpha.kubernetes.io/unreachable:节点进入"NotReachable"状态时被自动添加的污点。
node.kubernetes.io/out-of-disk:节点进入"OutOfDisk"状态时被自动添加的污点。
node.kubernetes.io/memory-pressure:节点内存资源面临压力。
node.kubernetes.io/network-unavailable:节点网络不可用。
node.cloudprovider.kubernetes.io/uninitialized:kubelet由外部的云环境程序启动时,它将自动为节点添加此污点,待到云控制器管理器中的控制器初始化此节点时再将其删除。
不过,Kubernetes的核心组件通常都要容忍此类的污点,以确保其相应的DaemonSet控制器能够无视此类污点,于节点上部署相应的关键性Pod对象,例如kube-proxy或kube-flannel等等。
Kubernetes学习之污点相关推荐
- kubernetes 学习记录
Kubernetes 学习记录 一.`kubernetes` 入门学习 1.1 部署第一个 `Deployment` 1.2 查看资源的命令 1.3 发布应用程序 1.3.1 暴漏服务的三种模式 1. ...
- Kubernetes学习笔记
Kubernetes学习笔记 1.简介 用于自动部署.扩缩和管理容器化应用程序的开源系统,支持自动化部署.大规模可伸缩. 2.架构 2.1.Control Plane 对集群做出全局决策 Contro ...
- Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像
文章目录 Docker的安装 Docker的使用:docker run命令 查看本地存在的镜像:docker images命令 编写Dockerfile,制作容器镜像 docker build制作镜像 ...
- Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用
Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 第五讲05 | 白话容器基础(一):从进程说开去和第六讲06 | ...
- Kubernetes学习笔记一:Docker和Kubernetes的诞生
Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 里面的01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐到04 ...
- Kubernetes学习笔记(一)
2019独角兽企业重金招聘Python工程师标准>>> Kubernetes学习笔记(一) 博客分类: Kubernetes 导语 2015年4月,传闻已久的Borg论文伴随Kube ...
- kubernetes学习笔记 (二):k8s初体验
本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建 搭建本地Docker镜像仓库 docker pull docke ...
- Kubernetes学习笔记之Calico CNI Plugin源码解析(一)
女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...
- Kubernetes 学习总结(19)—— Kubernetes 集群管理平台如何选择?Rancher vs KubeSphere
前言 Kubernetes(K8s)集群管理平台都是基于 Kubernetes 提供功能,可以说他们是在 K8s 的基础上封装了一层更为友好的操作方式.他们都是为了降低 k8s 集群运维复杂度,降低运 ...
- Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群
一.问题分析 本质上来说在 k8s 上部署一个 redis 集群和部署一个普通应用没有什么太大的区别,但需要注意下面几个问题: Redis 是一个有状态应用:这是部署 redis 集群时我们最需要注意 ...
最新文章
- springboot + 拦截器 + 注解 实现自定义权限验证
- 笔记本怎么桌面显示计算机,笔记本电脑桌面不显示了如何解决
- html5 video js控制摄像头的焦距,html 通过input video canvas 打开摄像头 定制相机
- GDCM:尝试修复损坏的J2K / DICOM的测试程序
- SQL Server 2005 高级程序设计 学习笔记(2)
- 大学计算机网络期末重点,中南大学计算机网络期末复习重点
- Django、Flask、Tornado的区别
- 全面的SVM理论讲解
- cass小插件集合_CASS插件合集 - 下载 - 搜珍网
- 三防漆——选型及验证
- 参考文献外国名字写法
- WPF遍历视觉树与逻辑树
- R语言如何绘制PCoA主坐标分析(30)
- 给Android新手的六条建议,听说安卓不火了?
- 数据库中几个基本概念 主码 外码
- HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)
- sql server 按拼音分类排序的功能
- 大数据项目离线数仓(全 )二(数仓系统)
- 神了!阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南
- ARP是什么?+ARP欺骗 MAC为ff:ff:ff:ff:ff:ff是什么意思
热门文章
- Python模拟用户自动登陆网易126邮箱
- python代码变成so
- matlab 光斑质心算法,高精度光斑中心定位算法
- 可视化常见绘图(四)柱状图
- mysql batch insert_使用batch insert解决MySQL的insert吞吐量问题
- 基于STM32F103+涂鸦三明治的宠物自动喂食器
- html css3滤镜,CSS滤镜之Glow属性_css
- php网站banner图片切换,最简单的Banner轮播左右切换效果代码及实现思路(附带源码)...
- sobol灵敏度分析matlab_灵敏度分析_使用MATLAB编写.doc
- Infor宣布首次公开募股