Q's blog

一些个人文档笔记

k8s上不同服务之间可以通过service的域名来互相访问。域名的解析是一般是通过在集群中的kube-dns来完成有时候,我们希望给运行在k8s上的Pod增加一些域名的解析(例如宿主机的主机名),但操作dns模块也不太方便,那么k8s上有没有想linux主机那样可以直接在host文件设置域名解析呢,容易想到的是,将域名记录到容器镜像的/etc/hosts文件,这样容器运行时就可以正确解析了。然而这样是不行的。k8s会管理这个文件,打到镜像里的文件实际并不会起作用。举个例子。

阅读全文 »

有的时候我们可能希望从 Prometheus 中删除一些不需要的数据指标,或者只是单纯的想要释放一些磁盘空间。Prometheus 中的时间序列只能通过 HTTP API 来进行管理。

阅读全文 »

除了 Kubernetes 核心组件 apiserver、scheduler、controller-manager 之外,还有很多插件必须运行在一个普通的集群节点上。这些插件对于一个功能完备的集群来说是非常关键的,例如 Heapster、DNS 以及 Dashboard 等等。 如果一个关键的插件被移除(类似升级这样具有副作用的其它操作)、或者变成挂起状态(例如当集群利用率过高,或者由于其它原因导致节点上可用资源的总量发生变化)、集群可能会停止正常工作。

为了保证核心组件的运行优先级最大化,就需要用到 CriticalPod,即标记为关键插件,这样就可以保证关键插件的最优先调度,标记为关键插件的方法如下:

  • 1.需要在 apiserver 参数中启用 ExperimentalCriticaPodAnnotation这个 Feature Gate
  • 2.Pod 必须隶属于kube-system 这个 namespace
  • 3.必须加上 scheduler.alpha.kubernetes.io/critical-pod="" 这个 Annotation

早期时候,容器内运行Java应用程序时,Jvm无法感知容器环境存在,所以对容器资源的限制比如内存或者cpu等都无法生效。

原因是容器的资源管理使用了操作系统cgroup机制,但是Jvm无法感知cgroup。

所以可能需要在jvm以及docker中指定两次内存限制。

后来,在Jvm9及以后,Jvm开始了对容器资源限制的支持。在Jvm11中,可以使用-XX:+UseContainerSupport参数来制定Jvm使用容器内存。

另外还有两个参数-XX:InitialRAMPercentage -XX:MaxRAMPercentage来制定Jvm使用容器内存的百分比。

1
2
3
-XX:+UseContainerSupport  #开启容器支持
-XX:InitialRAMPercentage=50 #初始使用百分比
-XX:MaxRAMPercentage=80 #最大使用百分比
1
2
3
jinfo -flags pid  #查看启动参数
jcmd pid VM.flags
jmap -heap pid #jhsdb jmap --heap --pid 1
阅读全文 »

Curl 纯文本格式输出:

1
2
3
4
5
6
7
curl icanhazip.com
curl ifconfig.me
curl curlmyip.com
curl ip.appspot.com
curl ipinfo.io/ip
curl ipecho.net/plain
curl www.trackip.net/i
阅读全文 »

一旦启动探针探测成功之后,就会被livenessProbe接管,以下是1.17支持的三种probe example

阅读全文 »

HPA 控制器与聚合 API 获取到 Pod 性能指标数据之后,基于下面的算法计算出目标 Pod 副本数量,与当前运行的 Pod 副本数量进行对比,决定是否需要进行扩缩容操作:

1
2
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
即当前副本数 * (当前指标值/期望的指标值),将结果向上取整
阅读全文 »

11074

image-20200818164927016

8919

image-20200820233915655

通过eureka测试pod生命周期:

两种情况

一:

1
2
3
4
5
前提:
守护进程pid为1
无lifecycle.preStop
测试结果:
容器可以正常关闭,eureka可以正常摘除

1
2
3
4
5
6
7
8
9
10
11
12
13
前提:
守护进程pid为1
有lifecycle.preStop
lifecycle:
preStop:
exec:
command:
- "sh"
- "-c"
- |
sleep 30
测试结果:
容器无法正常关闭,eureka无法正常摘除

结论:preStop会覆盖pod第一次发送 SIGTERM -15 的信号,需在sleep后kill 1 #存疑:测试过程中会有sleep后SIGTERM 无法关闭应用的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lifecycle:
preStop:
exec:
command:
- bash
- -c
- 'curl -X POST --data DOWN http://127.0.0.1:8080/service-registry/instance-status -H
"Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8";sleep 30'

####### 参数解释
127.0.0.1:8080 #代表eureka地址
service-registry #代表注册中心
DOWN #执行down请求
sleep #等待30秒

curl -v -X DELETE http://192.168.3.34:20001/eureka/apps/MEMBER-SERVER/192.168.3.34:member-server:20021

参考https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/

阅读全文 »
0%