文章目录
1. 资源配额
1. 预留和限制的概念
- 预留:即至少需要的资源,对应于
requestsCpu
和requestsMemory
; - 资源限制:最大资源限制,对应于
limitsCpu
和limitsMemory
;
注:这里提一下个人理解,对于上述2个参数刚接触的时候感觉理解了又不理解,不知道新人是不是也是这种感觉,后来接触多了,感觉这样理解会好一点:requestsXxx
表示必须的资源,在K8S对Pod进行调度时,只有节点上的资源至少满足requestsXxx
的值,那么这个Pod才有可能调度到这些满足需求的节点上,所以很多相关译文上将requestsXxx
翻译为“预留XXX”很到位;而当Pod已经运行在某个节点上时,就没requestsXxx
参数什么事了,最终该Pod可以获得宿主机多少资源取决自身,但不会超过limitsXxx
限制的值。所以可以粗略地理解为requestsXxx
是为了Pod调度,而limitsXxx
是为了遏制Pod对宿主机资源的索取最大限度。K8S对于CPU资源管理的策略分为none
(默认,通过CFS配额 cgroups-control groups)和static
(为节点上具有某些特征的 pod 赋予增强的 CPU 亲和性和独占性,针对配置资源为整数型的POD)
2. 单位的含义
- 内存:常用的单位为
MiB
和Gi
,和常规单位的关系如下为:
1 MiB = 2^20 bytes = 1024 kibibytes = 1048576 bytes(以2为底数)
1 MB = 1000KB(以10为底数)
- CPU:常用单位为毫核(
m
或milli
),或者直接是核(没有单位,如1核直接表示为1
),换算关系为:1个核=1000m,当然也可以使用占比来表示,如:1/4个核=0.25,半个核=0.5,1个整核=1。
注:在rancher中部署应用时,经常遇到deployment does not have minimum availability
异常,此时适当调大资源限额可以解决大部分的问题,下面是Chart模板中常用的配置:
resources:
limits:
memory: {
{
.Values.resources.limits.memory }}
cpu: {
{
.Values.resources.limits.cpu }}
requests:
memory: {
{
.Values.resources.requests.memory }}
cpu: {
{
.Values.resources.requests.cpu }}
2. 关于探针
K8S中的探针应该是必不可少的一部分,参照文档,理了理,探针主要分为2类:
- liveness probe:存活探针,它可以决定何时重启容器,比如存活探针在应用运行过程中遇到死锁(应用确实是正在运行的,但无法获取结果),这种情况往往是由于代码中存在bug,尽管如此,但存活探针的存在可以让应用更加具有可用性;
- readiness probe:就绪探针,它可以决定一个容器何时就绪,准备接受外部的流量。如果说某个Pod已经就绪表示该Pod中的所有容器都已经就绪,当一个Pod处于未就绪的状态,他将会从负载均衡中移除;
实际观测,只有当2类探针同时检测通过,Pod才算启动成功,下面是探针的配置方式:
readinessProbe:
enabled: true
httpGet:
path: "/healthcheck"
port: 8080
periodSeconds: 20
initialDelaySeconds: 60
failureThreshold: 3
livenessProbe:
enabled: true
httpGet:
path: "/healthcheck"
port: 8080
initialDelaySeconds: 180
periodSeconds: 30
failureThreshold: 3
实际开发中,发现后端的Server启动用这套探针没啥问题,但前端的Server(使用node)启动的过程非常不稳定,build和拉取依赖的过程耗时特别长,基本都会重启好几遍容器才能成功,我曾经试图去调节存活探针的initialDelaySeconds
参数,但如果这个过程快的话我岂不是要浪费一些时间,最终发现调节失败的阈值failureThreshold
会更加方便。
具体探针的行为可以有如下的一些:
1.HTTP
java中探针往往都是通过调用类似于go
的HTTP接口,示例:
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
2.具体指令
探针检测的具体行为可以自己定义,比如:
livenessProbe:
exec:
command:
- cat