<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.sanxian.tech/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>三线的随记 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sanxian.tech/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Admin"/>
	<updated>2026-04-09T11:07:10Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E5%8C%96freessl-acme.sh%E6%9B%B4%E6%96%B0nginx%E5%AE%9E%E7%8E%B0https%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F&amp;diff=1694</id>
		<title>容器化freessl-acme.sh更新nginx实现https证书自动续期</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E5%8C%96freessl-acme.sh%E6%9B%B4%E6%96%B0nginx%E5%AE%9E%E7%8E%B0https%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F&amp;diff=1694"/>
		<updated>2026-04-09T09:19:51Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''⚠️ 注意：freessl目前acme地址已经更改为litessl.com。下述内容并没有跟进此更新，仅供参考'''&lt;br /&gt;
&lt;br /&gt;
=== 赘述 ===&lt;br /&gt;
由于有一定的OS环境洁癖，所以不打算直接在Linux OS环境中直接安装acme.sh，采用容器化的方式安装acme.sh&lt;br /&gt;
&lt;br /&gt;
acme.sh官方其实有做好的docker images,但是由于太闲了所以又重新写了一份(班门弄斧)&lt;br /&gt;
&lt;br /&gt;
=== 正题1: 制作能自签域名证书的镜像 ===&lt;br /&gt;
先构建一个带有 acme.sh 基础镜像&lt;br /&gt;
 cat &amp;lt;&amp;lt;\EOF &amp;gt; acme.sh.Dockerfile&lt;br /&gt;
 FROM alpine:3.15.3&lt;br /&gt;
 RUN apk --no-cache add curl wget openssl &amp;amp;&amp;amp; \&lt;br /&gt;
     rm -rf /var/cache/apk &amp;amp;&amp;amp; \&lt;br /&gt;
     curl -s &amp;lt;nowiki&amp;gt;https://get.acme.sh&amp;lt;/nowiki&amp;gt; | sh -s email=my@example.com&lt;br /&gt;
 WORKDIR /root/.acme.sh&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/usr/sbin/crond&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;-S&amp;quot;,&amp;quot;/dev/stdout&amp;quot;]&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
 docker build -f acme.sh.Dockerfile -t san3xian/freessl_acme.sh:v2 .&lt;br /&gt;
然后到&amp;lt;nowiki/&amp;gt;https://freessl.cn/acme-deploy 注册登陆&lt;br /&gt;
&lt;br /&gt;
并在该站点的 [https://freessl.cn/acme-deploy acme页面中]添加域名，完成域名的DCV预检测(即配置CNAME，域名解析状态可以在这里查询: https://myssl.com/dns_check.html)&lt;br /&gt;
&lt;br /&gt;
获取token (即ACME 地址中 ****/directory/ 后的字符串)&lt;br /&gt;
&lt;br /&gt;
接着根据实际需求构建域名专属acme镜像用于签发证书，安装证书以及触发 容器化或者节点直接部署运行的nginx reload(后面按需运行的时候修改该容器pid mode和reloadcmd即可)&lt;br /&gt;
&lt;br /&gt;
这里 &amp;lt;code&amp;gt;--issue&amp;lt;/code&amp;gt; 命令中由于没有带--days参数，所以默认签的是60天的证书&lt;br /&gt;
&lt;br /&gt;
将下述内容按需修改存于Dockerfile中&lt;br /&gt;
 FROM san3xian/freessl_acme.sh:v2&lt;br /&gt;
 &lt;br /&gt;
 ARG  acme_token=&amp;quot;your_token&amp;quot; \&lt;br /&gt;
      acme_domain=&amp;quot;your_domain&amp;quot;&lt;br /&gt;
 RUN /root/.acme.sh/acme.sh --issue -d ${acme_domain}  --dns dns_dp \&lt;br /&gt;
     --server &amp;lt;nowiki&amp;gt;https://acme.freessl.cn/v2/DV90/directory/${acme_token}&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; \&lt;br /&gt;
     mkdir -pv /certs &amp;amp;&amp;amp; \&lt;br /&gt;
     /root/.acme.sh/acme.sh --install-cert -d ${acme_domain} \&lt;br /&gt;
     --key-file /certs/${acme_domain}_key.pem \&lt;br /&gt;
     --fullchain-file /certs/${acme_domain}_cert.pem \&lt;br /&gt;
     --reloadcmd &amp;quot;/bin/kill -s HUP 1&amp;quot;&lt;br /&gt;
使用docker build构建镜像&lt;br /&gt;
 docker build -t san3xian/freessl_acme.sh:yourdomain .&lt;br /&gt;
如果上述步骤都没错的话，在构建这个带有域名证书信息的镜像的时候，就能看到申请下来的证书会被打印输出到控制台&lt;br /&gt;
&lt;br /&gt;
并且根据回显内容可知，申请下来的证书保存在了 &amp;lt;code&amp;gt;/root/.acme.sh/${acme_domain}/&amp;lt;/code&amp;gt; 路径下，而且证书会被拷贝一份到 &amp;lt;code&amp;gt;/certs&amp;lt;/code&amp;gt; 路径下(此路径按实际需求在Dockerfile中修改即可)&lt;br /&gt;
&lt;br /&gt;
在freessl.cn的acme页面中也能看到相应的客户端ID信息&lt;br /&gt;
&lt;br /&gt;
证书的相关配置信息(如install-path和ReloadCmd)在&amp;lt;code&amp;gt;/root/.acme.sh/${acme_domain}/${acme_domain}.conf&amp;lt;/code&amp;gt; 文件中&lt;br /&gt;
&lt;br /&gt;
到这里acme.sh自动签证书的步骤就已经基本做完了&lt;br /&gt;
&lt;br /&gt;
acme.sh配置参考: https://blog.freessl.cn/acme-quick-start/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 正题2: 适配实际的tls证书使用环境 ===&lt;br /&gt;
如前所述，本文是为了用容器化的freessl acme.sh向容器化的nginx进行证书自签，所以下面还会有docker-compose的内容，当然实际操作中用docker run 直接运行容器也可以&lt;br /&gt;
&lt;br /&gt;
前提展开: 由于我这里nginx容器是使用常规镜像启动的，所以我的nginx master的pid在容器的PID namespace就会是1，遂在上文的reloadcmd 中写死了pid&lt;br /&gt;
&lt;br /&gt;
然后我的docker-compose.yml是在server文件夹下的，所以docekr-compose拉起的容器默认会带 &amp;lt;code&amp;gt;server_&amp;lt;/code&amp;gt; 前缀，即如docker-compose help中所述:&lt;br /&gt;
 docker-compose --help &lt;br /&gt;
  -p, --project-name NAME     Specify an alternate project name&lt;br /&gt;
                               (default: directory name)&lt;br /&gt;
docker-compose.yml内容，部分内容按实际需求修改&lt;br /&gt;
 version: &amp;quot;2&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 services:&lt;br /&gt;
   nginx:&lt;br /&gt;
     restart: always&lt;br /&gt;
     image: nginx:1.21-alpine&lt;br /&gt;
     volumes:&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/conf.d:/etc/nginx/conf.d&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/nginx.conf:/etc/nginx/nginx.conf&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/certs:/etc/nginx/certs&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/sites-enabled:/etc/nginx/sites-enabled&amp;quot;&lt;br /&gt;
     ports: &lt;br /&gt;
       - &amp;quot;80:80&amp;quot; # http port for private network&lt;br /&gt;
       - &amp;quot;443:443&amp;quot; # https port for private network&lt;br /&gt;
   freessl:&lt;br /&gt;
     restart: always&lt;br /&gt;
     image: san3xian/freessl_acme.sh:yourdomain #修改为你在上文实际打出来的容器镜像&lt;br /&gt;
     volumes:&lt;br /&gt;
     - &amp;quot;/var/lib/nginx/certs:/certs&amp;quot;&lt;br /&gt;
     tty: true # alpine下不分配伪tty的话BusyBox crond会有的日志不输出到stdout&lt;br /&gt;
     pid: container:server_nginx_1 # 与nginx共享同一个PID namespace, 这里暂时没有找到在docker-compose文件中关联其它container的写法，所以只能完全写死容器名了&lt;br /&gt;
可见freessl 和 nginx 容器都挂载了同一个/var/lib/nginx/certs目录，这样nginx就能读到由freessl acme.sh自签下发的tls证书&lt;br /&gt;
&lt;br /&gt;
接着docker-compose up -d 启动了相应的容器后&lt;br /&gt;
&lt;br /&gt;
由于在前文签证书的时候，freessl acme.sh容器中/certs路径还没挂载到节点上，所以此时还需要重新拷贝/签一份证书到certs路径下&lt;br /&gt;
 docker exec server_freessl_1 &amp;quot;/root/.acme.sh&amp;quot;/acme.sh --cron --home &amp;quot;/root/.acme.sh&amp;quot; --force&lt;br /&gt;
如果上述步骤都没错的话，此时nginx也会被触发reload，可以docker logs server_nginx_1 看相关信息，按照实际修改nginx的配置以让tls证书生效即可&lt;br /&gt;
&lt;br /&gt;
由于freessl acme.sh容器中还有crond的守护进程运行着，所以acme.sh也会被定时触发，可以通过docker logs server_freessl_1看相关日志&lt;br /&gt;
&lt;br /&gt;
crontab -l 也可以看到相关任务定时触发配置信息，建议按需将acme.sh触发命令的重定向( &amp;lt;code&amp;gt;&amp;gt; /dev/null&amp;lt;/code&amp;gt; )去除以方便查看acme.sh的cron日志&lt;br /&gt;
 [root@localhost server]# docker exec server_freessl_1 crontab -l&lt;br /&gt;
 # do daily/weekly/monthly maintenance&lt;br /&gt;
 # min	hour	day	month	weekday	command&lt;br /&gt;
 */15	*	*	*	*	run-parts /etc/periodic/15min&lt;br /&gt;
 0	*	*	*	*	run-parts /etc/periodic/hourly&lt;br /&gt;
 0	2	*	*	*	run-parts /etc/periodic/daily&lt;br /&gt;
 0	3	*	*	6	run-parts /etc/periodic/weekly&lt;br /&gt;
 0	5	1	*	*	run-parts /etc/periodic/monthly&lt;br /&gt;
 &lt;br /&gt;
 1 0 * * * &amp;quot;/root/.acme.sh&amp;quot;/acme.sh --cron --home &amp;quot;/root/.acme.sh&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
如果需要添加多个域名的话，可以直接在freessl容器中运行命令&lt;br /&gt;
 /root/.acme.sh/acme.sh --issue -d ${acme_domain}  --dns dns_dp --server &amp;lt;nowiki&amp;gt;https://acme.freessl.cn/v2/DV90/directory/${acme_token}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
和&lt;br /&gt;
 /root/.acme.sh/acme.sh --install-cert -d ${acme_domain} --key-file /certs/${acme_domain}_key.pem --fullchain-file /certs/${acme_domain}_cert.pem --reloadcmd &amp;quot;/bin/kill -s HUP 1&amp;quot;&lt;br /&gt;
即可，这样下一次acme.sh的cron任务触发的时候，多个域名都会被执行证书更新检查&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:Docker]]&lt;br /&gt;
[[分类:Docker-compose]]&lt;br /&gt;
{{DEFAULTSORT:docker容器化freessl_acme.sh配合nginx实现https证书自动续期}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E5%8C%96freessl-acme.sh%E6%9B%B4%E6%96%B0nginx%E5%AE%9E%E7%8E%B0https%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F&amp;diff=1693</id>
		<title>容器化freessl-acme.sh更新nginx实现https证书自动续期</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E5%8C%96freessl-acme.sh%E6%9B%B4%E6%96%B0nginx%E5%AE%9E%E7%8E%B0https%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F&amp;diff=1693"/>
		<updated>2026-04-09T08:32:22Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;注意：freessl目前acme地址已经更改为litessl.com。下述内容并没有跟进此更新，仅供参考&lt;br /&gt;
&lt;br /&gt;
=== 赘述 ===&lt;br /&gt;
由于有一定的OS环境洁癖，所以不打算直接在Linux OS环境中直接安装acme.sh，采用容器化的方式安装acme.sh&lt;br /&gt;
&lt;br /&gt;
acme.sh官方其实有做好的docker images,但是由于太闲了所以又重新写了一份(班门弄斧)&lt;br /&gt;
&lt;br /&gt;
=== 正题1: 制作能自签域名证书的镜像 ===&lt;br /&gt;
先构建一个带有 acme.sh 基础镜像&lt;br /&gt;
 cat &amp;lt;&amp;lt;\EOF &amp;gt; acme.sh.Dockerfile&lt;br /&gt;
 FROM alpine:3.15.3&lt;br /&gt;
 RUN apk --no-cache add curl wget openssl &amp;amp;&amp;amp; \&lt;br /&gt;
     rm -rf /var/cache/apk &amp;amp;&amp;amp; \&lt;br /&gt;
     curl -s &amp;lt;nowiki&amp;gt;https://get.acme.sh&amp;lt;/nowiki&amp;gt; | sh -s email=my@example.com&lt;br /&gt;
 WORKDIR /root/.acme.sh&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/usr/sbin/crond&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;-S&amp;quot;,&amp;quot;/dev/stdout&amp;quot;]&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
 docker build -f acme.sh.Dockerfile -t san3xian/freessl_acme.sh:v2 .&lt;br /&gt;
然后到&amp;lt;nowiki/&amp;gt;https://freessl.cn/acme-deploy 注册登陆&lt;br /&gt;
&lt;br /&gt;
并在该站点的 [https://freessl.cn/acme-deploy acme页面中]添加域名，完成域名的DCV预检测(即配置CNAME，域名解析状态可以在这里查询: https://myssl.com/dns_check.html)&lt;br /&gt;
&lt;br /&gt;
获取token (即ACME 地址中 ****/directory/ 后的字符串)&lt;br /&gt;
&lt;br /&gt;
接着根据实际需求构建域名专属acme镜像用于签发证书，安装证书以及触发 容器化或者节点直接部署运行的nginx reload(后面按需运行的时候修改该容器pid mode和reloadcmd即可)&lt;br /&gt;
&lt;br /&gt;
这里 &amp;lt;code&amp;gt;--issue&amp;lt;/code&amp;gt; 命令中由于没有带--days参数，所以默认签的是60天的证书&lt;br /&gt;
&lt;br /&gt;
将下述内容按需修改存于Dockerfile中&lt;br /&gt;
 FROM san3xian/freessl_acme.sh:v2&lt;br /&gt;
 &lt;br /&gt;
 ARG  acme_token=&amp;quot;your_token&amp;quot; \&lt;br /&gt;
      acme_domain=&amp;quot;your_domain&amp;quot;&lt;br /&gt;
 RUN /root/.acme.sh/acme.sh --issue -d ${acme_domain}  --dns dns_dp \&lt;br /&gt;
     --server &amp;lt;nowiki&amp;gt;https://acme.freessl.cn/v2/DV90/directory/${acme_token}&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; \&lt;br /&gt;
     mkdir -pv /certs &amp;amp;&amp;amp; \&lt;br /&gt;
     /root/.acme.sh/acme.sh --install-cert -d ${acme_domain} \&lt;br /&gt;
     --key-file /certs/${acme_domain}_key.pem \&lt;br /&gt;
     --fullchain-file /certs/${acme_domain}_cert.pem \&lt;br /&gt;
     --reloadcmd &amp;quot;/bin/kill -s HUP 1&amp;quot;&lt;br /&gt;
使用docker build构建镜像&lt;br /&gt;
 docker build -t san3xian/freessl_acme.sh:yourdomain .&lt;br /&gt;
如果上述步骤都没错的话，在构建这个带有域名证书信息的镜像的时候，就能看到申请下来的证书会被打印输出到控制台&lt;br /&gt;
&lt;br /&gt;
并且根据回显内容可知，申请下来的证书保存在了 &amp;lt;code&amp;gt;/root/.acme.sh/${acme_domain}/&amp;lt;/code&amp;gt; 路径下，而且证书会被拷贝一份到 &amp;lt;code&amp;gt;/certs&amp;lt;/code&amp;gt; 路径下(此路径按实际需求在Dockerfile中修改即可)&lt;br /&gt;
&lt;br /&gt;
在freessl.cn的acme页面中也能看到相应的客户端ID信息&lt;br /&gt;
&lt;br /&gt;
证书的相关配置信息(如install-path和ReloadCmd)在&amp;lt;code&amp;gt;/root/.acme.sh/${acme_domain}/${acme_domain}.conf&amp;lt;/code&amp;gt; 文件中&lt;br /&gt;
&lt;br /&gt;
到这里acme.sh自动签证书的步骤就已经基本做完了&lt;br /&gt;
&lt;br /&gt;
acme.sh配置参考: https://blog.freessl.cn/acme-quick-start/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 正题2: 适配实际的tls证书使用环境 ===&lt;br /&gt;
如前所述，本文是为了用容器化的freessl acme.sh向容器化的nginx进行证书自签，所以下面还会有docker-compose的内容，当然实际操作中用docker run 直接运行容器也可以&lt;br /&gt;
&lt;br /&gt;
前提展开: 由于我这里nginx容器是使用常规镜像启动的，所以我的nginx master的pid在容器的PID namespace就会是1，遂在上文的reloadcmd 中写死了pid&lt;br /&gt;
&lt;br /&gt;
然后我的docker-compose.yml是在server文件夹下的，所以docekr-compose拉起的容器默认会带 &amp;lt;code&amp;gt;server_&amp;lt;/code&amp;gt; 前缀，即如docker-compose help中所述:&lt;br /&gt;
 docker-compose --help &lt;br /&gt;
  -p, --project-name NAME     Specify an alternate project name&lt;br /&gt;
                               (default: directory name)&lt;br /&gt;
docker-compose.yml内容，部分内容按实际需求修改&lt;br /&gt;
 version: &amp;quot;2&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 services:&lt;br /&gt;
   nginx:&lt;br /&gt;
     restart: always&lt;br /&gt;
     image: nginx:1.21-alpine&lt;br /&gt;
     volumes:&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/conf.d:/etc/nginx/conf.d&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/nginx.conf:/etc/nginx/nginx.conf&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/certs:/etc/nginx/certs&amp;quot;&lt;br /&gt;
       - &amp;quot;/var/lib/nginx/sites-enabled:/etc/nginx/sites-enabled&amp;quot;&lt;br /&gt;
     ports: &lt;br /&gt;
       - &amp;quot;80:80&amp;quot; # http port for private network&lt;br /&gt;
       - &amp;quot;443:443&amp;quot; # https port for private network&lt;br /&gt;
   freessl:&lt;br /&gt;
     restart: always&lt;br /&gt;
     image: san3xian/freessl_acme.sh:yourdomain #修改为你在上文实际打出来的容器镜像&lt;br /&gt;
     volumes:&lt;br /&gt;
     - &amp;quot;/var/lib/nginx/certs:/certs&amp;quot;&lt;br /&gt;
     tty: true # alpine下不分配伪tty的话BusyBox crond会有的日志不输出到stdout&lt;br /&gt;
     pid: container:server_nginx_1 # 与nginx共享同一个PID namespace, 这里暂时没有找到在docker-compose文件中关联其它container的写法，所以只能完全写死容器名了&lt;br /&gt;
可见freessl 和 nginx 容器都挂载了同一个/var/lib/nginx/certs目录，这样nginx就能读到由freessl acme.sh自签下发的tls证书&lt;br /&gt;
&lt;br /&gt;
接着docker-compose up -d 启动了相应的容器后&lt;br /&gt;
&lt;br /&gt;
由于在前文签证书的时候，freessl acme.sh容器中/certs路径还没挂载到节点上，所以此时还需要重新拷贝/签一份证书到certs路径下&lt;br /&gt;
 docker exec server_freessl_1 &amp;quot;/root/.acme.sh&amp;quot;/acme.sh --cron --home &amp;quot;/root/.acme.sh&amp;quot; --force&lt;br /&gt;
如果上述步骤都没错的话，此时nginx也会被触发reload，可以docker logs server_nginx_1 看相关信息，按照实际修改nginx的配置以让tls证书生效即可&lt;br /&gt;
&lt;br /&gt;
由于freessl acme.sh容器中还有crond的守护进程运行着，所以acme.sh也会被定时触发，可以通过docker logs server_freessl_1看相关日志&lt;br /&gt;
&lt;br /&gt;
crontab -l 也可以看到相关任务定时触发配置信息，建议按需将acme.sh触发命令的重定向( &amp;lt;code&amp;gt;&amp;gt; /dev/null&amp;lt;/code&amp;gt; )去除以方便查看acme.sh的cron日志&lt;br /&gt;
 [root@localhost server]# docker exec server_freessl_1 crontab -l&lt;br /&gt;
 # do daily/weekly/monthly maintenance&lt;br /&gt;
 # min	hour	day	month	weekday	command&lt;br /&gt;
 */15	*	*	*	*	run-parts /etc/periodic/15min&lt;br /&gt;
 0	*	*	*	*	run-parts /etc/periodic/hourly&lt;br /&gt;
 0	2	*	*	*	run-parts /etc/periodic/daily&lt;br /&gt;
 0	3	*	*	6	run-parts /etc/periodic/weekly&lt;br /&gt;
 0	5	1	*	*	run-parts /etc/periodic/monthly&lt;br /&gt;
 &lt;br /&gt;
 1 0 * * * &amp;quot;/root/.acme.sh&amp;quot;/acme.sh --cron --home &amp;quot;/root/.acme.sh&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
如果需要添加多个域名的话，可以直接在freessl容器中运行命令&lt;br /&gt;
 /root/.acme.sh/acme.sh --issue -d ${acme_domain}  --dns dns_dp --server &amp;lt;nowiki&amp;gt;https://acme.freessl.cn/v2/DV90/directory/${acme_token}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
和&lt;br /&gt;
 /root/.acme.sh/acme.sh --install-cert -d ${acme_domain} --key-file /certs/${acme_domain}_key.pem --fullchain-file /certs/${acme_domain}_cert.pem --reloadcmd &amp;quot;/bin/kill -s HUP 1&amp;quot;&lt;br /&gt;
即可，这样下一次acme.sh的cron任务触发的时候，多个域名都会被执行证书更新检查&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:Docker]]&lt;br /&gt;
[[分类:Docker-compose]]&lt;br /&gt;
{{DEFAULTSORT:docker容器化freessl_acme.sh配合nginx实现https证书自动续期}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&amp;diff=1692</id>
		<title>VMware不关机扩容linux磁盘</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=VMware%E4%B8%8D%E5%85%B3%E6%9C%BA%E6%89%A9%E5%AE%B9linux%E7%A3%81%E7%9B%98&amp;diff=1692"/>
		<updated>2026-04-09T07:36:32Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
&lt;br /&gt;
=== 在虚拟化平台对磁盘扩容后 fdisk -l 识别不到分区 (partition丢失,GPT分区表不建议使用fdisk) ===&lt;br /&gt;
注意在部分OS下，可能在扩容前 Disk 的相关 partition 信息在fdisk中是可以正常识别的，但是在 vsphere / esxi 对磁盘进行扩容以后&lt;br /&gt;
&lt;br /&gt;
就发现 partition 丢了【fdisk -l /dev/sda 看不到某些分区】(特别是centos7.9 + fdisk -l + GPT)&lt;br /&gt;
&lt;br /&gt;
这时候可以直接 &amp;lt;code&amp;gt;parted /dev/sda&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
进入以后应该就会提示&lt;br /&gt;
 Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that&lt;br /&gt;
 another operating system believes the disk is smaller.  Fix, by moving the backup to the end (and&lt;br /&gt;
 removing the old backup)?&lt;br /&gt;
直接进行Fix并扩容即可&lt;br /&gt;
&lt;br /&gt;
也可以找到原本的扇区记录，然后进入fdisk ，修改 partition table 为 GPT，根据相关扇区记录，把分区重新建立回来即可&lt;br /&gt;
&lt;br /&gt;
=== lvm类型的分区扩容 ===&lt;br /&gt;
&lt;br /&gt;
==== 利用fdisk - 传统步骤扩容分区(旧版本fdisk对GPT兼容不好，GPT分区表建议使用parted) ====&lt;br /&gt;
磁盘名sda, vg名 cl, lv名 root 等自行根据实际情况修改!&lt;br /&gt;
# vsphere(虚拟化平台)层面完成磁盘扩容&lt;br /&gt;
# 进入系统 shell 中，执行命令 lsblk 查看对应的磁盘是否有感知到新的容量。有时候会碰到 os 无法感知到 disk 容量变化的情况出现，这时候需要手动rescan一下&amp;lt;code&amp;gt;echo 1 &amp;gt; /sys/class/block/sda/device/rescan&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;fdisk -l /dev/sda&amp;lt;/code&amp;gt; 确认相关分区及扇区信息&lt;br /&gt;
# 使用&amp;lt;code&amp;gt;fdisk /dev/sda&amp;lt;/code&amp;gt; 进入交互式操作删除重建需要扩容的分区(增大分区容量,保留原本的LVM2_member signature, 起始扇区与原本一致) &lt;br /&gt;
# &amp;lt;code&amp;gt;partprobe /dev/sda &amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;pvresize /dev/sda3 &amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;lvextend /dev/cl/root /dev/sda3 &amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;xfs_growfs /dev/mapper/cl-root &amp;lt;/code&amp;gt;&lt;br /&gt;
# 完成&lt;br /&gt;
&lt;br /&gt;
==== 利用parted工具一行命令直接扩容第三分区到100% ====&lt;br /&gt;
磁盘名sda, vg名 cl, lv名 root 等自行根据实际情况修改!&lt;br /&gt;
 parted /dev/sda --script -- resizepart 3 100%&lt;br /&gt;
&lt;br /&gt;
 pvresize /dev/sda3 &amp;amp;&amp;amp; lvextend -l +100%FREE /dev/ol/root &amp;amp;&amp;amp; xfs_growfs /&lt;br /&gt;
&lt;br /&gt;
=== 非lvm类型虚拟磁盘扩容(磁盘直接作为了挂载点) ===&lt;br /&gt;
磁盘名sda, vg名 cl, lv名 root 等自行根据实际情况修改!&lt;br /&gt;
# vm层面完成磁盘扩容&lt;br /&gt;
# 同样手动rescan一下让os感知磁盘容量变化&amp;lt;code&amp;gt;echo 1 &amp;gt; /sys/class/block/sda/device/rescan&amp;lt;/code&amp;gt;&lt;br /&gt;
#根据文件系统类型执行fs扩容，如&amp;lt;code&amp;gt;xfs_growfs&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;resize2fs&amp;lt;/code&amp;gt;&lt;br /&gt;
#例如⬇️&lt;br /&gt;
 [root@192-168-157-39 ~]# lsblk /dev/sdb&lt;br /&gt;
 NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
 sdb    8:16   0  150G  0 disk /var/lib/containers&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# echo 1 &amp;gt; /sys/class/block/sdb/device/rescan&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# lsblk /dev/sdb&lt;br /&gt;
 NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
 sdb    8:16   0  155G  0 disk /var/lib/containers&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# cat /etc/fstab |grep cont&lt;br /&gt;
 /dev/sdb /var/lib/containers xfs defaults,pquota 0 0&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# xfs_growfs /dev/sdb&lt;br /&gt;
 meta-data=/dev/sdb               isize=512    agcount=4, agsize=9830400 blks&lt;br /&gt;
          =                       sectsz=512   attr=2, projid32bit=1&lt;br /&gt;
          =                       crc=1        finobt=0 spinodes=0&lt;br /&gt;
 data     =                       bsize=4096   blocks=39321600, imaxpct=25&lt;br /&gt;
          =                       sunit=0      swidth=0 blks&lt;br /&gt;
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1&lt;br /&gt;
 log      =internal               bsize=4096   blocks=19200, version=2&lt;br /&gt;
          =                       sectsz=512   sunit=0 blks, lazy-count=1&lt;br /&gt;
 realtime =none                   extsz=4096   blocks=0, rtextents=0&lt;br /&gt;
 data blocks changed from 39321600 to 40632320&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# df -h /var/lib/containers&lt;br /&gt;
 Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
 /dev/sdb        155G   19G  137G  12% /var/lib/containers&lt;br /&gt;
 &lt;br /&gt;
 [root@192-168-157-39 ~]# lsblk&lt;br /&gt;
 NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
 sda               8:0    0   50G  0 disk&lt;br /&gt;
 ├─sda1            8:1    0 1019M  0 part /boot&lt;br /&gt;
 └─sda2            8:2    0   49G  0 part&lt;br /&gt;
   └─centos-root 253:0    0   49G  0 lvm  /&lt;br /&gt;
 sdb               8:16   0  155G  0 disk /var/lib/containers&lt;br /&gt;
 sr0              11:0    1  9.5G  0 rom&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
额外延伸：[https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ How to scan\detect new LUN’s &amp;amp; SCSI disks in Linux?]&lt;br /&gt;
&lt;br /&gt;
通过命令 &amp;lt;code&amp;gt;lsscsi -g&amp;lt;/code&amp;gt; 能看 vmware 磁盘和 OS disk 的对照关系&lt;br /&gt;
[[category: Linux]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Fish_shell%E6%88%96bash_shell%E4%B8%8B%E7%9A%84ssh-agent%E7%8E%B0%E6%9C%89%E4%BC%9A%E8%AF%9D%E6%8E%A2%E6%B5%8B%E8%84%9A%E6%9C%AC&amp;diff=1691</id>
		<title>Fish shell或bash shell下的ssh-agent现有会话探测脚本</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Fish_shell%E6%88%96bash_shell%E4%B8%8B%E7%9A%84ssh-agent%E7%8E%B0%E6%9C%89%E4%BC%9A%E8%AF%9D%E6%8E%A2%E6%B5%8B%E8%84%9A%E6%9C%AC&amp;diff=1691"/>
		<updated>2026-02-27T17:23:37Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;一个随便糊的用于发现设备上现有的ssh-agent会话脚本，方便在不同的terminal tab中复用一个ssh-agent&lt;br /&gt;
&lt;br /&gt;
适配: &lt;br /&gt;
&lt;br /&gt;
=== macOS + fish shell (macos v26.3+) ===&lt;br /&gt;
 #!/usr/bin/env fish&lt;br /&gt;
 &lt;br /&gt;
 #######################################################&lt;br /&gt;
 # Author: SanXian&lt;br /&gt;
 # To find the exists ssh-agent connection or create &lt;br /&gt;
 # a new ssh-agent connection for macOS with fish shell&lt;br /&gt;
 # version: 1.5&lt;br /&gt;
 #######################################################&lt;br /&gt;
 &lt;br /&gt;
 #set base_dir &amp;quot;/var/folders/4w/hx1kgdwd2ll9chvbzv6y70r80000gn/T&amp;quot;&lt;br /&gt;
 # Linux&lt;br /&gt;
 # /tmp/ssh-*/agent.*&lt;br /&gt;
 &lt;br /&gt;
 # macOS-new version:&lt;br /&gt;
 # set base_dir &amp;quot;$TMPDIR/ssh-*/agent.*&amp;quot;&lt;br /&gt;
 set base_dir &amp;quot;~/.ssh/agent/*agent.*&amp;quot;&lt;br /&gt;
 for i in (sh -c &amp;quot;ls -1 --color=never $base_dir 2&amp;gt;/dev/null&amp;quot;)&lt;br /&gt;
   set agent_file (echo -n $i | grep --color=never -Eo &amp;quot;agent.*&amp;quot;)&lt;br /&gt;
   echo &amp;quot;found: $agent_file&amp;quot;&lt;br /&gt;
   #set PID (echo -n $agent_file | awk -F . '{print $2 + 1}')&lt;br /&gt;
   set PID (lsof -n $i | awk '/ssh-agent/{print $2}')&lt;br /&gt;
   echo PID: $PID&lt;br /&gt;
   export  SSH_AGENT_PID=$PID&lt;br /&gt;
   export  SSH_AUTH_SOCK=$i&lt;br /&gt;
   env | grep -i ssh_&lt;br /&gt;
   exit&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 # ssh agent sock not found&lt;br /&gt;
 echo &amp;quot;ssh agent sock file not found, creating&amp;quot;&lt;br /&gt;
 eval (ssh-agent -c -t 4h)&lt;br /&gt;
 #ssh-add -t 0&lt;br /&gt;
 ssh-add -t 360d&lt;br /&gt;
&lt;br /&gt;
=== Linux bash: ===&lt;br /&gt;
 #!/usr/bin/env bash&lt;br /&gt;
 &lt;br /&gt;
 #######################################################&lt;br /&gt;
 # Author: SanXian&lt;br /&gt;
 # To find the exists ssh-agent connection or create&lt;br /&gt;
 # a new ssh-agent connection for macOS with fish shell&lt;br /&gt;
 # version: 1.5&lt;br /&gt;
 #######################################################&lt;br /&gt;
 &lt;br /&gt;
 #set base_dir &amp;quot;/var/folders/4w/hx1kgdwd2ll9chvbzv6y70r80000gn/T&amp;quot;&lt;br /&gt;
 # Linux&lt;br /&gt;
 base_dir=/tmp/ssh-*/agent.*&lt;br /&gt;
 &lt;br /&gt;
 # macOS&lt;br /&gt;
 #set base_dir $TMPDIR/ssh-*/agent.*&lt;br /&gt;
 agent_paths=`sh -c &amp;quot;ls -1 --color=never $base_dir 2&amp;gt;/dev/null&amp;quot;`&lt;br /&gt;
 for i in $agent_paths&lt;br /&gt;
 do&lt;br /&gt;
   agent_file=`echo -n $i | grep --color=never -Eo &amp;quot;agent.*&amp;quot;`&lt;br /&gt;
   echo &amp;quot;found: $agent_file&amp;quot;&lt;br /&gt;
   PID=`echo -n $agent_file | awk -F . '{print $2 + 1}'`&lt;br /&gt;
   echo PID: $PID&lt;br /&gt;
   export SSH_AGENT_PID=$PID&lt;br /&gt;
   export SSH_AUTH_SOCK=$i&lt;br /&gt;
   env | grep -i ssh_&lt;br /&gt;
 done&lt;br /&gt;
 &lt;br /&gt;
 if &amp;lt;nowiki&amp;gt;[[ -z $agent_paths ]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 then&lt;br /&gt;
   # ssh agent sock not found&lt;br /&gt;
   echo &amp;quot;ssh agent sock file not found, creating&amp;quot;&lt;br /&gt;
   eval `ssh-agent -t 4h`&lt;br /&gt;
   #ssh-add -t 0&lt;br /&gt;
   ssh-add -t 360d&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
=== 食用方法 ===&lt;br /&gt;
执行:&lt;br /&gt;
 source ssh-search&lt;br /&gt;
或&lt;br /&gt;
 . ssh-search&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
扩展阅读:&lt;br /&gt;
&lt;br /&gt;
[[SSH-add脚本化载入带密码(passphrase)的私钥]]&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:MacOS]]&lt;br /&gt;
[[分类:SSH]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&amp;diff=1690</id>
		<title>Etcd命令随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&amp;diff=1690"/>
		<updated>2026-02-02T09:49:39Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 切换 ETCDCTL API version ===&lt;br /&gt;
&lt;br /&gt;
==== with docker exec ====&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=2&amp;quot; etcd_container_name_or_id etcdctl --help&lt;br /&gt;
&lt;br /&gt;
==== env ====&lt;br /&gt;
 export ETCDCTL_API=2&lt;br /&gt;
&lt;br /&gt;
=== 排障相关命令 ===&lt;br /&gt;
&lt;br /&gt;
* 如果etcd是基于k8s manifest启动的,且该manifest初始化了ETCDCTL_ENDPOINTS变量，在指定endpoints只能通过环境变量指定，或者在bash环境下unset  &amp;quot;ETCDCTL_ENDPOINTS&amp;quot; 取消环境变量定义然后再通过参数传入,不然会提示配置冲突:&lt;br /&gt;
&lt;br /&gt;
 2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable &amp;quot;ETCDCTL_ENDPOINTS&amp;quot; is shadowed by corresponding command-line flag (either unset environment variable or disable flag)&lt;br /&gt;
&lt;br /&gt;
==== etcdctl v3 related ====&lt;br /&gt;
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md&lt;br /&gt;
&lt;br /&gt;
其中常见的包括&lt;br /&gt;
 export ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt&lt;br /&gt;
 export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt&lt;br /&gt;
 export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key&lt;br /&gt;
&lt;br /&gt;
===== k8s 的 etcd 可以通过下述命令直接在k8s controller shell 上初始化 etcdctl 环境变量 =====&lt;br /&gt;
 export ETCD_PEER_PORT=2379&lt;br /&gt;
 eval &amp;quot;$(kubectl get pods -n kube-system -o custom-columns='name:.metadata.name,ip:.status.podIP' --no-headers | awk '/etcd/{ eps = eps (eps?&amp;quot;,&amp;quot;:&amp;quot;&amp;quot;) &amp;quot;https://&amp;quot; $2 &amp;quot;:&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;$ETCD_PEER_PORT&amp;quot; } END { print &amp;quot;export ETCDCTL_ENDPOINTS=\&amp;quot;&amp;quot; eps &amp;quot;\&amp;quot;&amp;quot; }')&amp;quot;&lt;br /&gt;
 export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt&lt;br /&gt;
 export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt&lt;br /&gt;
 export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 etcdctl member list -w table&lt;br /&gt;
 etcdctl endpoint status -w table&lt;br /&gt;
&lt;br /&gt;
===== etcd member list (v3 API) =====&lt;br /&gt;
* etcdctl member list&lt;br /&gt;
&lt;br /&gt;
 [root@test kubelet]# docker exec -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379&amp;lt;/nowiki&amp;gt;&amp;quot; `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
 |        ID        | STATUS  |          NAME           |         PEER ADDRS          |         CLIENT ADDRS         | IS LEARNER |&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
 | 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | &amp;lt;nowiki&amp;gt;http://192.168.150.12:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.12:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 | d58cc05313738455 | started | dce-etcd-192.168.150.13 | &amp;lt;nowiki&amp;gt;http://192.168.150.13:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.13:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 | ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | &amp;lt;nowiki&amp;gt;http://192.168.150.14:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.14:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
&lt;br /&gt;
===== etcd endpoint health (v3 API) =====&lt;br /&gt;
*etcdctl endpoint health&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=3&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl endpoint health -w table&lt;br /&gt;
 &lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
 |           ENDPOINT           | HEALTH |     TOOK     | ERROR |&lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt; |   true |    14.2308ms |       |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt; |   true |  14.572283ms |       |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt; |   true | 351.572429ms |       |&lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
&lt;br /&gt;
===== etcd endpoint status (v3 API) =====&lt;br /&gt;
&lt;br /&gt;
* etcdctl endpoint status&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=3&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl endpoint status -w table&lt;br /&gt;
 &lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
 |           ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |&lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt; | 5710b6824446f271 |   3.4.1 |   35 MB |     false |      false |        52 |    7925759 |            7925759 |        |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt; | 2a8509b66bfae6b6 |   3.4.1 |   35 MB |      true |      false |        52 |    7925759 |            7925759 |        |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt; |  72f4884011f8a2b |   3.4.1 |   35 MB |     false |      false |        52 |    7925760 |            7925760 |        |&lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
&lt;br /&gt;
==== etcd cluster-health (v2 API) ====&lt;br /&gt;
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md&lt;br /&gt;
&lt;br /&gt;
etcdctl v2常用的环境变量&lt;br /&gt;
 ETCDCTL_ENDPOINT &lt;br /&gt;
 ETCDCTL_CA_FILE&lt;br /&gt;
 ETCDCTL_KEY_FILE&lt;br /&gt;
 ETCDCTL_CERT_FILE&lt;br /&gt;
* etcdctl cluster-health&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=2&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl cluster-health&lt;br /&gt;
 member 72f4884011f8a2b is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 member 2a8509b66bfae6b6 is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 member 5710b6824446f271 is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 cluster is healthy&lt;br /&gt;
&lt;br /&gt;
 docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health&lt;br /&gt;
&lt;br /&gt;
=== 磁盘/网络性能要求相关 ===&lt;br /&gt;
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]&amp;lt;blockquote&amp;gt;etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]&amp;lt;blockquote&amp;gt;就延迟而言，应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说，当有一个 20ms 的延迟时，使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群，建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字，您可以使用基准测试工具，如 fio。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]&amp;lt;blockquote&amp;gt;IO延迟与Queue Depth（队列深度）/Queue Length （队列长度）&lt;br /&gt;
&lt;br /&gt;
IO延迟是指控制器将IO指令发出之后，直到IO完成的过程中总共花费的时间。早前业界不成文的规定为，只要IO延迟在20ms内，IO性能对于应用程序来说都是可以接受的，但是如果大于20ms，应用程序的性能将会受到较大影响。（JMF602的小文件随机写入IOPS是个位数，所以你们觉得卡）&lt;br /&gt;
&lt;br /&gt;
这样算下来，存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS，所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近（7200转），固态硬盘的话就比较夸张了，对于大型的存储设备，通过并行N个IO通道工作，达到几十万甚至几百万IOPS都不是问题。&lt;br /&gt;
&lt;br /&gt;
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候，IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘，即使延迟平均在0.1ms的话，每个IO通道的IOPS=1000/0.1=10000，但是这块固态硬盘被厂家标称35000的读取IOPS，这里就引出另一个概念：Queue Depth（队列深度，也可以叫队列长度)&lt;br /&gt;
&lt;br /&gt;
控制器向存储设备发起的指令，不是一条条发送的，而是一批批的发送，存储目标设备批量执行IO，然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强，在IO比较少的时候，处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数，由控制器上的Queue Depth（队列深度）决定。（一般好的固态硬盘主控，队列深度都支持到32了）&lt;br /&gt;
&lt;br /&gt;
如果给出队列深度，IOPS，IO延迟三者中的任意两者，则可以推算出第三者，公式：IOPS=(队列深度）/ (IO延迟）。实际上，随着队列深度的增加，IO延迟也在增加，二者是互相促进的关系，所以，随着IO数目的增多，将很快达到存储设备提供的最大IOPS处理能力，此时IO延迟将会陡峭升高，而IOPS则增加缓慢。（消化不良）&amp;lt;/blockquote&amp;gt;[https://etcd.io/docs/v3.5/faq/#what-does-the-etcd-warning-failed-to-send-out-heartbeat-on-time-mean wal_fsync_duration_seconds 官方建议] &amp;lt;blockquote&amp;gt;Usually this issue is caused by a slow disk. Before the leader sends heartbeats attached with metadata, it may need to persist the metadata to disk. The disk could be experiencing contention among etcd and other applications, or the disk is too simply slow (e.g., a shared virtualized disk). To rule out a slow disk from causing this warning, monitor wal_fsync_duration_seconds (p99 duration should be less than 10ms) to confirm the disk is reasonably fast. If the disk is too slow, assigning a dedicated disk to etcd or using faster disk will typically solve the problem. To tell whether a disk is fast enough for etcd, a benchmarking tool such as fio can be used. Read here for an example.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&amp;diff=1689</id>
		<title>Etcd命令随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Etcd%E5%91%BD%E4%BB%A4%E9%9A%8F%E8%AE%B0&amp;diff=1689"/>
		<updated>2026-02-02T09:32:33Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 切换 ETCDCTL API version ===&lt;br /&gt;
&lt;br /&gt;
==== with docker exec ====&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=2&amp;quot; etcd_container_name_or_id etcdctl --help&lt;br /&gt;
&lt;br /&gt;
==== env ====&lt;br /&gt;
 export ETCDCTL_API=2&lt;br /&gt;
&lt;br /&gt;
=== 排障相关命令 ===&lt;br /&gt;
&lt;br /&gt;
* 如果etcd是基于k8s manifest启动的,且该manifest初始化了ETCDCTL_ENDPOINTS变量，在指定endpoints只能通过环境变量指定，或者在bash环境下unset  &amp;quot;ETCDCTL_ENDPOINTS&amp;quot; 取消环境变量定义然后再通过参数传入,不然会提示配置冲突:&lt;br /&gt;
&lt;br /&gt;
 2021-10-19 03:25:28.520086 C | pkg/flags: conflicting environment variable &amp;quot;ETCDCTL_ENDPOINTS&amp;quot; is shadowed by corresponding command-line flag (either unset environment variable or disable flag)&lt;br /&gt;
&lt;br /&gt;
==== etcdctl v3 related ====&lt;br /&gt;
etcdctl v3可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/README.md&lt;br /&gt;
&lt;br /&gt;
其中常见的包括&lt;br /&gt;
 export ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://127.0.0.1:2379,https://10.255.251.102:2379,https://10.255.251.103:2379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt&lt;br /&gt;
 export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt&lt;br /&gt;
 export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key&lt;br /&gt;
&lt;br /&gt;
===== k8s 的 etcd 可以通过下述命令直接在k8s controller shell 上初始化 etcdctl 环境变量 =====&lt;br /&gt;
 export ETCD_PEER_PORT=2379&lt;br /&gt;
 eval $(kubectl get pods -n kube-system -o custom-columns=&amp;quot;name:.metadata.name,ip:.status.podIP&amp;quot; --no-headers|awk '/etcd/{printf &amp;quot;https://&amp;amp;#x22;$2&amp;quot;:'$ETCD_PEER_PORT',&amp;quot;}'|awk '{gsub(&amp;quot;,$&amp;quot;,&amp;quot;&amp;quot;);print &amp;quot;export ETCDCTL_ENDPOINTS=\&amp;quot;&amp;quot;$1&amp;quot;\&amp;quot;&amp;quot;}')&lt;br /&gt;
 export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt&lt;br /&gt;
 export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/peer.crt&lt;br /&gt;
 export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/peer.key&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 etcdctl member list -w table&lt;br /&gt;
 etcdctl endpoint status -w table&lt;br /&gt;
&lt;br /&gt;
===== etcd member list (v3 API) =====&lt;br /&gt;
* etcdctl member list&lt;br /&gt;
&lt;br /&gt;
 [root@test kubelet]# docker exec -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.150.12:12379,https://192.168.150.13:12379,https://192.168.150.14:12379&amp;lt;/nowiki&amp;gt;&amp;quot; `docker ps | awk '/etcd /{print $1}'` etcdctl member list -w table&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
 |        ID        | STATUS  |          NAME           |         PEER ADDRS          |         CLIENT ADDRS         | IS LEARNER |&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
 | 8a8a69237e3e00ef | started | dce-etcd-192.168.150.12 | &amp;lt;nowiki&amp;gt;http://192.168.150.12:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.12:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 | d58cc05313738455 | started | dce-etcd-192.168.150.13 | &amp;lt;nowiki&amp;gt;http://192.168.150.13:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.13:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 | ed2566e796a749a6 | started | dce-etcd-192.168.150.14 | &amp;lt;nowiki&amp;gt;http://192.168.150.14:12380&amp;lt;/nowiki&amp;gt; | &amp;lt;nowiki&amp;gt;https://192.168.150.14:12379&amp;lt;/nowiki&amp;gt; |      false |&lt;br /&gt;
 +------------------+---------+-------------------------+-----------------------------+------------------------------+------------+&lt;br /&gt;
&lt;br /&gt;
===== etcd endpoint health (v3 API) =====&lt;br /&gt;
*etcdctl endpoint health&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=3&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl endpoint health -w table&lt;br /&gt;
 &lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
 |           ENDPOINT           | HEALTH |     TOOK     | ERROR |&lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt; |   true |    14.2308ms |       |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt; |   true |  14.572283ms |       |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt; |   true | 351.572429ms |       |&lt;br /&gt;
 +------------------------------+--------+--------------+-------+&lt;br /&gt;
&lt;br /&gt;
===== etcd endpoint status (v3 API) =====&lt;br /&gt;
&lt;br /&gt;
* etcdctl endpoint status&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=3&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl endpoint status -w table&lt;br /&gt;
 &lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
 |           ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |&lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt; | 5710b6824446f271 |   3.4.1 |   35 MB |     false |      false |        52 |    7925759 |            7925759 |        |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt; | 2a8509b66bfae6b6 |   3.4.1 |   35 MB |      true |      false |        52 |    7925759 |            7925759 |        |&lt;br /&gt;
 | &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt; |  72f4884011f8a2b |   3.4.1 |   35 MB |     false |      false |        52 |    7925760 |            7925760 |        |&lt;br /&gt;
 +------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;br /&gt;
&lt;br /&gt;
==== etcd cluster-health (v2 API) ====&lt;br /&gt;
etcdctl v2可用的环境变量可见文档 https://github.com/etcd-io/etcd/blob/main/etcdctl/READMEv2.md&lt;br /&gt;
&lt;br /&gt;
etcdctl v2常用的环境变量&lt;br /&gt;
 ETCDCTL_ENDPOINT &lt;br /&gt;
 ETCDCTL_CA_FILE&lt;br /&gt;
 ETCDCTL_KEY_FILE&lt;br /&gt;
 ETCDCTL_CERT_FILE&lt;br /&gt;
* etcdctl cluster-health&lt;br /&gt;
&lt;br /&gt;
 docker exec -e &amp;quot;ETCDCTL_API=2&amp;quot; -e &amp;quot;ETCDCTL_ENDPOINTS=&amp;lt;nowiki&amp;gt;https://192.168.155.22:12379,https://192.168.155.23:12379,https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&amp;quot; etcd_container_name_or_id etcdctl cluster-health&lt;br /&gt;
 member 72f4884011f8a2b is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.24:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 member 2a8509b66bfae6b6 is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.23:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 member 5710b6824446f271 is healthy: got healthy result from &amp;lt;nowiki&amp;gt;https://192.168.155.22:12379&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 cluster is healthy&lt;br /&gt;
&lt;br /&gt;
 docker exec -it -e ETCDCTL_API=2 `docker ps | awk '/etcd /{print $1}'` etcdctl cluster-health&lt;br /&gt;
&lt;br /&gt;
=== 磁盘/网络性能要求相关 ===&lt;br /&gt;
[https://etcd.io/docs/v3.5/op-guide/hardware/ official documentation]&amp;lt;blockquote&amp;gt;etcd is very sensitive to disk write latency. Typically 50 sequential IOPS (e.g., a 7200 RPM disk) is required. For heavily loaded clusters, 500 sequential IOPS (e.g., a typical local SSD or a high performance virtualized block device) is recommended. Note that most cloud providers publish concurrent IOPS rather than sequential IOPS; the published concurrent IOPS can be 10x greater than the sequential IOPS. To measure actual sequential IOPS, we suggest using a disk benchmarking tool such as diskbench or fio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;[https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/scalability_and_performance/index#recommended-etcd-practices_recommended-host-practices openshift_container_platform 推荐的 etcd 实践]&amp;lt;blockquote&amp;gt;就延迟而言，应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说，当有一个 20ms 的延迟时，使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群，建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字，您可以使用基准测试工具，如 fio。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;[https://www.jianshu.com/p/f31ef5e7bdd0 简书 - etcd 性能测试与调优]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://bbs.pceva.com.cn/thread-24244-1-1.html 对硬盘性能的深度解析之二]&amp;lt;blockquote&amp;gt;IO延迟与Queue Depth（队列深度）/Queue Length （队列长度）&lt;br /&gt;
&lt;br /&gt;
IO延迟是指控制器将IO指令发出之后，直到IO完成的过程中总共花费的时间。早前业界不成文的规定为，只要IO延迟在20ms内，IO性能对于应用程序来说都是可以接受的，但是如果大于20ms，应用程序的性能将会受到较大影响。（JMF602的小文件随机写入IOPS是个位数，所以你们觉得卡）&lt;br /&gt;
&lt;br /&gt;
这样算下来，存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS，所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近（7200转），固态硬盘的话就比较夸张了，对于大型的存储设备，通过并行N个IO通道工作，达到几十万甚至几百万IOPS都不是问题。&lt;br /&gt;
&lt;br /&gt;
然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候，IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘，即使延迟平均在0.1ms的话，每个IO通道的IOPS=1000/0.1=10000，但是这块固态硬盘被厂家标称35000的读取IOPS，这里就引出另一个概念：Queue Depth（队列深度，也可以叫队列长度)&lt;br /&gt;
&lt;br /&gt;
控制器向存储设备发起的指令，不是一条条发送的，而是一批批的发送，存储目标设备批量执行IO，然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强，在IO比较少的时候，处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数，由控制器上的Queue Depth（队列深度）决定。（一般好的固态硬盘主控，队列深度都支持到32了）&lt;br /&gt;
&lt;br /&gt;
如果给出队列深度，IOPS，IO延迟三者中的任意两者，则可以推算出第三者，公式：IOPS=(队列深度）/ (IO延迟）。实际上，随着队列深度的增加，IO延迟也在增加，二者是互相促进的关系，所以，随着IO数目的增多，将很快达到存储设备提供的最大IOPS处理能力，此时IO延迟将会陡峭升高，而IOPS则增加缓慢。（消化不良）&amp;lt;/blockquote&amp;gt;[https://etcd.io/docs/v3.5/faq/#what-does-the-etcd-warning-failed-to-send-out-heartbeat-on-time-mean wal_fsync_duration_seconds 官方建议] &amp;lt;blockquote&amp;gt;Usually this issue is caused by a slow disk. Before the leader sends heartbeats attached with metadata, it may need to persist the metadata to disk. The disk could be experiencing contention among etcd and other applications, or the disk is too simply slow (e.g., a shared virtualized disk). To rule out a slow disk from causing this warning, monitor wal_fsync_duration_seconds (p99 duration should be less than 10ms) to confirm the disk is reasonably fast. If the disk is too slow, assigning a dedicated disk to etcd or using faster disk will typically solve the problem. To tell whether a disk is fast enough for etcd, a benchmarking tool such as fio can be used. Read here for an example.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1688</id>
		<title>Kubectl随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1688"/>
		<updated>2026-01-28T06:33:30Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== kubectl set default editor ===&lt;br /&gt;
 export  KUBE_EDITOR=/usr/bin/vim&lt;br /&gt;
&lt;br /&gt;
===kubectl completion bash not working 排障随记===&lt;br /&gt;
需要已经安装 bash-completion &lt;br /&gt;
&lt;br /&gt;
如果提示  &amp;lt;code&amp;gt;_get_comp_words_by_ref: command not found&amp;lt;/code&amp;gt; 错误的话，需要执行&lt;br /&gt;
 source /usr/share/bash-completion/bash_completion&lt;br /&gt;
执行命令 &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; 看一下当前环境的相关配置有没有kube相关项&lt;br /&gt;
 set | grep -i kube&lt;br /&gt;
没有的话需要执行&lt;br /&gt;
 source &amp;lt;(kubectl completion bash)&lt;br /&gt;
&lt;br /&gt;
正常的话,打开 kubectl debug&lt;br /&gt;
 __kubectl_debug() {&lt;br /&gt;
    if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then&lt;br /&gt;
        echo &amp;quot;$*&amp;quot; &amp;gt;&amp;gt; &amp;quot;${BASH_COMP_DEBUG_FILE}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 export BASH_COMP_DEBUG_FILE=****&lt;br /&gt;
根据debug file里面的记录去排查出错点&lt;br /&gt;
&lt;br /&gt;
=== kubectl to get all api-resource and filter by verbs ===&lt;br /&gt;
 kubectl api-resources -o name --cached --request-timeout=5s --verbs=get&lt;br /&gt;
&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io&lt;br /&gt;
&lt;br /&gt;
==== get groupVersion when a resource exists in multiple api groups ====&lt;br /&gt;
&lt;br /&gt;
==== explain api-resource with sprcific api version ====&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io -v8 2&amp;gt;&amp;amp;1| grep ingress&lt;br /&gt;
&lt;br /&gt;
 kubectl explain ingress --api-version=&amp;quot;networking.k8s.io/v1beta1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===&lt;br /&gt;
 kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d&lt;br /&gt;
&lt;br /&gt;
=== Check k8s account privilege / k8s 对象权限相关 ===&lt;br /&gt;
 kubectl options:&lt;br /&gt;
     --as=: Username to impersonate for the operation&lt;br /&gt;
     --as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.&lt;br /&gt;
假设有名为registry-test的serviceAccount位于kube-system，这时候我们要测试他的RBAC权限，可以使用如下命令&lt;br /&gt;
 kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; get serviceaccount&lt;br /&gt;
&lt;br /&gt;
 Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]&lt;br /&gt;
 &lt;br /&gt;
 # Check to see if I can do everything in my current namespace (&amp;quot;*&amp;quot; means all)&lt;br /&gt;
 kubectl auth can-i '*' '*'&lt;br /&gt;
&lt;br /&gt;
 [root@node-a ~]# kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; auth can-i list pods&lt;br /&gt;
 yes&lt;br /&gt;
PS: 在RBAC定义中(例如role / clusterrole)对 &amp;lt;code&amp;gt;resources&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;pods/*&amp;lt;/code&amp;gt; 声明不会对诸如 &amp;lt;code&amp;gt;pods/exec pods/log pods/status&amp;lt;/code&amp;gt; 等资源授权起效果&lt;br /&gt;
&lt;br /&gt;
原因: [[K8s-rbac关于子资源授权的一些记录]]&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单)===&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出pod所在租户，pod名字和pod uid=====&lt;br /&gt;
 kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出namespace名字和ns annotation中定义的node selector=====&lt;br /&gt;
 kubectl get namespaces -o custom-columns=&amp;quot;NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector&amp;quot;&lt;br /&gt;
按照节点输出基础统计信息及CPU&amp;amp;内存信息&lt;br /&gt;
 kubectl get nodes -o custom-columns='NAME:.metadata.name,STATUS:.status.conditions[?(@.type==&amp;quot;Ready&amp;quot;)].status,AGE:.metadata.creationTimestamp,VERSION:.status.nodeInfo.kubeletVersion,INTERNAL-IP:.status.addresses[?(@.type==&amp;quot;InternalIP&amp;quot;)].address,OS-IMAGE:.status.nodeInfo.osImage,KERNEL-VERSION:.status.nodeInfo.kernelVersion,CONTAINER-RUNTIME:.status.nodeInfo.containerRuntimeVersion,CPU-CAPACITY:.status.capacity.cpu,MEMORY-CAPACITY:.status.capacity.memory'&lt;br /&gt;
&lt;br /&gt;
===Get node info order by node ip address / 根据ip地址排序获取节点信息===&lt;br /&gt;
 kubectl get nodes -owide --sort-by status.addresses[0].address&lt;br /&gt;
&lt;br /&gt;
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===&lt;br /&gt;
 kubectl get pods -owide --sort-by .spec.nodeName&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -owide --sort-by spec.nodeName&lt;br /&gt;
===Get pod order  by pod create time / 根据pod创建时间排序获取pod===&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac&lt;br /&gt;
&lt;br /&gt;
=== GET Pod Volumes / 获取某个租户下所有pod所绑定的volumes (依赖jq) ===&lt;br /&gt;
过滤了 POD 所挂载的 k8s service account token&lt;br /&gt;
 kubectl get pods -n ${your_name_space} -o json | jq -r '.items[] | [&lt;br /&gt;
   .metadata.name,&lt;br /&gt;
   ([.spec.volumes[] | select(.name | startswith(&amp;quot;kube-api-access&amp;quot;) | not)] | tostring)&lt;br /&gt;
 ] | @tsv' | column -t&lt;br /&gt;
&lt;br /&gt;
* @tsv是为了将输出格式化成两列，column命令在这里起到对齐的作用&lt;br /&gt;
如果需要过滤configmap和secret，也可以用命令&lt;br /&gt;
 kubectl get pods -n ${your_name_space} -o json | jq -r '.items[] | [&lt;br /&gt;
   .metadata.name,&lt;br /&gt;
   ([.spec.volumes[] | &lt;br /&gt;
   select( (.name | startswith(&amp;quot;kube-api-access&amp;quot;) | not) &lt;br /&gt;
     and (.configMap == null) &lt;br /&gt;
     and (.secret == null) )] | tostring)&lt;br /&gt;
 ] | @tsv' | column -t&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本)===&lt;br /&gt;
&lt;br /&gt;
====Deployments - image / 只获取deployment名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.template.spec.containers}}{{.image}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
稍微格式化输出，输出deployment名字 + container名字 + 对应的image&lt;br /&gt;
 kubectl get deployments.apps -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range .spec.template.spec.containers}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.image}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
====Pods - image / 只获取pod名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.containers}}{{.image}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type &amp;quot;InternalIP&amp;quot; }}{{.address}}{{end}}{{end}}{{end}}{{&amp;quot;\n&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get node taints / 只获取节点名字和taints====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes  -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Get node labels and format output / 只获取节点名字和labels并格式化输出 ====&lt;br /&gt;
 kubectl get node -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range $key, $value := .metadata.labels}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\t\t&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$key}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$value}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
==== 获取namespace名字和ns annotation中定义的node selector ====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot; -}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===== 稍微处理一下，格式化对齐输出 =====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{if index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{else}}&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件===&lt;br /&gt;
 kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}&lt;br /&gt;
&lt;br /&gt;
===kubectl get event sort by lastTime / 根据事件最后触发时间进行排序===&lt;br /&gt;
 kubectl get event -n kube-system --sort-by=.lastTimestamp&lt;br /&gt;
&lt;br /&gt;
=== kubectl patch ===&lt;br /&gt;
[[K8s的patch命令随记]]&lt;br /&gt;
&lt;br /&gt;
kubectl patch 调整 annotation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl patch ns demo -p '{&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;: &amp;quot;kubernetes.io/hostname=node1&amp;quot;}}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1687</id>
		<title>Kubectl随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1687"/>
		<updated>2025-11-12T11:03:01Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== kubectl set default editor ===&lt;br /&gt;
 export  KUBE_EDITOR=/usr/bin/vim&lt;br /&gt;
&lt;br /&gt;
===kubectl completion bash not working 排障随记===&lt;br /&gt;
需要已经安装 bash-completion &lt;br /&gt;
&lt;br /&gt;
如果提示  &amp;lt;code&amp;gt;_get_comp_words_by_ref: command not found&amp;lt;/code&amp;gt; 错误的话，需要执行&lt;br /&gt;
 source /usr/share/bash-completion/bash_completion&lt;br /&gt;
执行命令 &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; 看一下当前环境的相关配置有没有kube相关项&lt;br /&gt;
 set | grep -i kube&lt;br /&gt;
没有的话需要执行&lt;br /&gt;
 source &amp;lt;(kubectl completion bash)&lt;br /&gt;
&lt;br /&gt;
正常的话,打开 kubectl debug&lt;br /&gt;
 __kubectl_debug() {&lt;br /&gt;
    if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then&lt;br /&gt;
        echo &amp;quot;$*&amp;quot; &amp;gt;&amp;gt; &amp;quot;${BASH_COMP_DEBUG_FILE}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 export BASH_COMP_DEBUG_FILE=****&lt;br /&gt;
根据debug file里面的记录去排查出错点&lt;br /&gt;
&lt;br /&gt;
=== kubectl to get all api-resource and filter by verbs ===&lt;br /&gt;
 kubectl api-resources -o name --cached --request-timeout=5s --verbs=get&lt;br /&gt;
&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io&lt;br /&gt;
&lt;br /&gt;
==== get groupVersion when a resource exists in multiple api groups ====&lt;br /&gt;
&lt;br /&gt;
==== explain api-resource with sprcific api version ====&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io -v8 2&amp;gt;&amp;amp;1| grep ingress&lt;br /&gt;
&lt;br /&gt;
 kubectl explain ingress --api-version=&amp;quot;networking.k8s.io/v1beta1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===&lt;br /&gt;
 kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d&lt;br /&gt;
&lt;br /&gt;
=== Check k8s account privilege / k8s 对象权限相关 ===&lt;br /&gt;
 kubectl options:&lt;br /&gt;
     --as=: Username to impersonate for the operation&lt;br /&gt;
     --as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.&lt;br /&gt;
假设有名为registry-test的serviceAccount位于kube-system，这时候我们要测试他的RBAC权限，可以使用如下命令&lt;br /&gt;
 kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; get serviceaccount&lt;br /&gt;
&lt;br /&gt;
 Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]&lt;br /&gt;
 &lt;br /&gt;
 # Check to see if I can do everything in my current namespace (&amp;quot;*&amp;quot; means all)&lt;br /&gt;
 kubectl auth can-i '*' '*'&lt;br /&gt;
&lt;br /&gt;
 [root@node-a ~]# kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; auth can-i list pods&lt;br /&gt;
 yes&lt;br /&gt;
PS: 在RBAC定义中(例如role / clusterrole)对 &amp;lt;code&amp;gt;resources&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;pods/*&amp;lt;/code&amp;gt; 声明不会对诸如 &amp;lt;code&amp;gt;pods/exec pods/log pods/status&amp;lt;/code&amp;gt; 等资源授权起效果&lt;br /&gt;
&lt;br /&gt;
原因: [[K8s-rbac关于子资源授权的一些记录]]&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单)===&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出pod所在租户，pod名字和pod uid=====&lt;br /&gt;
 kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出namespace名字和ns annotation中定义的node selector=====&lt;br /&gt;
 kubectl get namespaces -o custom-columns=&amp;quot;NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Get node info order by node ip address / 根据ip地址排序获取节点信息===&lt;br /&gt;
 kubectl get nodes -owide --sort-by status.addresses[0].address&lt;br /&gt;
&lt;br /&gt;
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===&lt;br /&gt;
 kubectl get pods -owide --sort-by .spec.nodeName&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -owide --sort-by spec.nodeName&lt;br /&gt;
===Get pod order  by pod create time / 根据pod创建时间排序获取pod===&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac&lt;br /&gt;
&lt;br /&gt;
=== GET Pod Volumes / 获取某个租户下所有pod所绑定的volumes (依赖jq) ===&lt;br /&gt;
过滤了 POD 所挂载的 k8s service account token&lt;br /&gt;
 kubectl get pods -n ${your_name_space} -o json | jq -r '.items[] | [&lt;br /&gt;
   .metadata.name,&lt;br /&gt;
   ([.spec.volumes[] | select(.name | startswith(&amp;quot;kube-api-access&amp;quot;) | not)] | tostring)&lt;br /&gt;
 ] | @tsv' | column -t&lt;br /&gt;
&lt;br /&gt;
* @tsv是为了将输出格式化成两列，column命令在这里起到对齐的作用&lt;br /&gt;
如果需要过滤configmap和secret，也可以用命令&lt;br /&gt;
 kubectl get pods -n ${your_name_space} -o json | jq -r '.items[] | [&lt;br /&gt;
   .metadata.name,&lt;br /&gt;
   ([.spec.volumes[] | &lt;br /&gt;
   select( (.name | startswith(&amp;quot;kube-api-access&amp;quot;) | not) &lt;br /&gt;
     and (.configMap == null) &lt;br /&gt;
     and (.secret == null) )] | tostring)&lt;br /&gt;
 ] | @tsv' | column -t&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本)===&lt;br /&gt;
&lt;br /&gt;
====Deployments - image / 只获取deployment名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.template.spec.containers}}{{.image}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
稍微格式化输出，输出deployment名字 + container名字 + 对应的image&lt;br /&gt;
 kubectl get deployments.apps -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range .spec.template.spec.containers}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.image}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
====Pods - image / 只获取pod名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.containers}}{{.image}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type &amp;quot;InternalIP&amp;quot; }}{{.address}}{{end}}{{end}}{{end}}{{&amp;quot;\n&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get node taints / 只获取节点名字和taints====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes  -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Get node labels and format output / 只获取节点名字和labels并格式化输出 ====&lt;br /&gt;
 kubectl get node -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range $key, $value := .metadata.labels}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\t\t&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$key}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$value}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
==== 获取namespace名字和ns annotation中定义的node selector ====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot; -}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===== 稍微处理一下，格式化对齐输出 =====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{if index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{else}}&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件===&lt;br /&gt;
 kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}&lt;br /&gt;
&lt;br /&gt;
===kubectl get event sort by lastTime / 根据事件最后触发时间进行排序===&lt;br /&gt;
 kubectl get event -n kube-system --sort-by=.lastTimestamp&lt;br /&gt;
&lt;br /&gt;
=== kubectl patch ===&lt;br /&gt;
[[K8s的patch命令随记]]&lt;br /&gt;
&lt;br /&gt;
kubectl patch 调整 annotation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl patch ns demo -p '{&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;: &amp;quot;kubernetes.io/hostname=node1&amp;quot;}}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1686</id>
		<title>Kubectl随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1686"/>
		<updated>2025-11-12T10:40:36Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== kubectl set default editor ===&lt;br /&gt;
 export  KUBE_EDITOR=/usr/bin/vim&lt;br /&gt;
&lt;br /&gt;
===kubectl completion bash not working 排障随记===&lt;br /&gt;
需要已经安装 bash-completion &lt;br /&gt;
&lt;br /&gt;
如果提示  &amp;lt;code&amp;gt;_get_comp_words_by_ref: command not found&amp;lt;/code&amp;gt; 错误的话，需要执行&lt;br /&gt;
 source /usr/share/bash-completion/bash_completion&lt;br /&gt;
执行命令 &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; 看一下当前环境的相关配置有没有kube相关项&lt;br /&gt;
 set | grep -i kube&lt;br /&gt;
没有的话需要执行&lt;br /&gt;
 source &amp;lt;(kubectl completion bash)&lt;br /&gt;
&lt;br /&gt;
正常的话,打开 kubectl debug&lt;br /&gt;
 __kubectl_debug() {&lt;br /&gt;
    if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then&lt;br /&gt;
        echo &amp;quot;$*&amp;quot; &amp;gt;&amp;gt; &amp;quot;${BASH_COMP_DEBUG_FILE}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 export BASH_COMP_DEBUG_FILE=****&lt;br /&gt;
根据debug file里面的记录去排查出错点&lt;br /&gt;
&lt;br /&gt;
=== kubectl to get all api-resource and filter by verbs ===&lt;br /&gt;
 kubectl api-resources -o name --cached --request-timeout=5s --verbs=get&lt;br /&gt;
&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io&lt;br /&gt;
&lt;br /&gt;
==== get groupVersion when a resource exists in multiple api groups ====&lt;br /&gt;
&lt;br /&gt;
==== explain api-resource with sprcific api version ====&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io -v8 2&amp;gt;&amp;amp;1| grep ingress&lt;br /&gt;
&lt;br /&gt;
 kubectl explain ingress --api-version=&amp;quot;networking.k8s.io/v1beta1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===&lt;br /&gt;
 kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d&lt;br /&gt;
&lt;br /&gt;
=== Check k8s account privilege / k8s 对象权限相关 ===&lt;br /&gt;
 kubectl options:&lt;br /&gt;
     --as=: Username to impersonate for the operation&lt;br /&gt;
     --as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.&lt;br /&gt;
假设有名为registry-test的serviceAccount位于kube-system，这时候我们要测试他的RBAC权限，可以使用如下命令&lt;br /&gt;
 kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; get serviceaccount&lt;br /&gt;
&lt;br /&gt;
 Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]&lt;br /&gt;
 &lt;br /&gt;
 # Check to see if I can do everything in my current namespace (&amp;quot;*&amp;quot; means all)&lt;br /&gt;
 kubectl auth can-i '*' '*'&lt;br /&gt;
&lt;br /&gt;
 [root@node-a ~]# kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; auth can-i list pods&lt;br /&gt;
 yes&lt;br /&gt;
PS: 在RBAC定义中(例如role / clusterrole)对 &amp;lt;code&amp;gt;resources&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;pods/*&amp;lt;/code&amp;gt; 声明不会对诸如 &amp;lt;code&amp;gt;pods/exec pods/log pods/status&amp;lt;/code&amp;gt; 等资源授权起效果&lt;br /&gt;
&lt;br /&gt;
原因: [[K8s-rbac关于子资源授权的一些记录]]&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单)===&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出pod所在租户，pod名字和pod uid=====&lt;br /&gt;
 kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出namespace名字和ns annotation中定义的node selector=====&lt;br /&gt;
 kubectl get namespaces -o custom-columns=&amp;quot;NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Get node info order by node ip address / 根据ip地址排序获取节点信息===&lt;br /&gt;
 kubectl get nodes -owide --sort-by status.addresses[0].address&lt;br /&gt;
&lt;br /&gt;
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===&lt;br /&gt;
 kubectl get pods -owide --sort-by .spec.nodeName&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -owide --sort-by spec.nodeName&lt;br /&gt;
===Get pod order  by pod create time / 根据pod创建时间排序获取pod===&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac&lt;br /&gt;
&lt;br /&gt;
=== GET Pod Volumes / 获取某个租户下所有pod所绑定的volumes (依赖jq) ===&lt;br /&gt;
过滤了 POD 所挂载的 k8s service account token&lt;br /&gt;
 kubectl get pods -n ${your-name-space} -o json | jq -r '.items[] | [&lt;br /&gt;
   .metadata.name,&lt;br /&gt;
   ([.spec.volumes[] | select(.name | startswith(&amp;quot;kube-api-access&amp;quot;) | not)] | tostring)&lt;br /&gt;
 ] | @tsv' | column -t&lt;br /&gt;
&lt;br /&gt;
* @tsv是为了将输出格式化成两列，column命令在这里起到对齐的作用&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本)===&lt;br /&gt;
&lt;br /&gt;
====Deployments - image / 只获取deployment名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.template.spec.containers}}{{.image}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
稍微格式化输出，输出deployment名字 + container名字 + 对应的image&lt;br /&gt;
 kubectl get deployments.apps -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range .spec.template.spec.containers}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.image}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
====Pods - image / 只获取pod名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.containers}}{{.image}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type &amp;quot;InternalIP&amp;quot; }}{{.address}}{{end}}{{end}}{{end}}{{&amp;quot;\n&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get node taints / 只获取节点名字和taints====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes  -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Get node labels and format output / 只获取节点名字和labels并格式化输出 ====&lt;br /&gt;
 kubectl get node -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range $key, $value := .metadata.labels}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\t\t&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$key}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$value}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
==== 获取namespace名字和ns annotation中定义的node selector ====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot; -}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===== 稍微处理一下，格式化对齐输出 =====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{if index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{else}}&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件===&lt;br /&gt;
 kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}&lt;br /&gt;
&lt;br /&gt;
===kubectl get event sort by lastTime / 根据事件最后触发时间进行排序===&lt;br /&gt;
 kubectl get event -n kube-system --sort-by=.lastTimestamp&lt;br /&gt;
&lt;br /&gt;
=== kubectl patch ===&lt;br /&gt;
[[K8s的patch命令随记]]&lt;br /&gt;
&lt;br /&gt;
kubectl patch 调整 annotation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl patch ns demo -p '{&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;: &amp;quot;kubernetes.io/hostname=node1&amp;quot;}}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Docker%E6%8B%89%E5%8F%96%E9%95%9C%E5%83%8F%E8%AE%A4%E8%AF%81%E6%8A%A5%E6%96%87%E7%AE%80%E6%9E%90&amp;diff=1685</id>
		<title>Docker拉取镜像认证报文简析</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Docker%E6%8B%89%E5%8F%96%E9%95%9C%E5%83%8F%E8%AE%A4%E8%AF%81%E6%8A%A5%E6%96%87%E7%AE%80%E6%9E%90&amp;diff=1685"/>
		<updated>2025-10-28T08:52:40Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候会有一些奇怪的镜像操作需要用到curl等工具去实现，遂有了本篇记录&lt;br /&gt;
&lt;br /&gt;
这里主要记录集中与registry API交互过程中，auth -&amp;gt; get  manifest info部分&lt;br /&gt;
&lt;br /&gt;
=== 针对 hub.docker.com 例子 ===&lt;br /&gt;
&amp;quot; 一个 docker pull 指令会拉两部分，一部分是 manifest，一部分是 layer，前者指定了一个 image 相关的信息和 layer 的信息（一个 JSON 文件），后者就是一些大文件（layer）&amp;quot;&lt;br /&gt;
&lt;br /&gt;
会用到的关联域名:&lt;br /&gt;
&lt;br /&gt;
Location of Docker index: &amp;lt;nowiki&amp;gt;https://index.docker.io/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Location of the remote repository: &amp;lt;nowiki&amp;gt;https://registry-1.docker.io&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
实现:&lt;br /&gt;
&lt;br /&gt;
假设需要拉取的镜像为alpine:3.17.0_rc1 即:&lt;br /&gt;
 ➤ docker pull alpine:3.17.0_rc1&lt;br /&gt;
那么在curl中的实现即为(是的，他有个library!):&lt;br /&gt;
 ➤ curl &amp;lt;nowiki&amp;gt;https://registry-1.docker.io/v2/library/alpine/manifests/3.17.0_rc1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
这时候直接请求是会401的，要根据返回的www-authenticate header去进行认证&lt;br /&gt;
 * Mark bundle as not supporting multiuse&lt;br /&gt;
 &amp;lt; HTTP/1.1 401 Unauthorized&lt;br /&gt;
 &amp;lt; content-type: application/json&lt;br /&gt;
 &amp;lt; docker-distribution-api-version: registry/2.0&lt;br /&gt;
 &amp;lt; www-authenticate: Bearer realm=&amp;quot;&amp;lt;nowiki&amp;gt;https://auth.docker.io/token&amp;lt;/nowiki&amp;gt;&amp;quot;,service=&amp;quot;registry.docker.io&amp;quot;,scope=&amp;quot;repository:library/alpine:pull&amp;quot;&lt;br /&gt;
 &amp;lt; date: Sun, 20 Nov 2022 09:08:33 GMT&lt;br /&gt;
 &amp;lt; content-length: 157&lt;br /&gt;
 &amp;lt; strict-transport-security: max-age=31536000&lt;br /&gt;
 &amp;lt; docker-ratelimit-source: 8.210.192.22&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 {&amp;quot;errors&amp;quot;:[{&amp;quot;code&amp;quot;:&amp;quot;UNAUTHORIZED&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;authentication required&amp;quot;,&amp;quot;detail&amp;quot;:[{&amp;quot;Type&amp;quot;:&amp;quot;repository&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Name&amp;quot;:&amp;quot;library/alpine&amp;quot;,&amp;quot;Action&amp;quot;:&amp;quot;pull&amp;quot;}]}]}&lt;br /&gt;
 * Connection #1 to host registry-1.docker.io left intact&lt;br /&gt;
根据回显进行认证(匿名认证):&lt;br /&gt;
&lt;br /&gt;
注意这里的service也是需要一一对应的，scope value可以不进行URL编码&lt;br /&gt;
 ➤ curl &amp;quot;&amp;lt;nowiki&amp;gt;https://auth.docker.io/token?scope=repository%3Alibrary%2Falpine%3Apull&amp;amp;service=registry.docker.io&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
 {&amp;quot;token&amp;quot;:&amp;quot;eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDK1RDQ0FwK2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXp0U1RVbEdPbEZNUmpRNlEwZFFNenBSTWtWYU9sRklSRUk2VkVkRlZUcFZTRlZNT2taTVZqUTZSMGRXV2pwQk5WUkhPbFJMTkZNNlVVeElTVEFlRncweU1qQXhNVEF5TWpJeE5EbGFGdzB5TXpBeE1qVXlNakl4TkRsYU1FWXhSREJDQmdOVkJBTVRPMUJaUTFJNlNWQmFRanBJUWxGWE9qZE1SVms2UWtGV1FqcEhTRGRhT2xWSVZ6TTZVa3RMVWpwRE4wNHpPbGxOTkZJNlNWaE5TRHBLVkZCQ01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbE5JOGFtMlBERnZzNndOeVl2d0dkZWZXVXJXQWdMZ3N2MzA2MnZycG5VNkN0WUpEZDZ2K2NEVG1FN1FlTllEaFMyaU1wU3djZkRCL2RFclEwdnhIZE4ycDIvODZmZy9TeWlIMnhmMGFVTjlDV1dud0JPaTIvS3hLditpbFNlQ01HYXRwRlg3SmYxcWI4N0Q5NUxOVDBvOU9OTmYxT3RidjY5ck9tL1RIVFh3clUvV3dTZlUyWktUbEw4SVRXRkRXN09ZK3hXdUJ0WUpteVhqcVpsaWRBbUNTdTdHY0Y0MVB5em9KTFFTMnJCdXJwOXc0cWgxMFk1bUNIcWdsaEI1Rk9aOUs0T2pUaVhUUHJFUk5WcnArUFVIR3JBYVRPRTBwQzgyUHBuWVZhNzNDUkdsMEdDdC9RckJwVjRpdmswdzF0eEtkV1NiSDNnRmtqZ2g1N0tOcDhRSURBUUFCbzRHeU1JR3ZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1FUUdBMVVkRGdROUJEdFFXVU5TT2tsUVdrSTZTRUpSVnpvM1RFVlpPa0pCVmtJNlIwZzNXanBWU0Zjek9sSkxTMUk2UXpkT016cFpUVFJTT2tsWVRVZzZTbFJRUWpCR0JnTlZIU01FUHpBOWdEdFNUVWxHT2xGTVJqUTZRMGRRTXpwUk1rVmFPbEZJUkVJNlZFZEZWVHBWU0ZWTU9rWk1WalE2UjBkV1dqcEJOVlJIT2xSTE5GTTZVVXhJU1RBS0JnZ3Foa2pPUFFRREFnTklBREJGQWlFQTdIY1VyVm1namo1cE01MXhZVHd2eGE1VnRqd2hub0dRZjFxTU52UGVHeVlDSUFwYm4vWFkvS1F5WWFWRnRjMWtsb0lmZzd4L3hlbkZhbkp4L0F2cURGdFgiXX0.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvYWxwaW5lIiwiYWN0aW9ucyI6WyJwdWxsIl0sInBhcmFtZXRlcnMiOnsicHVsbF9saW1pdCI6IjEwMCIsInB1bGxfbGltaXRfaW50ZXJ2YWwiOiIyMTYwMCJ9fV0sImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5pbyIsImV4cCI6MTY2ODkzNTY5MiwiaWF0IjoxNjY4OTM1MzkyLCJpc3MiOiJhdXRoLmRvY2tlci5pbyIsImp0aSI6ImRja3JfanRpX19FanZUOWtRS041YVJSZXUybE51WWROQU84VT0iLCJuYmYiOjE2Njg5MzUwOTIsInN1YiI6IiJ9.WcwQ-5wGEUUXsET0cqfWGwk-zAxx5HCSdRPNKi47oM04qeybNolZQejeFYsH-yiEEnQU8X0qoYSrJoy77xMaOAfTw_k2V4bYdKNct16g1WKpkQadd5hubIWShL59JblIhC21gfO30KcVcbsoZiepRKfCwCJ5vVm_Zt8BLsqIySTLnV-Vfyd_jCvSuNNpnOpC2r7ChTGTeUslRfMl2ZK4UGzCIy6rYwgcp4at5d_GLVyjZtS50WAmPlb9xBcawCZE3ulzGc7H9-OcmAtP04GV5exkQ9G34cfGdPvjKmwA1PkD6dQf2nsDE31LxeGqJcWdw7cYyGo31yPFHGJmQ905xQ&amp;quot;,&amp;quot;access_token&amp;quot;:&amp;quot;xxxxxxxxxxxxxxx&amp;quot;,&amp;quot;expires_in&amp;quot;:300,&amp;quot;issued_at&amp;quot;:&amp;quot;2022-11-20T09:09:52.106027636Z&amp;quot;}&lt;br /&gt;
拿到需要的token，在http header中带上token，重新请求manifests信息&lt;br /&gt;
&lt;br /&gt;
注意这里的实例是一种application/vnd.docker.distribution.manifest.v1+prettyjws类型的manifests信息(具体返回的是什么类型的镜像格式同样可以在http response header: content-type 看出来)&lt;br /&gt;
 ➤ curl &amp;lt;nowiki&amp;gt;https://registry-1.docker.io/v2/library/alpine/manifests/3.17.0_rc1&amp;lt;/nowiki&amp;gt; -H &amp;quot;Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDK1RDQ0FwK2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXp0U1RVbEdPbEZNUmpRNlEwZFFNenBSTWtWYU9sRklSRUk2VkVkRlZUcFZTRlZNT2taTVZqUTZSMGRXV2pwQk5WUkhPbFJMTkZNNlVVeElTVEFlRncweU1qQXhNVEF5TWpJeE5EbGFGdzB5TXpBeE1qVXlNakl4TkRsYU1FWXhSREJDQmdOVkJBTVRPMUJaUTFJNlNWQmFRanBJUWxGWE9qZE1SVms2UWtGV1FqcEhTRGRhT2xWSVZ6TTZVa3RMVWpwRE4wNHpPbGxOTkZJNlNWaE5TRHBLVkZCQ01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbE5JOGFtMlBERnZzNndOeVl2d0dkZWZXVXJXQWdMZ3N2MzA2MnZycG5VNkN0WUpEZDZ2K2NEVG1FN1FlTllEaFMyaU1wU3djZkRCL2RFclEwdnhIZE4ycDIvODZmZy9TeWlIMnhmMGFVTjlDV1dud0JPaTIvS3hLditpbFNlQ01HYXRwRlg3SmYxcWI4N0Q5NUxOVDBvOU9OTmYxT3RidjY5ck9tL1RIVFh3clUvV3dTZlUyWktUbEw4SVRXRkRXN09ZK3hXdUJ0WUpteVhqcVpsaWRBbUNTdTdHY0Y0MVB5em9KTFFTMnJCdXJwOXc0cWgxMFk1bUNIcWdsaEI1Rk9aOUs0T2pUaVhUUHJFUk5WcnArUFVIR3JBYVRPRTBwQzgyUHBuWVZhNzNDUkdsMEdDdC9RckJwVjRpdmswdzF0eEtkV1NiSDNnRmtqZ2g1N0tOcDhRSURBUUFCbzRHeU1JR3ZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1FUUdBMVVkRGdROUJEdFFXVU5TT2tsUVdrSTZTRUpSVnpvM1RFVlpPa0pCVmtJNlIwZzNXanBWU0Zjek9sSkxTMUk2UXpkT016cFpUVFJTT2tsWVRVZzZTbFJRUWpCR0JnTlZIU01FUHpBOWdEdFNUVWxHT2xGTVJqUTZRMGRRTXpwUk1rVmFPbEZJUkVJNlZFZEZWVHBWU0ZWTU9rWk1WalE2UjBkV1dqcEJOVlJIT2xSTE5GTTZVVXhJU1RBS0JnZ3Foa2pPUFFRREFnTklBREJGQWlFQTdIY1VyVm1namo1cE01MXhZVHd2eGE1VnRqd2hub0dRZjFxTU52UGVHeVlDSUFwYm4vWFkvS1F5WWFWRnRjMWtsb0lmZzd4L3hlbkZhbkp4L0F2cURGdFgiXX0.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvYWxwaW5lIiwiYWN0aW9ucyI6WyJwdWxsIl0sInBhcmFtZXRlcnMiOnsicHVsbF9saW1pdCI6IjEwMCIsInB1bGxfbGltaXRfaW50ZXJ2YWwiOiIyMTYwMCJ9fV0sImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5pbyIsImV4cCI6MTY2ODkzNTY5MiwiaWF0IjoxNjY4OTM1MzkyLCJpc3MiOiJhdXRoLmRvY2tlci5pbyIsImp0aSI6ImRja3JfanRpX19FanZUOWtRS041YVJSZXUybE51WWROQU84VT0iLCJuYmYiOjE2Njg5MzUwOTIsInN1YiI6IiJ9.WcwQ-5wGEUUXsET0cqfWGwk-zAxx5HCSdRPNKi47oM04qeybNolZQejeFYsH-yiEEnQU8X0qoYSrJoy77xMaOAfTw_k2V4bYdKNct16g1WKpkQadd5hubIWShL59JblIhC21gfO30KcVcbsoZiepRKfCwCJ5vVm_Zt8BLsqIySTLnV-Vfyd_jCvSuNNpnOpC2r7ChTGTeUslRfMl2ZK4UGzCIy6rYwgcp4at5d_GLVyjZtS50WAmPlb9xBcawCZE3ulzGc7H9-OcmAtP04GV5exkQ9G34cfGdPvjKmwA1PkD6dQf2nsDE31LxeGqJcWdw7cYyGo31yPFHGJmQ905xQ&amp;quot;&lt;br /&gt;
 {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;schemaVersion&amp;quot;: 1,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;name&amp;quot;: &amp;quot;library/alpine&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;tag&amp;quot;: &amp;quot;3.17.0_rc1&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;architecture&amp;quot;: &amp;quot;amd64&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;fsLayers&amp;quot;: [&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;blobSum&amp;quot;: &amp;quot;sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     },&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;blobSum&amp;quot;: &amp;quot;sha256:7b26c2f269ea232d8dd57ee7696652248b61fda9653d7c7f06a9fea2bd2f009e&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  ],&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;history&amp;quot;: [&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;v1Compatibility&amp;quot;: &amp;quot;{\&amp;quot;architecture\&amp;quot;:\&amp;quot;amd64\&amp;quot;,\&amp;quot;config\&amp;quot;:{\&amp;quot;Hostname\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;Domainname\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;User\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;AttachStdin\&amp;quot;:false,\&amp;quot;AttachStdout\&amp;quot;:false,\&amp;quot;AttachStderr\&amp;quot;:false,\&amp;quot;Tty\&amp;quot;:false,\&amp;quot;OpenStdin\&amp;quot;:false,\&amp;quot;StdinOnce\&amp;quot;:false,\&amp;quot;Env\&amp;quot;:[\&amp;quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\&amp;quot;],\&amp;quot;Cmd\&amp;quot;:[\&amp;quot;/bin/sh\&amp;quot;],\&amp;quot;Image\&amp;quot;:\&amp;quot;sha256:118ada46def154efd2774e3211fef3356ad1f268e143dba1136af919d7670b0b\&amp;quot;,\&amp;quot;Volumes\&amp;quot;:null,\&amp;quot;WorkingDir\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;Entrypoint\&amp;quot;:null,\&amp;quot;OnBuild\&amp;quot;:null,\&amp;quot;Labels\&amp;quot;:null},\&amp;quot;container\&amp;quot;:\&amp;quot;bcb0af1ba8750c9284eb4ae69a2d444d288ccc718e2f9d329f34bbbd06deaad5\&amp;quot;,\&amp;quot;container_config\&amp;quot;:{\&amp;quot;Hostname\&amp;quot;:\&amp;quot;bcb0af1ba875\&amp;quot;,\&amp;quot;Domainname\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;User\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;AttachStdin\&amp;quot;:false,\&amp;quot;AttachStdout\&amp;quot;:false,\&amp;quot;AttachStderr\&amp;quot;:false,\&amp;quot;Tty\&amp;quot;:false,\&amp;quot;OpenStdin\&amp;quot;:false,\&amp;quot;StdinOnce\&amp;quot;:false,\&amp;quot;Env\&amp;quot;:[\&amp;quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\&amp;quot;],\&amp;quot;Cmd\&amp;quot;:[\&amp;quot;/bin/sh\&amp;quot;,\&amp;quot;-c\&amp;quot;,\&amp;quot;#(nop) \&amp;quot;,\&amp;quot;CMD [\\\&amp;quot;/bin/sh\\\&amp;quot;]\&amp;quot;],\&amp;quot;Image\&amp;quot;:\&amp;quot;sha256:118ada46def154efd2774e3211fef3356ad1f268e143dba1136af919d7670b0b\&amp;quot;,\&amp;quot;Volumes\&amp;quot;:null,\&amp;quot;WorkingDir\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;Entrypoint\&amp;quot;:null,\&amp;quot;OnBuild\&amp;quot;:null,\&amp;quot;Labels\&amp;quot;:{}},\&amp;quot;created\&amp;quot;:\&amp;quot;2022-11-16T22:19:19.655513526Z\&amp;quot;,\&amp;quot;docker_version\&amp;quot;:\&amp;quot;20.10.12\&amp;quot;,\&amp;quot;id\&amp;quot;:\&amp;quot;fecb21f6263ecee0ce8a3d6c50c432b455c23f8afb7ebe929d54f6ca520b032b\&amp;quot;,\&amp;quot;os\&amp;quot;:\&amp;quot;linux\&amp;quot;,\&amp;quot;parent\&amp;quot;:\&amp;quot;f163dc23345785e0ac6ebc8d6c6262f19f2565ca420f0cd194c09e1029317881\&amp;quot;,\&amp;quot;throwaway\&amp;quot;:true}&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     },&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;v1Compatibility&amp;quot;: &amp;quot;{\&amp;quot;id\&amp;quot;:\&amp;quot;f163dc23345785e0ac6ebc8d6c6262f19f2565ca420f0cd194c09e1029317881\&amp;quot;,\&amp;quot;created\&amp;quot;:\&amp;quot;2022-11-16T22:19:19.533331062Z\&amp;quot;,\&amp;quot;container_config\&amp;quot;:{\&amp;quot;Cmd\&amp;quot;:[\&amp;quot;/bin/sh -c #(nop) ADD file:a7bed337c392105c21fe1c7067e51f5d0dedbc488b2be5daf17a18783fa29d04 in / \&amp;quot;]}}&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  ],&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  &amp;quot;signatures&amp;quot;: [&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;header&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           &amp;quot;jwk&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              &amp;quot;crv&amp;quot;: &amp;quot;P-256&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              &amp;quot;kid&amp;quot;: &amp;quot;GLVQ:OCEF:4TWE:RS63:BQJ5:VXYZ:EK7Y:DZQG:QNIT:4ZN3:PLT5:CBSK&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              &amp;quot;kty&amp;quot;: &amp;quot;EC&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              &amp;quot;x&amp;quot;: &amp;quot;Z4i5ZWH8GizJjOrkPpUAPT1lZH8frbh6XVlZZ6rwXtA&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              &amp;quot;y&amp;quot;: &amp;quot;EuvtBs7t1sKcHzX2t5WOsXAyT8jnuetPK_IsojxGb0E&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           },&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           &amp;quot;alg&amp;quot;: &amp;quot;ES256&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        },&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;signature&amp;quot;: &amp;quot;gJk_3VSshExIjeBeaLhprRpriQMANg5C-5inX-mBexjGHiAKTRjeg2c-JOcHnFpku_rdQFAEJdyLfCBkTFDKeA&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        &amp;quot;protected&amp;quot;: &amp;quot;eyJmb3JtYXRMZW5ndGgiOjIxMDEsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMi0xMS0yMFQwOToxMzoxNVoifQ&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  ]&lt;br /&gt;
 }&lt;br /&gt;
ps: 对于不存在的tag, hub.docker.com返回的是(http code: 404)&lt;br /&gt;
 {&amp;quot;errors&amp;quot;:[{&amp;quot;code&amp;quot;:&amp;quot;MANIFEST_UNKNOWN&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;manifest unknown&amp;quot;,&amp;quot;detail&amp;quot;:&amp;quot;unknown tag=3.17.0_rc2&amp;quot;}]}&lt;br /&gt;
&lt;br /&gt;
=== 题外话: 手动认证请求registry的 /_catalog接口的例子 ===&lt;br /&gt;
PS: 注意，有的镜像仓库&amp;lt;code&amp;gt;_catalog&amp;lt;/code&amp;gt; 接口认证实现不一样，例如harbor，访问&amp;lt;code&amp;gt;_catalog&amp;lt;/code&amp;gt;接口的时候，返回的401请求header里面包含了一个信息&amp;lt;code&amp;gt;www-authenticate: Basic realm=&amp;quot;harbor&amp;quot;&amp;lt;/code&amp;gt; 这意味着，在harbor中，这个接口只能通过harbor用户密码进行basic认证，而不是token认证。&lt;br /&gt;
&lt;br /&gt;
先匿名请求接口，遇到401&lt;br /&gt;
 # curl 10.10.217.241/v2/_catalog -v&lt;br /&gt;
 &lt;br /&gt;
 * About to connect() to 10.10.217.241 port 80 (#0)&lt;br /&gt;
 *   Trying 10.10.217.241...&lt;br /&gt;
 * Connected to 10.10.217.241 (10.10.217.241) port 80 (#0)&lt;br /&gt;
 &amp;gt; GET /v2/_catalog HTTP/1.1&lt;br /&gt;
 &amp;gt; User-Agent: curl/7.29.0&lt;br /&gt;
 &amp;gt; Host: 10.10.217.241&lt;br /&gt;
 &amp;gt; Accept: */*&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 &amp;lt; HTTP/1.1 401 Unauthorized&lt;br /&gt;
 &amp;lt; Server: nginx&lt;br /&gt;
 &amp;lt; Date: Wed, 24 May 2023 10:32:57 GMT&lt;br /&gt;
 &amp;lt; Content-Type: application/json; charset=utf-8&lt;br /&gt;
 &amp;lt; Content-Length: 145&lt;br /&gt;
 &amp;lt; Connection: keep-alive&lt;br /&gt;
 &amp;lt; Docker-Distribution-Api-Version: registry/2.0&lt;br /&gt;
 &amp;lt; Www-Authenticate: Bearer realm=&amp;quot;&amp;lt;nowiki&amp;gt;http://10.10.217.241/registry/token&amp;lt;/nowiki&amp;gt;&amp;quot;,service=&amp;quot;BUILDIN-REGISTRY&amp;quot;,scope=&amp;quot;registry:catalog:*&amp;quot;&lt;br /&gt;
 &amp;lt; X-Content-Type-Options: nosniff&lt;br /&gt;
 &amp;lt; Docker-Distribution-Api-Version: registry/2.0&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 {&amp;quot;errors&amp;quot;:[{&amp;quot;code&amp;quot;:&amp;quot;UNAUTHORIZED&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;authentication required&amp;quot;,&amp;quot;detail&amp;quot;:[{&amp;quot;Type&amp;quot;:&amp;quot;registry&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Name&amp;quot;:&amp;quot;catalog&amp;quot;,&amp;quot;Action&amp;quot;:&amp;quot;*&amp;quot;}]}]}&lt;br /&gt;
 * Connection #0 to host 10.10.217.241 left intact&lt;br /&gt;
获取token:&lt;br /&gt;
&lt;br /&gt;
注意这里的service也是需要一一对应的，scope value可以不进行URL编码&lt;br /&gt;
 # curl &amp;quot;&amp;lt;nowiki&amp;gt;http://10.10.217.241/registry/token?service=BUILDIN-REGISTRY&amp;amp;scope=registry:catalog:*&amp;lt;/nowiki&amp;gt;&amp;quot; -u admin:password-password&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;token&amp;quot;:&amp;quot;xxxx-token-x&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
带上token，成功请求:&lt;br /&gt;
 # curl 10.10.217.241/v2/_catalog -H &amp;quot;Authorization: Bearer xxxx-token-x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 {&amp;quot;repositories&amp;quot;:[xxxxxxxxxxxxxx]}&lt;br /&gt;
&lt;br /&gt;
=== Related articles ===&lt;br /&gt;
&lt;br /&gt;
* [https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&amp;amp;mid=2247493326&amp;amp;idx=1&amp;amp;sn=3e7415f94e8f4f99e0165ab2c089dee9 奇妙的Linux世界 - Docker Hub 镜像拉取有限制？手把手教你破解它！]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.docker.com/registry/spec/auth/token/ docker official doc: Token Authentication Specification]&lt;br /&gt;
&lt;br /&gt;
__强显目录__&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
[[分类:Docker]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1684</id>
		<title>容器进程因io导致cacheMemory较高处理随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1684"/>
		<updated>2025-10-22T10:20:17Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;就好像harbor的registry容器，因为经常有io，所以比较容易触发这种现象。 &lt;br /&gt;
&lt;br /&gt;
或者频繁追加写日志到文件的进程，也会触发这种现象  &lt;br /&gt;
&lt;br /&gt;
如果是cgroup2，就可以用cgroup2 的memory.high处理。找到相应的cgroup2路径，配置memory.high即可  &lt;br /&gt;
&lt;br /&gt;
以harbor为例&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 nerdctl ps | awk '/registry-photon/{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;&amp;lt;nowiki&amp;gt;{{json .Spec.linux.cgroupsPath}}&amp;lt;/nowiki&amp;gt;\&amp;quot; &amp;quot;$1}' | sh |cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;cat /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 nerdctl ps | awk '/registry-photon/{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;&amp;lt;nowiki&amp;gt;{{json .Spec.linux.cgroupsPath}}&amp;lt;/nowiki&amp;gt;\&amp;quot; &amp;quot;$1}' | sh |cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;echo 2G &amp;gt;  /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:container容器进程因io导致cacheMemory较高处理随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1683</id>
		<title>容器进程因io导致cacheMemory较高处理随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1683"/>
		<updated>2025-10-22T10:20:02Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;就好像harbor的registry容器，因为经常有io，所以比较容易触发这种现象。 &lt;br /&gt;
&lt;br /&gt;
或者频繁追加写日志到文件的进程，也会触发这种现象  &lt;br /&gt;
&lt;br /&gt;
如果是cgroup2，就可以用cgroup2 的mem.high处理。找到相应的cgroup2路径，配置mem.high即可  &lt;br /&gt;
&lt;br /&gt;
以harbor为例&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 nerdctl ps | awk '/registry-photon/{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;&amp;lt;nowiki&amp;gt;{{json .Spec.linux.cgroupsPath}}&amp;lt;/nowiki&amp;gt;\&amp;quot; &amp;quot;$1}' | sh |cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;cat /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 nerdctl ps | awk '/registry-photon/{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;&amp;lt;nowiki&amp;gt;{{json .Spec.linux.cgroupsPath}}&amp;lt;/nowiki&amp;gt;\&amp;quot; &amp;quot;$1}' | sh |cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;echo 2G &amp;gt;  /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:container容器进程因io导致cacheMemory较高处理随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1682</id>
		<title>容器进程因io导致cacheMemory较高处理随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1682"/>
		<updated>2025-10-22T10:19:17Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;就好像harbor的registry容器，因为经常有io，所以比较容易触发这种现象。 &lt;br /&gt;
&lt;br /&gt;
或者频繁追加写日志到文件的进程，也会触发这种现象  &lt;br /&gt;
&lt;br /&gt;
如果是cgroup2，就可以用cgroup2 的mem.high处理。找到相应的cgroup2路径，配置mem.high即可  &lt;br /&gt;
&lt;br /&gt;
以harbor为例&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
nerdctl ps|grep registry-photon|awk '{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;{{json .Spec.linux.cgroupsPath}}\&amp;quot; &amp;quot;$1}'|sh|cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;cat /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nerdctl ps|grep registry-photon|awk '{print &amp;quot;nerdctl inspect --mode native -f \&amp;quot;{{json .Spec.linux.cgroupsPath}}\&amp;quot; &amp;quot;$1}'|sh|cut -c 2-|cut -c -144|awk 'BEGIN{FS=&amp;quot;:&amp;quot;};{print &amp;quot;echo 2G &amp;gt;  /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/&amp;quot;$1&amp;quot;/&amp;quot;$2&amp;quot;-&amp;quot;$3&amp;quot;.scope/memory.high&amp;quot;}'&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:container容器进程因io导致cacheMemory较高处理随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1681</id>
		<title>容器进程因io导致cacheMemory较高处理随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E8%BF%9B%E7%A8%8B%E5%9B%A0io%E5%AF%BC%E8%87%B4cacheMemory%E8%BE%83%E9%AB%98%E5%A4%84%E7%90%86%E9%9A%8F%E8%AE%B0&amp;diff=1681"/>
		<updated>2025-10-22T10:18:45Z</updated>

		<summary type="html">&lt;p&gt;Admin：​创建页面，内容为“就好像harbor的registry容器，因为经常有io，所以比较容易触发这种现象。   或者频繁追加写日志到文件的进程，也会触发这种现象    如果是cgroup2，就可以用cgroup2 的mem.high处理。找到相应的cgroup2路径，配置mem.high即可    以harbor为例   ffffff 分类:K8s {{DEFAULTSORT:container容器进程因io导致cacheMemory较高处理随记}}”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;就好像harbor的registry容器，因为经常有io，所以比较容易触发这种现象。 &lt;br /&gt;
&lt;br /&gt;
或者频繁追加写日志到文件的进程，也会触发这种现象  &lt;br /&gt;
&lt;br /&gt;
如果是cgroup2，就可以用cgroup2 的mem.high处理。找到相应的cgroup2路径，配置mem.high即可  &lt;br /&gt;
&lt;br /&gt;
以harbor为例&lt;br /&gt;
&lt;br /&gt;
 ffffff&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:container容器进程因io导致cacheMemory较高处理随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1680</id>
		<title>Elasticsearch的一些api随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1680"/>
		<updated>2025-10-21T03:27:52Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Health===&lt;br /&gt;
 /_cat/health&lt;br /&gt;
&lt;br /&gt;
 /_cluster/health&lt;br /&gt;
&lt;br /&gt;
===Indices health===&lt;br /&gt;
按条件查看索引状态&lt;br /&gt;
 /_cat/indices?help&lt;br /&gt;
 /_cat/indices?health=red&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=yellow&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=green&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
注意在配合 * 通配符搜索/操作索引的时候，如果涉及隐藏的datastream / 隐藏的index，默认不会匹配命中，必须指定 &amp;lt;code&amp;gt;expand_wildcards=all&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; https://www.elastic.co/guide/en/elasticsearch/reference/7.16/multi-index.html#hidden&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
 /_cat/nodes?v&lt;br /&gt;
查看es各节点磁盘空间占用、分片数目等&lt;br /&gt;
 /_cat/allocation?v&lt;br /&gt;
&lt;br /&gt;
 /_cat/nodeattrs&lt;br /&gt;
&lt;br /&gt;
===Get master node===&lt;br /&gt;
 /_cat/master?v&lt;br /&gt;
&lt;br /&gt;
===Cluster allocation explain related===&lt;br /&gt;
可以用于定位分片状态以及分片为何故障&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
 /_cluster/allocation/explain&lt;br /&gt;
&lt;br /&gt;
===Shards===&lt;br /&gt;
粗略查看分片情况，特别是查看分片分布节点或大小/状态&lt;br /&gt;
 GET /_cat/shards&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_name&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_na*&lt;br /&gt;
查看分片分配失败原因&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
==== Recovery API ====&lt;br /&gt;
Returns information about ongoing and completed shard recoveries, similar to the index recovery API.&lt;br /&gt;
&lt;br /&gt;
For data streams, the API returns information about the stream’s backing indices&lt;br /&gt;
&lt;br /&gt;
可以查看当前正在 relocating 的分片，也能查到各分片处理进度百分比&lt;br /&gt;
 GET /_cat/recovery?active_only=true&amp;amp;s=index&amp;amp;v&lt;br /&gt;
&lt;br /&gt;
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===&lt;br /&gt;
为别名设置可写索引或数据流&lt;br /&gt;
&lt;br /&gt;
If the alias doesn’t exist, the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; action creates it.&lt;br /&gt;
 POST /_aliases &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;actions&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
             &amp;quot;add&amp;quot;: {&lt;br /&gt;
                &amp;quot;index&amp;quot;: &amp;quot;es-k8s-logs-000020&amp;quot;,    &lt;br /&gt;
                &amp;quot;alias&amp;quot;: &amp;quot;es-k8s-logs-alias&amp;quot;,    &lt;br /&gt;
                &amp;quot;is_write_index&amp;quot;: true &lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Thread pool related===&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html&lt;br /&gt;
 /_cluster/settings?pretty&amp;amp;include_defaults=true | grep processors&lt;br /&gt;
&lt;br /&gt;
====Get maximum number of threads info====&lt;br /&gt;
 curl &amp;quot;127.1:9200/_cat/thread_pool?v&amp;amp;h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&amp;amp;pretty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
概览&lt;br /&gt;
 GET /_cat/tasks?v&amp;amp;s=action,node,start_time&lt;br /&gt;
tasks 详情&lt;br /&gt;
 GET /_tasks&lt;br /&gt;
&lt;br /&gt;
 GET /_tasks?group_by=parents&amp;amp;actions=*forcemerge*&amp;amp;detailed=true&lt;br /&gt;
&lt;br /&gt;
=== Templates 模板 ===&lt;br /&gt;
 /_cat/templates?v&lt;br /&gt;
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.&lt;br /&gt;
&lt;br /&gt;
新版本中使用 &amp;lt;code&amp;gt;/_index_template&amp;lt;/code&amp;gt; 取代&lt;br /&gt;
 GET/PUT /_template/${template_name}&lt;br /&gt;
但是 index_template 对比 legacy template有个很明显的差异就是，legacy template可以直接根据priority进行叠加覆盖，而index_template哪个template priority高，就只有哪个生效 https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html&amp;lt;blockquote&amp;gt;If a new data stream or index matches more than one index template, the index template with the highest priority is used.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Use template to change the replicas settings of all indexes (Legacy index template) ====&lt;br /&gt;
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. &lt;br /&gt;
&lt;br /&gt;
The order of the merging can be controlled using the &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; parameter, with lower order being applied first, '''and higher orders overriding them.''' &lt;br /&gt;
&lt;br /&gt;
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)&lt;br /&gt;
 PUT /_template/${template_name}&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;order&amp;quot;: 2147483647,&lt;br /&gt;
     &amp;quot;index_patterns&amp;quot;: [&lt;br /&gt;
         &amp;quot;*&amp;quot;&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;settings&amp;quot;: {&lt;br /&gt;
         &amp;quot;index&amp;quot;: {&lt;br /&gt;
             &amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
[[使用jq批量修改es index template的lifecycle配置]]&lt;br /&gt;
&lt;br /&gt;
=== ILM (index lifecycle policy) 索引生命周期 ===&lt;br /&gt;
顾名思义，ilm另外也可用于做ES集群的冷热温架构。&lt;br /&gt;
&lt;br /&gt;
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看&lt;br /&gt;
&lt;br /&gt;
比较难受的是，ilm目前没有类似 &amp;lt;code&amp;gt;_cat/templates&amp;lt;/code&amp;gt; 的接口一次性只查看这个集群已配置的 ILM 策略名字，只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)&lt;br /&gt;
 GET /_ilm/policy&lt;br /&gt;
&lt;br /&gt;
==== Get specific ilm policy detail 获取特定ILM策略定义 ====&lt;br /&gt;
 GET /_ilm/policy/${ilm_name}&lt;br /&gt;
&lt;br /&gt;
 PUT /_ilm/policy/ilm-30d-delete&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;policy&amp;quot;: {&lt;br /&gt;
     &amp;quot;phases&amp;quot;: {&lt;br /&gt;
       &amp;quot;delete&amp;quot;: {&lt;br /&gt;
         &amp;quot;min_age&amp;quot;: &amp;quot;30d&amp;quot;,&lt;br /&gt;
         &amp;quot;actions&amp;quot;: {&lt;br /&gt;
           &amp;quot;delete&amp;quot;: {&lt;br /&gt;
             &amp;quot;delete_searchable_snapshot&amp;quot;: true&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Get index's ilm status  获取索引当前 ILM 状态 ====&lt;br /&gt;
 GET /${index_name}/_ilm/explain&lt;br /&gt;
&lt;br /&gt;
 GET /${index_name}/_ilm/explain?human&lt;br /&gt;
&lt;br /&gt;
==== Move index's ilm to step  修改索引的ILM阶段状态(人为触发ILM action执行) ====&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html&lt;br /&gt;
 POST _ilm/move/my-index-000001&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;complete&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;warm&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;forcemerge&amp;quot;, &lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;forcemerge&amp;quot; &lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Manually create an index that is managed by template and ILM (including rollover operations by day)  ====&lt;br /&gt;
&lt;br /&gt;
===== 手动创建原本应由template和ilm管控的索引，且索引名内包含日期(动态索引名) =====&lt;br /&gt;
⚠️ 这种索引不能直接粗暴地 &amp;lt;code&amp;gt;PUT /index-name-2022.10.23-000022&amp;lt;/code&amp;gt; 以创建索引，否则手动创建出来的索引，在rollover滚动 (例如rollover-max_age:1d)的时候，创建出来的新索引名字仍然是创建索引时定义的日期，而不是当天轮滚发生时的日期(如 &amp;lt;code&amp;gt;index-name-2022.10.23-000023&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
这个现象可以通过判断 &amp;lt;code&amp;gt;GET /index-name/_settings&amp;lt;/code&amp;gt; 中 &amp;lt;code&amp;gt;index.provided_name&amp;lt;/code&amp;gt; 属性看出来&lt;br /&gt;
&lt;br /&gt;
解法:&lt;br /&gt;
 PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E&lt;br /&gt;
注意在kibana-Dev Tools中不要做URL Decode，他就是这样的需要编码一下(解码后就是: &amp;lt;code&amp;gt;&amp;lt;index-name-{now/d}-000099&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
ps: 如果怕创建错名字的话，可以使用 &amp;lt;code&amp;gt;GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings&amp;lt;/code&amp;gt; 预览一下生成的索引名效果&lt;br /&gt;
&lt;br /&gt;
对于索引最后的这个序号，[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么，该编号始终为 6 个字符，且为零填充]。即使手动创建的索引结尾是&amp;lt;code&amp;gt;-00001&amp;lt;/code&amp;gt;，在rollover发生以后，索引后缀序号依然会变成&amp;lt;code&amp;gt;-000002&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 故障处理: 有的时候对现有的索引修改了其引用的 ilm policy 为别的 policy,或者修改了其引用的 ilm policy中的 phase 定义。会导致索引ilm故障 ====&lt;br /&gt;
有可能导致他的ilm处理会出问题（不记得怎么告警），没记错的话通过 &amp;lt;code&amp;gt;GET {index_name}/_ilm/explain&amp;lt;/code&amp;gt; 能看到 error 信息，能看到卡在某个 phase 失败&lt;br /&gt;
&lt;br /&gt;
这时候需要人为修改 index 的 ilm phase 修复，如&lt;br /&gt;
 POST _ilm/move/insight-es-k8s-logs-dce5-aliyun-default-prd-2024.01.16&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;hot&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;rollover&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;ERROR&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;cold&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
或者尝试通过 &amp;lt;code&amp;gt;POST {index_name}/_ilm/retry&amp;lt;/code&amp;gt; 接口重试 &lt;br /&gt;
&lt;br /&gt;
===Cluster setting related ES集群参数设置===&lt;br /&gt;
 /_cluster/settings?include_defaults=true&amp;amp;pretty&lt;br /&gt;
&lt;br /&gt;
 /_cluster/settings?include_defaults=true&lt;br /&gt;
&lt;br /&gt;
==== Wildcard expressions or all indices are not allowed ====&lt;br /&gt;
&lt;br /&gt;
===== 允许泛匹配删除索引 =====&lt;br /&gt;
 PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
     &amp;quot;action&amp;quot;: {&lt;br /&gt;
       &amp;quot;destructive_requires_name&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====primaries recovery settings ====&lt;br /&gt;
=====控制索引恢复或者relocating的并发数=====&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 10,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_outgoing_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 20&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: null&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 30,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 10&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;.&lt;br /&gt;
 # PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 8&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===&lt;br /&gt;
加大此数值可以有效缩短es relocating index的耗时&lt;br /&gt;
&lt;br /&gt;
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to &amp;lt;code&amp;gt;40mb&amp;lt;/code&amp;gt; unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Index settings===&lt;br /&gt;
&lt;br /&gt;
====modify the number of replicas in bulk====&lt;br /&gt;
&lt;br /&gt;
===== 批量/单个 设置索引副本数 =====&lt;br /&gt;
 PUT /index_name*/_settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;index&amp;quot;: {&lt;br /&gt;
     &amp;quot;number_of_replicas&amp;quot;: 1&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Search Documents ===&lt;br /&gt;
通过指定 &amp;lt;code&amp;gt;_source&amp;lt;/code&amp;gt; 可以控制结果只保留某些字段&lt;br /&gt;
&lt;br /&gt;
==== match_all 搜索 ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match_all&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 单字段排序匹配搜索(match) ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match&amp;quot;: {&lt;br /&gt;
       &amp;quot;segment_id&amp;quot;: &amp;quot;b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sort&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;start_time&amp;quot;: {&lt;br /&gt;
         &amp;quot;order&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行聚合(查询该字段有多少种类型的值) ====&lt;br /&gt;
 GET /.monitoring-es-7-2024.12.13/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;unique_types&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行计数统计(查询该字段排名前10的值) ====&lt;br /&gt;
(top_10_endpoints 可以自定义, 自定义的聚合名)&lt;br /&gt;
 GET sw_segment-20251021/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0, &lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;top_10_endpoints&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;endpoint_id&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10,&lt;br /&gt;
         &amp;quot;order&amp;quot;: {&lt;br /&gt;
           &amp;quot;_count&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===&lt;br /&gt;
ECK operator下管理的Elasticsearch如果要修改&amp;lt;code&amp;gt;cluster.routing.allocation.exclude&amp;lt;/code&amp;gt; 的参数配置，需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false'，不然会配置一会就会被刷回原状&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
&lt;br /&gt;
====对于有大量索引的刚重启的es集群====&lt;br /&gt;
(主分片在1w-2w)&lt;br /&gt;
&lt;br /&gt;
=====加快es集群恢复速度=====&lt;br /&gt;
结合es节点资源监控图，观测节点cpu压力，以及cpu IO wait&lt;br /&gt;
&lt;br /&gt;
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
和 node_concurrent_recoveries &lt;br /&gt;
&lt;br /&gt;
(A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Defaults to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;)数值&lt;br /&gt;
&lt;br /&gt;
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从red状态到yellow状态的耗时：增加索引副本数量，增加node_initial_primaries_recoveries值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从yellow状态到green状态的耗时：增加 node_concurrent_recoveries 值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通过访问 &amp;lt;code&amp;gt;/_cluster/allocation/explain&amp;lt;/code&amp;gt; 接口查到阻碍集群 to green(yellow)的原因&lt;br /&gt;
&lt;br /&gt;
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====&lt;br /&gt;
调整缩小 jvm 配置值，尽量不超配(requests 和 limit尽量一致或提高requests值)&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
==== 集群分片数达到maximum错误 ====&lt;br /&gt;
集群分片数达到maximum错误会有如下log信息，但是集群的健康状态不会改变&lt;br /&gt;
 2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;&lt;br /&gt;
解决:&lt;br /&gt;
&lt;br /&gt;
调整index ilm 策略或者调整集群的max_shards_per_node配置&lt;br /&gt;
&lt;br /&gt;
临时生效配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;transient&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
永久更改性配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;persistent&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
{{DEFAULTSORT:api随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1679</id>
		<title>Elasticsearch的一些api随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1679"/>
		<updated>2025-10-21T03:20:29Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Health===&lt;br /&gt;
 /_cat/health&lt;br /&gt;
&lt;br /&gt;
 /_cluster/health&lt;br /&gt;
&lt;br /&gt;
===Indices health===&lt;br /&gt;
按条件查看索引状态&lt;br /&gt;
 /_cat/indices?help&lt;br /&gt;
 /_cat/indices?health=red&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=yellow&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=green&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
注意在配合 * 通配符搜索/操作索引的时候，如果涉及隐藏的datastream / 隐藏的index，默认不会匹配命中，必须指定 &amp;lt;code&amp;gt;expand_wildcards=all&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; https://www.elastic.co/guide/en/elasticsearch/reference/7.16/multi-index.html#hidden&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
 /_cat/nodes?v&lt;br /&gt;
查看es各节点磁盘空间占用、分片数目等&lt;br /&gt;
 /_cat/allocation?v&lt;br /&gt;
&lt;br /&gt;
 /_cat/nodeattrs&lt;br /&gt;
&lt;br /&gt;
===Get master node===&lt;br /&gt;
 /_cat/master?v&lt;br /&gt;
&lt;br /&gt;
===Cluster allocation explain related===&lt;br /&gt;
可以用于定位分片状态以及分片为何故障&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
 /_cluster/allocation/explain&lt;br /&gt;
&lt;br /&gt;
===Shards===&lt;br /&gt;
粗略查看分片情况，特别是查看分片分布节点或大小/状态&lt;br /&gt;
 GET /_cat/shards&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_name&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_na*&lt;br /&gt;
查看分片分配失败原因&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
==== Recovery API ====&lt;br /&gt;
Returns information about ongoing and completed shard recoveries, similar to the index recovery API.&lt;br /&gt;
&lt;br /&gt;
For data streams, the API returns information about the stream’s backing indices&lt;br /&gt;
&lt;br /&gt;
可以查看当前正在 relocating 的分片，也能查到各分片处理进度百分比&lt;br /&gt;
 GET /_cat/recovery?active_only=true&amp;amp;s=index&amp;amp;v&lt;br /&gt;
&lt;br /&gt;
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===&lt;br /&gt;
为别名设置可写索引或数据流&lt;br /&gt;
&lt;br /&gt;
If the alias doesn’t exist, the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; action creates it.&lt;br /&gt;
 POST /_aliases &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;actions&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
             &amp;quot;add&amp;quot;: {&lt;br /&gt;
                &amp;quot;index&amp;quot;: &amp;quot;es-k8s-logs-000020&amp;quot;,    &lt;br /&gt;
                &amp;quot;alias&amp;quot;: &amp;quot;es-k8s-logs-alias&amp;quot;,    &lt;br /&gt;
                &amp;quot;is_write_index&amp;quot;: true &lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Thread pool related===&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html&lt;br /&gt;
 /_cluster/settings?pretty&amp;amp;include_defaults=true | grep processors&lt;br /&gt;
&lt;br /&gt;
====Get maximum number of threads info====&lt;br /&gt;
 curl &amp;quot;127.1:9200/_cat/thread_pool?v&amp;amp;h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&amp;amp;pretty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
概览&lt;br /&gt;
 GET /_cat/tasks?v&amp;amp;s=action,node,start_time&lt;br /&gt;
tasks 详情&lt;br /&gt;
 GET /_tasks&lt;br /&gt;
&lt;br /&gt;
 GET /_tasks?group_by=parents&amp;amp;actions=*forcemerge*&amp;amp;detailed=true&lt;br /&gt;
&lt;br /&gt;
=== Templates 模板 ===&lt;br /&gt;
 /_cat/templates?v&lt;br /&gt;
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.&lt;br /&gt;
&lt;br /&gt;
新版本中使用 &amp;lt;code&amp;gt;/_index_template&amp;lt;/code&amp;gt; 取代&lt;br /&gt;
 GET/PUT /_template/${template_name}&lt;br /&gt;
但是 index_template 对比 legacy template有个很明显的差异就是，legacy template可以直接根据priority进行叠加覆盖，而index_template哪个template priority高，就只有哪个生效 https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html&amp;lt;blockquote&amp;gt;If a new data stream or index matches more than one index template, the index template with the highest priority is used.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Use template to change the replicas settings of all indexes (Legacy index template) ====&lt;br /&gt;
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. &lt;br /&gt;
&lt;br /&gt;
The order of the merging can be controlled using the &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; parameter, with lower order being applied first, '''and higher orders overriding them.''' &lt;br /&gt;
&lt;br /&gt;
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)&lt;br /&gt;
 PUT /_template/${template_name}&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;order&amp;quot;: 2147483647,&lt;br /&gt;
     &amp;quot;index_patterns&amp;quot;: [&lt;br /&gt;
         &amp;quot;*&amp;quot;&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;settings&amp;quot;: {&lt;br /&gt;
         &amp;quot;index&amp;quot;: {&lt;br /&gt;
             &amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
[[使用jq批量修改es index template的lifecycle配置]]&lt;br /&gt;
&lt;br /&gt;
=== ILM (index lifecycle policy) 索引生命周期 ===&lt;br /&gt;
顾名思义，ilm另外也可用于做ES集群的冷热温架构。&lt;br /&gt;
&lt;br /&gt;
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看&lt;br /&gt;
&lt;br /&gt;
比较难受的是，ilm目前没有类似 &amp;lt;code&amp;gt;_cat/templates&amp;lt;/code&amp;gt; 的接口一次性只查看这个集群已配置的 ILM 策略名字，只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)&lt;br /&gt;
 GET /_ilm/policy&lt;br /&gt;
&lt;br /&gt;
==== Get specific ilm policy detail 获取特定ILM策略定义 ====&lt;br /&gt;
 GET /_ilm/policy/${ilm_name}&lt;br /&gt;
&lt;br /&gt;
 PUT /_ilm/policy/ilm-30d-delete&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;policy&amp;quot;: {&lt;br /&gt;
     &amp;quot;phases&amp;quot;: {&lt;br /&gt;
       &amp;quot;delete&amp;quot;: {&lt;br /&gt;
         &amp;quot;min_age&amp;quot;: &amp;quot;30d&amp;quot;,&lt;br /&gt;
         &amp;quot;actions&amp;quot;: {&lt;br /&gt;
           &amp;quot;delete&amp;quot;: {&lt;br /&gt;
             &amp;quot;delete_searchable_snapshot&amp;quot;: true&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Get index's ilm status  获取索引当前 ILM 状态 ====&lt;br /&gt;
 GET /${index_name}/_ilm/explain&lt;br /&gt;
&lt;br /&gt;
 GET /${index_name}/_ilm/explain?human&lt;br /&gt;
&lt;br /&gt;
==== Move index's ilm to step  修改索引的ILM阶段状态(人为触发ILM action执行) ====&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html&lt;br /&gt;
 POST _ilm/move/my-index-000001&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;complete&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;warm&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;forcemerge&amp;quot;, &lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;forcemerge&amp;quot; &lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Manually create an index that is managed by template and ILM (including rollover operations by day)  ====&lt;br /&gt;
&lt;br /&gt;
===== 手动创建原本应由template和ilm管控的索引，且索引名内包含日期(动态索引名) =====&lt;br /&gt;
⚠️ 这种索引不能直接粗暴地 &amp;lt;code&amp;gt;PUT /index-name-2022.10.23-000022&amp;lt;/code&amp;gt; 以创建索引，否则手动创建出来的索引，在rollover滚动 (例如rollover-max_age:1d)的时候，创建出来的新索引名字仍然是创建索引时定义的日期，而不是当天轮滚发生时的日期(如 &amp;lt;code&amp;gt;index-name-2022.10.23-000023&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
这个现象可以通过判断 &amp;lt;code&amp;gt;GET /index-name/_settings&amp;lt;/code&amp;gt; 中 &amp;lt;code&amp;gt;index.provided_name&amp;lt;/code&amp;gt; 属性看出来&lt;br /&gt;
&lt;br /&gt;
解法:&lt;br /&gt;
 PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E&lt;br /&gt;
注意在kibana-Dev Tools中不要做URL Decode，他就是这样的需要编码一下(解码后就是: &amp;lt;code&amp;gt;&amp;lt;index-name-{now/d}-000099&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
ps: 如果怕创建错名字的话，可以使用 &amp;lt;code&amp;gt;GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings&amp;lt;/code&amp;gt; 预览一下生成的索引名效果&lt;br /&gt;
&lt;br /&gt;
对于索引最后的这个序号，[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么，该编号始终为 6 个字符，且为零填充]。即使手动创建的索引结尾是&amp;lt;code&amp;gt;-00001&amp;lt;/code&amp;gt;，在rollover发生以后，索引后缀序号依然会变成&amp;lt;code&amp;gt;-000002&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 故障处理: 有的时候对现有的索引修改了其引用的 ilm policy 为别的 policy,或者修改了其引用的 ilm policy中的 phase 定义。会导致索引ilm故障 ====&lt;br /&gt;
有可能导致他的ilm处理会出问题（不记得怎么告警），没记错的话通过 &amp;lt;code&amp;gt;GET {index_name}/_ilm/explain&amp;lt;/code&amp;gt; 能看到 error 信息，能看到卡在某个 phase 失败&lt;br /&gt;
&lt;br /&gt;
这时候需要人为修改 index 的 ilm phase 修复，如&lt;br /&gt;
 POST _ilm/move/insight-es-k8s-logs-dce5-aliyun-default-prd-2024.01.16&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;hot&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;rollover&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;ERROR&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;cold&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
或者尝试通过 &amp;lt;code&amp;gt;POST {index_name}/_ilm/retry&amp;lt;/code&amp;gt; 接口重试 &lt;br /&gt;
&lt;br /&gt;
===Cluster setting related ES集群参数设置===&lt;br /&gt;
 /_cluster/settings?include_defaults=true&amp;amp;pretty&lt;br /&gt;
&lt;br /&gt;
 /_cluster/settings?include_defaults=true&lt;br /&gt;
&lt;br /&gt;
==== Wildcard expressions or all indices are not allowed ====&lt;br /&gt;
&lt;br /&gt;
===== 允许泛匹配删除索引 =====&lt;br /&gt;
 PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
     &amp;quot;action&amp;quot;: {&lt;br /&gt;
       &amp;quot;destructive_requires_name&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====primaries recovery settings ====&lt;br /&gt;
=====控制索引恢复或者relocating的并发数=====&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 10,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_outgoing_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 20&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: null&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 30,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 10&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;.&lt;br /&gt;
 # PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 8&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===&lt;br /&gt;
加大此数值可以有效缩短es relocating index的耗时&lt;br /&gt;
&lt;br /&gt;
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to &amp;lt;code&amp;gt;40mb&amp;lt;/code&amp;gt; unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Index settings===&lt;br /&gt;
&lt;br /&gt;
====modify the number of replicas in bulk====&lt;br /&gt;
&lt;br /&gt;
===== 批量/单个 设置索引副本数 =====&lt;br /&gt;
 PUT /index_name*/_settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;index&amp;quot;: {&lt;br /&gt;
     &amp;quot;number_of_replicas&amp;quot;: 1&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Search Documents ===&lt;br /&gt;
通过指定 &amp;lt;code&amp;gt;_source&amp;lt;/code&amp;gt; 可以控制结果只保留某些字段&lt;br /&gt;
&lt;br /&gt;
==== match_all 搜索 ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match_all&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 单字段排序匹配搜索(match) ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match&amp;quot;: {&lt;br /&gt;
       &amp;quot;segment_id&amp;quot;: &amp;quot;b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sort&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;start_time&amp;quot;: {&lt;br /&gt;
         &amp;quot;order&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行聚合(查询该字段有多少种类型的值) ====&lt;br /&gt;
 GET /.monitoring-es-7-2024.12.13/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;unique_types&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===&lt;br /&gt;
ECK operator下管理的Elasticsearch如果要修改&amp;lt;code&amp;gt;cluster.routing.allocation.exclude&amp;lt;/code&amp;gt; 的参数配置，需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false'，不然会配置一会就会被刷回原状&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
&lt;br /&gt;
====对于有大量索引的刚重启的es集群====&lt;br /&gt;
(主分片在1w-2w)&lt;br /&gt;
&lt;br /&gt;
=====加快es集群恢复速度=====&lt;br /&gt;
结合es节点资源监控图，观测节点cpu压力，以及cpu IO wait&lt;br /&gt;
&lt;br /&gt;
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
和 node_concurrent_recoveries &lt;br /&gt;
&lt;br /&gt;
(A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Defaults to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;)数值&lt;br /&gt;
&lt;br /&gt;
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从red状态到yellow状态的耗时：增加索引副本数量，增加node_initial_primaries_recoveries值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从yellow状态到green状态的耗时：增加 node_concurrent_recoveries 值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通过访问 &amp;lt;code&amp;gt;/_cluster/allocation/explain&amp;lt;/code&amp;gt; 接口查到阻碍集群 to green(yellow)的原因&lt;br /&gt;
&lt;br /&gt;
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====&lt;br /&gt;
调整缩小 jvm 配置值，尽量不超配(requests 和 limit尽量一致或提高requests值)&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
==== 集群分片数达到maximum错误 ====&lt;br /&gt;
集群分片数达到maximum错误会有如下log信息，但是集群的健康状态不会改变&lt;br /&gt;
 2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;&lt;br /&gt;
解决:&lt;br /&gt;
&lt;br /&gt;
调整index ilm 策略或者调整集群的max_shards_per_node配置&lt;br /&gt;
&lt;br /&gt;
临时生效配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;transient&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
永久更改性配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;persistent&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
{{DEFAULTSORT:api随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1678</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1678"/>
		<updated>2025-09-29T09:15:10Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 (AI生成) ===&lt;br /&gt;
在仓库级别统计&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;(artifactId) 汇总 (AI生成) ===&lt;br /&gt;
在全局下按名字统计并过滤仓库:&lt;br /&gt;
 SELECT repo, gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT bucket.repository_name AS repo, attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE bucket.repository_name = ''''upload-snapshot'''&amp;lt;nowiki/&amp;gt;' AND attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY repo, gid, aid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
在全局下按名字统计并且不过滤仓库:&lt;br /&gt;
 SELECT repo, gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT bucket.repository_name AS repo, attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY repo, gid, aid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1677</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1677"/>
		<updated>2025-09-29T09:13:46Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;(artifactId) 汇总 (AI生成) ===&lt;br /&gt;
按名字统计并过滤仓库:&lt;br /&gt;
 SELECT repo, gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT bucket.repository_name AS repo, attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE bucket.repository_name = ''''upload-snapshot'''&amp;lt;nowiki/&amp;gt;' AND attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY repo, gid, aid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
按名字统计并且不过滤仓库:&lt;br /&gt;
 SELECT repo, gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT bucket.repository_name AS repo, attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY repo, gid, aid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1676</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1676"/>
		<updated>2025-09-29T09:01:08Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;(artifactId) 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY gid, aid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
 SELECT bucket, gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT bucket, attributes.maven2.groupId AS gid,          attributes.maven2.artifactId AS aid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket) AND attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY gid, aid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1675</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1675"/>
		<updated>2025-09-29T08:58:27Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;(artifactId) 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, attributes.maven2.artifactId AS aid, size FROM asset WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot') AND attributes.maven2.groupId IS NOT NULL AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY gid, aid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1674</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1674"/>
		<updated>2025-09-29T04:02:24Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size   FROM asset   WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot')  AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;(artifactId) 汇总 (AI生成) ===&lt;br /&gt;
 SELECT gid, aid, SUM(size) AS bytes, COUNT(*) AS files FROM (   SELECT attributes.maven2.groupId   AS gid,          attributes.maven2.artifactId AS aid,          size   FROM asset   WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot')     AND attributes.maven2.groupId IS NOT NULL     AND attributes.maven2.artifactId IS NOT NULL ) GROUP BY gid, aid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1673</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1673"/>
		<updated>2025-09-29T03:49:15Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
一些orientdb SQL操作记录&lt;br /&gt;
&lt;br /&gt;
=== 基础登陆 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size   FROM asset   WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot')  AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1672</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1672"/>
		<updated>2025-09-26T11:27:06Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;br /&gt;
&lt;br /&gt;
=== Maven 仓库：按 &amp;lt;code&amp;gt;groupId&amp;lt;/code&amp;gt; 汇总 ===&lt;br /&gt;
 SELECT gid, SUM(size) AS bytes, COUNT(*) AS files FROM ( SELECT attributes.maven2.groupId AS gid, size   FROM asset   WHERE bucket IN (SELECT @rid FROM bucket WHERE repository_name = 'upload-snapshot')  AND attributes.maven2.groupId IS NOT NULL ) GROUP BY gid ORDER BY bytes DESC LIMIT 200;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1671</id>
		<title>Nexus3-运维随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Nexus3-%E8%BF%90%E7%BB%B4%E9%9A%8F%E8%AE%B0&amp;diff=1671"/>
		<updated>2025-09-26T10:41:51Z</updated>

		<summary type="html">&lt;p&gt;Admin：​创建页面，内容为“sonatype nexus3  === 按照repository 统计空间占用 ===  java -jar ./lib/support/nexus-orient-console.jar    CONNECT PLOCAL:/nexus-data/db/component admin admin      select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sonatype nexus3&lt;br /&gt;
&lt;br /&gt;
=== 按照repository 统计空间占用 ===&lt;br /&gt;
 java -jar ./lib/support/nexus-orient-console.jar&lt;br /&gt;
 &lt;br /&gt;
 CONNECT PLOCAL:/nexus-data/db/component admin admin&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 select bucket.repository_name as repository,sum(size) as bytes from asset group by bucket.repository_name order by bytes desc limit 10;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E4%B8%BB%E5%8A%A8%E5%9B%9E%E6%94%B6cache-memory%E9%9A%8F%E8%AE%B0&amp;diff=1670</id>
		<title>容器主动回收cache-memory随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E4%B8%BB%E5%8A%A8%E5%9B%9E%E6%94%B6cache-memory%E9%9A%8F%E8%AE%B0&amp;diff=1670"/>
		<updated>2025-09-22T07:38:45Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;暂记，待详细测试&lt;br /&gt;
&lt;br /&gt;
通过修改cgroup2 的memory.high 可以触发系统到达特定值时回收内存&lt;br /&gt;
&lt;br /&gt;
影响面待评估。&lt;br /&gt;
&lt;br /&gt;
对那种因为操作文件读写带来的cache memory占用，特别使用，如harbor 的 registry 进程&lt;br /&gt;
&lt;br /&gt;
有意思的文章，关于memory.* : https://support.huaweicloud.com/usermanual-hce/hce_02_0072.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
需要更进一步的测试：&lt;br /&gt;
&lt;br /&gt;
在不人为干预memory.high 的情况下，如果一个容器cache memory 非常高，rss非常低，到达99系统是否会回收？为什么回收？什么参数控制?&lt;br /&gt;
&lt;br /&gt;
内核参数 &amp;lt;code&amp;gt;vm.min_free_kbytes&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;vm.watermark_scale_factor&amp;lt;/code&amp;gt;  ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS:  &amp;lt;code&amp;gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches&amp;lt;/code&amp;gt; 也可以触发回收，不过是节点级别，不是容器级别，会影响该主机全部进程&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:Memory容器主动回收cache-memory随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E4%B8%BB%E5%8A%A8%E5%9B%9E%E6%94%B6cache-memory%E9%9A%8F%E8%AE%B0&amp;diff=1669</id>
		<title>容器主动回收cache-memory随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%AE%B9%E5%99%A8%E4%B8%BB%E5%8A%A8%E5%9B%9E%E6%94%B6cache-memory%E9%9A%8F%E8%AE%B0&amp;diff=1669"/>
		<updated>2025-09-22T07:35:33Z</updated>

		<summary type="html">&lt;p&gt;Admin：​创建页面，内容为“暂记，待详细测试  通过修改cgroup2 的memory.high 可以触发系统到达特定值时回收内存  影响面待评估。  对那种因为操作文件读写带来的cache memory占用，特别使用，如harbor 的 registry 进程   需要更进一步的测试：  在不人为干预memory.high 的情况下，如果一个容器cache memory 非常高，rss非常低，到达99系统是否会回收？为什么回收？什么参数控制?  内核参数 &amp;lt;c…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;暂记，待详细测试&lt;br /&gt;
&lt;br /&gt;
通过修改cgroup2 的memory.high 可以触发系统到达特定值时回收内存&lt;br /&gt;
&lt;br /&gt;
影响面待评估。&lt;br /&gt;
&lt;br /&gt;
对那种因为操作文件读写带来的cache memory占用，特别使用，如harbor 的 registry 进程&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
需要更进一步的测试：&lt;br /&gt;
&lt;br /&gt;
在不人为干预memory.high 的情况下，如果一个容器cache memory 非常高，rss非常低，到达99系统是否会回收？为什么回收？什么参数控制?&lt;br /&gt;
&lt;br /&gt;
内核参数 &amp;lt;code&amp;gt;vm.min_free_kbytes&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;vm.watermark_scale_factor&amp;lt;/code&amp;gt;  ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS:  &amp;lt;code&amp;gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches&amp;lt;/code&amp;gt; 也可以触发回收，不过是节点级别，不是容器级别，会影响该主机全部进程&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:Memory容器主动回收cache-memory随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=K8s%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E5%9D%91%E6%88%96%E8%80%85bug%E7%AE%80%E8%A6%81%E8%AE%B0%E5%BD%95&amp;diff=1668</id>
		<title>K8s的一些小坑或者bug简要记录</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=K8s%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E5%9D%91%E6%88%96%E8%80%85bug%E7%AE%80%E8%A6%81%E8%AE%B0%E5%BD%95&amp;diff=1668"/>
		<updated>2025-09-18T08:47:52Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=== kubectl===&lt;br /&gt;
&lt;br /&gt;
==== kubectl rollout history====&lt;br /&gt;
kubectl rollout history 在 v1.26之前，如果带上-o yaml或者-o json之类的-o 参数，输出的内容会是错误的版本内容&lt;br /&gt;
&lt;br /&gt;
相关Issue https://github.com/kubernetes/kubectl/issues/598#issuecomment-1230824762&lt;br /&gt;
&lt;br /&gt;
==== kubectl apply 在特定情况下可能有bug或者非预期行为====&lt;br /&gt;
前提提要: kubectl apply 的工作涉及到了计算行为 [https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/#how-apply-calculates-differences-and-merges-changes How apply calculates differences and merges changes]&lt;br /&gt;
&lt;br /&gt;
例如如果在kubectl 1.18，kubectl apply操作hostAliases的时候可能是追加而不是替换 [[在使用kubectl apply操作workload产生的非预期行为|在使用kubectl_apply操作hostalias产生的非预期行为]]&lt;br /&gt;
&lt;br /&gt;
还有一个修改probe配置，apply会有异常的，这个基本也是跟apply计算实现有关（只出现在1.18,不是很记得怎么复现，有缘再补）&lt;br /&gt;
&lt;br /&gt;
kubernetes中apply命令执行的全过程源码解析：https://juejin.cn/post/6968106028642598949&lt;br /&gt;
&lt;br /&gt;
=== kubelet===&lt;br /&gt;
&lt;br /&gt;
==== kubelet 1.27前串行拉取容器镜像====&lt;br /&gt;
https://kubernetes.io/docs/concepts/containers/images/#serial-and-parallel-image-pulls&lt;br /&gt;
&lt;br /&gt;
By default, kubelet pulls images serially. In other words, kubelet sends only one image pull request to the image service at a time. Other image pull requests have to wait until the one being processed is complete.&lt;br /&gt;
&lt;br /&gt;
kubernetes 节点上kubelet在1.27版本之前对于容器镜像是串行拉取的，串行值为1，这在拉公网镜像的时候会有可能导致其它容器镜像一直处在拉取状态，在1.27中改成了并行镜像拉取&lt;br /&gt;
&lt;br /&gt;
==== kubelet 不断刷大量的 'Path &amp;quot;/var/lib/kubelet/pods/${pod_ID}/volumes&amp;quot; does not exist' 日志报错 ====&lt;br /&gt;
关联原因Issue里面介绍是runc cgroup GC异常&lt;br /&gt;
&lt;br /&gt;
issue:&lt;br /&gt;
&lt;br /&gt;
https://github.com/kubernetes/kubernetes/issues/112124&lt;br /&gt;
&lt;br /&gt;
底部有cgroup清理脚本，但是KUBE_POD_IDS的取值逻辑要根据实际环境调整，而且就算改完了，rmdir cgroup directory会提示Device or resource busy错误&lt;br /&gt;
&lt;br /&gt;
继续关联issue:&lt;br /&gt;
&lt;br /&gt;
https://github.com/kubernetes/kubernetes/issues/112151#issuecomment-1285261341&lt;br /&gt;
&lt;br /&gt;
issue解释诱因: 磁盘IO&lt;br /&gt;
&lt;br /&gt;
==== kubelet 刷 vol_data.json: no such file or directory 日志 ====&lt;br /&gt;
报错日志样式: &lt;br /&gt;
&lt;br /&gt;
operationExecutor.UnmountVolume failed&lt;br /&gt;
&lt;br /&gt;
failed to open volume data file [/var/lib/kubelet/pods/${pod_id}/volumes/kubernetes.io~csi/${pvc_id}/vol_data.json]: open /var/lib/kubelet/pods/${pod_id}/volumes/kubernetes.io~csi/${pvc_id}/vol_data.json: no such file or directory&lt;br /&gt;
&lt;br /&gt;
Issue:&lt;br /&gt;
&lt;br /&gt;
https://github.com/kubernetes/kubernetes/issues/85280&lt;br /&gt;
&lt;br /&gt;
里面issue creator有提及: &amp;lt;blockquote&amp;gt;When there is something wrong to execute os.Remove(volPath), volume path is left on node. However, mount path and vol_data.json is deleted.&amp;lt;/blockquote&amp;gt;这时候实践下来，可以手动umount，重启kubelet错误即可解除&lt;br /&gt;
&lt;br /&gt;
其他issue中有提及&amp;lt;nowiki/&amp;gt;https://github.com/kubernetes/kubernetes/issues/116847#issuecomment-1721540974&amp;lt;blockquote&amp;gt;Alright one last update. If anyone is running into problems like these, make sure your CSI driver implements &amp;lt;code&amp;gt;NodeUnpublish&amp;lt;/code&amp;gt; correctly at very minimum and idempotent. This issue imo is almost entirely caused by problematic CSI driver implementations.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== k8s-1.18 subPath &amp;amp; configmap 在 configmap 修改以后 ，对应的容器会无法重启 ====&lt;br /&gt;
https://github.com/kubernetes/kubernetes/issues/68211&lt;br /&gt;
&lt;br /&gt;
=== kube-proxy ===&lt;br /&gt;
自k8s '''1.24'''开始，kube-proxy不再会默认对service占用的 nodeport进行tcp socket监听，而会全权交给iptables/ipvs负责相应的流量处理。'''所以不要再单纯依靠ss -nplt / netstat -antl 来判定一个svc是否监听正常。可以依靠tcpdump等手段判定流量已经进入到了本节点'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/kubernetes/kubernetes/pull/108496&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1667</id>
		<title>Kubectl随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Kubectl%E9%9A%8F%E8%AE%B0&amp;diff=1667"/>
		<updated>2025-08-22T10:49:27Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== kubectl set default editor ===&lt;br /&gt;
 export  KUBE_EDITOR=/usr/bin/vim&lt;br /&gt;
&lt;br /&gt;
===kubectl completion bash not working 排障随记===&lt;br /&gt;
需要已经安装 bash-completion &lt;br /&gt;
&lt;br /&gt;
如果提示  &amp;lt;code&amp;gt;_get_comp_words_by_ref: command not found&amp;lt;/code&amp;gt; 错误的话，需要执行&lt;br /&gt;
 source /usr/share/bash-completion/bash_completion&lt;br /&gt;
执行命令 &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; 看一下当前环境的相关配置有没有kube相关项&lt;br /&gt;
 set | grep -i kube&lt;br /&gt;
没有的话需要执行&lt;br /&gt;
 source &amp;lt;(kubectl completion bash)&lt;br /&gt;
&lt;br /&gt;
正常的话,打开 kubectl debug&lt;br /&gt;
 __kubectl_debug() {&lt;br /&gt;
    if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then&lt;br /&gt;
        echo &amp;quot;$*&amp;quot; &amp;gt;&amp;gt; &amp;quot;${BASH_COMP_DEBUG_FILE}&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 export BASH_COMP_DEBUG_FILE=****&lt;br /&gt;
根据debug file里面的记录去排查出错点&lt;br /&gt;
&lt;br /&gt;
=== kubectl to get all api-resource and filter by verbs ===&lt;br /&gt;
 kubectl api-resources -o name --cached --request-timeout=5s --verbs=get&lt;br /&gt;
&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io&lt;br /&gt;
&lt;br /&gt;
==== get groupVersion when a resource exists in multiple api groups ====&lt;br /&gt;
&lt;br /&gt;
==== explain api-resource with sprcific api version ====&lt;br /&gt;
 kubectl api-resources --api-group=networking.k8s.io -v8 2&amp;gt;&amp;amp;1| grep ingress&lt;br /&gt;
&lt;br /&gt;
 kubectl explain ingress --api-version=&amp;quot;networking.k8s.io/v1beta1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== get service account token faster / 一条命令结合jsonpath揭秘base64处理后的secret ===&lt;br /&gt;
 kubectl get secret sa-secret -o jsonpath={.data.token} | base64 -d&lt;br /&gt;
&lt;br /&gt;
=== Check k8s account privilege / k8s 对象权限相关 ===&lt;br /&gt;
 kubectl options:&lt;br /&gt;
     --as=: Username to impersonate for the operation&lt;br /&gt;
     --as-group=[]: Group to impersonate for the operation, this flag can be repeated to specify multiple groups.&lt;br /&gt;
假设有名为registry-test的serviceAccount位于kube-system，这时候我们要测试他的RBAC权限，可以使用如下命令&lt;br /&gt;
 kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; get serviceaccount&lt;br /&gt;
&lt;br /&gt;
 Usage: kubectl auth can-i VERB [TYPE | TYPE/NAME | NONRESOURCEURL] [options]&lt;br /&gt;
 &lt;br /&gt;
 # Check to see if I can do everything in my current namespace (&amp;quot;*&amp;quot; means all)&lt;br /&gt;
 kubectl auth can-i '*' '*'&lt;br /&gt;
&lt;br /&gt;
 [root@node-a ~]# kubectl --as &amp;quot;system:serviceaccount:kube-system:registry-test&amp;quot; auth can-i list pods&lt;br /&gt;
 yes&lt;br /&gt;
PS: 在RBAC定义中(例如role / clusterrole)对 &amp;lt;code&amp;gt;resources&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;pods/*&amp;lt;/code&amp;gt; 声明不会对诸如 &amp;lt;code&amp;gt;pods/exec pods/log pods/status&amp;lt;/code&amp;gt; 等资源授权起效果&lt;br /&gt;
&lt;br /&gt;
原因: [[K8s-rbac关于子资源授权的一些记录]]&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with custom column / 利用custom-columns自定义输出字段 (语法相对go-template简单)===&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出pod所在租户，pod名字和pod uid=====&lt;br /&gt;
 kubectl get pods -o custom-columns='namespace:metadata.namespace,pod:metadata.name,uid:metadata.uid'&lt;br /&gt;
&lt;br /&gt;
=====通过custom-columns只输出namespace名字和ns annotation中定义的node selector=====&lt;br /&gt;
 kubectl get namespaces -o custom-columns=&amp;quot;NAMESPACE:.metadata.name, NODE_SELECTOR:.metadata.annotations.scheduler\.alpha\.kubernetes\.io/node-selector&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Get node info order by node ip address / 根据ip地址排序获取节点信息===&lt;br /&gt;
 kubectl get nodes -owide --sort-by status.addresses[0].address&lt;br /&gt;
&lt;br /&gt;
===Get pods order by running node name / 根据pod运行节点排序获取pod信息===&lt;br /&gt;
 kubectl get pods -owide --sort-by .spec.nodeName&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -owide --sort-by spec.nodeName&lt;br /&gt;
===Get pod order  by pod create time / 根据pod创建时间排序获取pod===&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat&lt;br /&gt;
&lt;br /&gt;
 kubectl get pods -n efk-system --sort-by status.startTime| grep filebeat|tac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===kubectl get resources with go-template / 利用go-template自定义输出(功能扩展性高度自由,但是有一定的编码调试成本)===&lt;br /&gt;
&lt;br /&gt;
====Deployments - image / 只获取deployment名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get deployments -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.template.spec.containers}}{{.image}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
稍微格式化输出，输出deployment名字 + container名字 + 对应的image&lt;br /&gt;
 kubectl get deployments.apps -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range .spec.template.spec.containers}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.image}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
====Pods - image / 只获取pod名字和image====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot; -- &amp;quot;}}{{range .spec.containers}}{{.image}}{{end}}{{&amp;quot;\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get the ip address of the specified node / 只获取节点名字和对应的Internal IP地址====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{range .status.addresses}}{{ if eq .type &amp;quot;InternalIP&amp;quot; }}{{.address}}{{end}}{{end}}{{end}}{{&amp;quot;\n&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Get node taints / 只获取节点名字和taints====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes  -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl get nodes -l kubernetes.io/hostname=nodename -o go-template --template '{{range .items}}{{.metadata.name}}{{&amp;quot;:\n&amp;quot;}}{{range .spec.taints}}{{.key}}{{&amp;quot;=&amp;quot;}}{{.value}}{{&amp;quot;:&amp;quot;}}{{.effect}}{{&amp;quot; &amp;quot;}}{{end}}{{&amp;quot;\n\n&amp;quot;}}{{end}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Get node labels and format output / 只获取节点名字和labels并格式化输出 ====&lt;br /&gt;
 kubectl get node -o go-template --template '&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{range $key, $value := .metadata.labels}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\t\t&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$key}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;:&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{$value}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
==== 获取namespace名字和ns annotation中定义的node selector ====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{.metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot; &amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot; -}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===== 稍微处理一下，格式化对齐输出 =====&lt;br /&gt;
 kubectl get namespaces -o go-template='&amp;lt;nowiki&amp;gt;{{range .items}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{printf &amp;quot;%-30s &amp;quot; .metadata.name}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{if index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{index .metadata.annotations &amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{else}}&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;quot;\n&amp;quot;}}&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;{{end}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
===kubectl get event filter by pod name / 根据对象进行过滤获取k8s事件===&lt;br /&gt;
 kubectl get event -n kube-system --field-selector involvedObject.name=${pod_name}&lt;br /&gt;
&lt;br /&gt;
===kubectl get event sort by lastTime / 根据事件最后触发时间进行排序===&lt;br /&gt;
 kubectl get event -n kube-system --sort-by=.lastTimestamp&lt;br /&gt;
&lt;br /&gt;
=== kubectl patch ===&lt;br /&gt;
[[K8s的patch命令随记]]&lt;br /&gt;
&lt;br /&gt;
kubectl patch 调整 annotation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;kubectl patch ns demo -p '{&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;scheduler.alpha.kubernetes.io/node-selector&amp;quot;: &amp;quot;kubernetes.io/hostname=node1&amp;quot;}}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1666</id>
		<title>使用jq批量修改es index template的lifecycle配置</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1666"/>
		<updated>2025-08-22T08:56:07Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;aka: use jq tool to modify es index template lifecycle setting in bulk&lt;br /&gt;
&lt;br /&gt;
新版本的es index template不支持通过结合索引匹配+优先级配置的方式来叠加批量修改已存在的索引模版(legacy template 支持)，只支持通过compose实现类似用法，部分场景会带来大量的搬砖成本(例如修改skywalking的索引模板中的生命周期配置或者索引副本数配置)&lt;br /&gt;
&lt;br /&gt;
引入脚本:&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#set -exu&lt;br /&gt;
set -ue&lt;br /&gt;
host=&amp;quot;127.0.0.1:9200&amp;quot;&lt;br /&gt;
username=&amp;quot;elastic&amp;quot;&lt;br /&gt;
password=&amp;quot;elastic&amp;quot;&lt;br /&gt;
ilm_name=&amp;quot;sw-default-ilm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl_options=(&lt;br /&gt;
  &amp;quot;-u&amp;quot; &amp;quot;$username:$password&amp;quot;&lt;br /&gt;
  &amp;quot;-s&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
es_sw_templates=`curl ${curl_options[@]} &amp;quot;$host/_cat/templates/sw*?s=name&amp;quot; | awk '{print $1}'`&lt;br /&gt;
# bak&lt;br /&gt;
curl ${curl_options[@]} &amp;quot;${host}/_index_template?pretty&amp;quot; &amp;gt; es-${host}-index-templates_`date +%F%T`.bak.json&lt;br /&gt;
&lt;br /&gt;
for template in ${es_sw_templates[@]}&lt;br /&gt;
do&lt;br /&gt;
  if [[ $template == &amp;quot;sw_segment&amp;quot; ]]&lt;br /&gt;
  then&lt;br /&gt;
    continue&lt;br /&gt;
  fi&lt;br /&gt;
  echo PUT /_index_template/${template}&lt;br /&gt;
  new_template=&amp;quot;&amp;quot;&lt;br /&gt;
  new_template=`curl ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; | jq '.index_templates[0].index_template |  .template.settings.index.lifecycle.name |= &amp;quot;'${ilm_name}'&amp;quot;'`&lt;br /&gt;
  curl -X PUT -H &amp;quot;Content-Type: application/json&amp;quot; ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; -d &amp;quot;${new_template}&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
也可以将修改 lifecycle.name 改为修改 compose 以及修改 refresh_interval&lt;br /&gt;
 new_template=`curl ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; | jq '.index_templates[0].index_template |  .composed_of = [&amp;quot;sw_default_ilm&amp;quot;] | .template.settings.index.refresh_interval = &amp;quot;180s&amp;quot;'`&lt;br /&gt;
{{DEFAULTSORT:jq}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Ansible%E9%9A%8F%E8%AE%B0&amp;diff=1665</id>
		<title>Ansible随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Ansible%E9%9A%8F%E8%AE%B0&amp;diff=1665"/>
		<updated>2025-08-06T06:42:04Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For linux and kubernetes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hosts config===&lt;br /&gt;
 [cluster1_controller]&lt;br /&gt;
 10.219.235.210&lt;br /&gt;
 10.219.235.213&lt;br /&gt;
 10.219.235.214&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_compute]&lt;br /&gt;
 10.219.235.[215:219]&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_nodes:children]&lt;br /&gt;
 cluster1_controller&lt;br /&gt;
 cluster1_compute&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_nodes:vars]&lt;br /&gt;
 ansible_ssh_user=guest2admin&lt;br /&gt;
 ansible_ssh_pass=@users&lt;br /&gt;
 ansible_python_interpreter=/usr/bin/python&lt;br /&gt;
 ansible_ssh_common_args=-c aes256-cbc -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null&lt;br /&gt;
 ansible_connection=ssh&lt;br /&gt;
 ansible_become_password=root@root@su&lt;br /&gt;
 ansible_become_method=su&lt;br /&gt;
 ansible_become_exe=sudo su -&lt;br /&gt;
 &lt;br /&gt;
 #############################################&lt;br /&gt;
 &lt;br /&gt;
 [k8s]&lt;br /&gt;
 k8s-node-1 ansible_ssh_host=172.16.139.102&lt;br /&gt;
 k8s-node-2 ansible_ssh_host=172.16.139.103&lt;br /&gt;
 k8s-node-3 ansible_ssh_host=172.16.139.104&lt;br /&gt;
 &lt;br /&gt;
 [test]&lt;br /&gt;
 192.168.1.250 ansible_ssh_port=1234&lt;br /&gt;
 192.168.1.251 ansible_ssh_user=xxx ansible_ssh_pass=yyy&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [other-test]&lt;br /&gt;
 192.168.1.250:1234&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ansible command parameters===&lt;br /&gt;
 -f 'FORKS', --forks 'FORKS'&lt;br /&gt;
           specify number of parallel processes to use (default=5)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Module===&lt;br /&gt;
&lt;br /&gt;
====authorized_key 模块实现节点批量免密====&lt;br /&gt;
&lt;br /&gt;
===== module 简要参数说明: =====&lt;br /&gt;
user=root : 将密钥推送到远程主机的哪个用户下&lt;br /&gt;
&lt;br /&gt;
key=’&amp;lt;nowiki&amp;gt;{{ lookup('file', '/root/.ssh/authorized_keys')}}&amp;lt;/nowiki&amp;gt;’ : 指定要推送的公钥文件所在的路径(常用应该是 id_rsa.pub )&lt;br /&gt;
&lt;br /&gt;
path=’/root/.ssh/authorized_keys’ : 将密钥推送到远程主机的哪个目录下并重命名 [Default: (user home dir)+/.ssh/authorized_keys] &lt;br /&gt;
&lt;br /&gt;
manage_dir=no : 指定模块是否应该管理 authorized key 文件所在的目录。如果设置为 yes，模块会创建目录，以及设置一个已存在目录的拥有者和权限。如果通过 path 选项，重新指定了一个 authorized key 文件所在目录，那么应该将该选项设置为 no&lt;br /&gt;
&lt;br /&gt;
exclusive : 是否移除 authorized_keys 文件中其它非指定 key [default: no] &lt;br /&gt;
&lt;br /&gt;
state (Choices: present, absent) :  present 添加指定 key 到 authorized_keys 文件中；absent 从 authorized_keys 文件中移除指定 key [Default: present] &lt;br /&gt;
&lt;br /&gt;
-k : 本次操作通过密码认证节点&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ps: 如果是第一次ssh连接对端节点，可以考虑 ssh-keyscan -H ${node_ip} &amp;gt;&amp;gt; ~/.ssh/known_hosts 批量添加节点ssh指或者直接将ansible host_key_checking 设置为False (ssh-keyscan 中 -H参数代表将相关指纹和主机名结果都进行哈希化加密)&lt;br /&gt;
&lt;br /&gt;
===== command line example: =====&lt;br /&gt;
 ansible all -m authorized_key -a &amp;quot;user=root key='&amp;lt;nowiki&amp;gt;{{ lookup('file', '/root/.ssh/authorized_keys')}}&amp;lt;/nowiki&amp;gt;' path='/root/.ssh/authorized_keys' manage_dir=no&amp;quot; -k&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====selinux====&lt;br /&gt;
 ansible k8s -m selinux -m selinux -a state=disabled&lt;br /&gt;
https://my.oschina.net/ozakilsc/blog/693023&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====shell====&lt;br /&gt;
 ansible k8s -m shell -a getenforce&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a hostname&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;iptables -F &amp;amp;&amp;amp; iptables -X &amp;amp;&amp;amp; iptables -F -t nat &amp;amp;&amp;amp; iptables -t nat -X &amp;amp;&amp;amp; iptables -t raw -F &amp;amp;&amp;amp; iptables -t raw -X &amp;amp;&amp;amp; iptables -t mangle -F &amp;amp;&amp;amp; iptables -t mangle -X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;modprobe bridge &amp;amp;&amp;amp; modprobe br_netfilter &amp;amp;&amp;amp; sysctl -p /etc/sysctl.d/kubernetes.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;timedatectl set-timezone Asia/Shanghai &amp;amp;&amp;amp; timedatectl status&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;rpm -Uvh &amp;lt;nowiki&amp;gt;http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;yum --enablerepo=elrepo-kernel install -y kernel-lt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;grub2-set-default 0&amp;quot;&lt;br /&gt;
自动切到root用户(-b)&lt;br /&gt;
 ansible all -b -m shell -a &amp;quot;cat &amp;lt;&amp;lt;&amp;lt; \$(jq '. + {\&amp;quot;bip\&amp;quot;: \&amp;quot;192.168.0.1/28\&amp;quot;}' /etc/docker/daemon.json) &amp;gt; /etc/docker/daemon.json&amp;quot;&lt;br /&gt;
如果需要强制指定 shell 为 bash shell，可以如下&lt;br /&gt;
 ansible all -m shell -e 'ansible_shell_executable=/usr/bin/bash' -a &amp;quot;ls&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====ping====&lt;br /&gt;
(用于判断远程客户端是否在线)&lt;br /&gt;
 ansible k8s -m ping&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====command====&lt;br /&gt;
(ansible default module)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====yum====&lt;br /&gt;
(default state:installed)&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim state=installed'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim, httpd'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -km yum -a &amp;quot;name=yum-utils,chrony,conntrack,ipvsadm,ipset,jq,iptables,curl,sysstat,libseccomp,wget,socat,git&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vsftpd  state=removed'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a &amp;quot;name=bridge-utils&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible  all  -m yum -a &amp;quot;name=epel-release,chrony,conntrack,ipvsadm,ipset,jq,iptables,curl,sysstat,libseccomp,wget,socat,git,bind-utils state=installed&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====service====&lt;br /&gt;
 ansible k8s -m service -a &amp;quot; name='nginx' enabled=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=httpd state=started&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=firewalld state=stopped enabled=no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -km service -a &amp;quot;name=postfix state=stopped enabled=no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=chronyd enabled=yes state=started&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====copy====&lt;br /&gt;
 ansible k8s -m copy -a &amp;quot;src=./kubernetes.conf dest=/etc/sysctl.d/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m copy -a &amp;quot;src=./authorized_keys dest=~/.ssh/authorized_keys mode=600&amp;quot; -k&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====file====&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/bin state=directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/work state=directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/work state=absent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====others====&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;rpm --import file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Playbook===&lt;br /&gt;
&lt;br /&gt;
====copy====&lt;br /&gt;
 ---&lt;br /&gt;
 - hosts: all&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; tasks:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   - name: copy kubernetes server executeable file to master node&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     copy:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       src: '&amp;lt;nowiki&amp;gt;{{ item.src }}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       dest: '&amp;lt;nowiki&amp;gt;{{item.dest}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       mode: '0744'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     with_items:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './apiextensions-apiserver', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubeadm', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-apiserver', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-controller-manager', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubectl', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubelet', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-proxy', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-scheduler', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './mounter', dest: '/opt/k8s/bin/'}&lt;br /&gt;
              &lt;br /&gt;
             [[分类:Linux]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other operations===&lt;br /&gt;
&lt;br /&gt;
====use the passphrase protected ssh private key without input the password====&lt;br /&gt;
使用带密码保护的私钥并且避免每次都要输入私钥密码(本次会话生效)&lt;br /&gt;
 $ eval `ssh-agent`  # you might have agent already running so this might not be needed&lt;br /&gt;
 $ ssh-add ~/.ssh/id_rsa&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
__无编辑段落__&lt;br /&gt;
__无新段落链接__&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Ansible%E9%9A%8F%E8%AE%B0&amp;diff=1664</id>
		<title>Ansible随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Ansible%E9%9A%8F%E8%AE%B0&amp;diff=1664"/>
		<updated>2025-08-06T06:41:40Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For linux and kubernetes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hosts config===&lt;br /&gt;
 [cluster1_controller]&lt;br /&gt;
 10.219.235.210&lt;br /&gt;
 10.219.235.213&lt;br /&gt;
 10.219.235.214&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_compute]&lt;br /&gt;
 10.219.235.[215:219]&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_nodes:children]&lt;br /&gt;
 cluster1_controller&lt;br /&gt;
 cluster1_compute&lt;br /&gt;
 &lt;br /&gt;
 [cluster1_nodes:vars]&lt;br /&gt;
 ansible_ssh_user=guest2admin&lt;br /&gt;
 ansible_ssh_pass=@users&lt;br /&gt;
 ansible_python_interpreter=/usr/bin/python&lt;br /&gt;
 ansible_ssh_common_args=-c aes256-cbc -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null&lt;br /&gt;
 ansible_connection=ssh&lt;br /&gt;
 ansible_become_password=root@root@su&lt;br /&gt;
 ansible_become_method=su&lt;br /&gt;
 ansible_become_exe=sudo su -&lt;br /&gt;
 &lt;br /&gt;
 #############################################&lt;br /&gt;
 &lt;br /&gt;
 [k8s]&lt;br /&gt;
 k8s-node-1 ansible_ssh_host=172.16.139.102&lt;br /&gt;
 k8s-node-2 ansible_ssh_host=172.16.139.103&lt;br /&gt;
 k8s-node-3 ansible_ssh_host=172.16.139.104&lt;br /&gt;
 &lt;br /&gt;
 [test]&lt;br /&gt;
 192.168.1.250 ansible_ssh_port=1234&lt;br /&gt;
 192.168.1.251 ansible_ssh_user=xxx ansible_ssh_pass=yyy&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [other-test]&lt;br /&gt;
 192.168.1.250:1234&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ansible command parameters===&lt;br /&gt;
 -f 'FORKS', --forks 'FORKS'&lt;br /&gt;
           specify number of parallel processes to use (default=5)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Module===&lt;br /&gt;
&lt;br /&gt;
====authorized_key 模块实现节点批量免密====&lt;br /&gt;
&lt;br /&gt;
===== module 简要参数说明: =====&lt;br /&gt;
user=root : 将密钥推送到远程主机的哪个用户下&lt;br /&gt;
&lt;br /&gt;
key=’&amp;lt;nowiki&amp;gt;{{ lookup('file', '/root/.ssh/authorized_keys')}}&amp;lt;/nowiki&amp;gt;’ : 指定要推送的公钥文件所在的路径(常用应该是 id_rsa.pub )&lt;br /&gt;
&lt;br /&gt;
path=’/root/.ssh/authorized_keys’ : 将密钥推送到远程主机的哪个目录下并重命名 [Default: (user home dir)+/.ssh/authorized_keys] &lt;br /&gt;
&lt;br /&gt;
manage_dir=no : 指定模块是否应该管理 authorized key 文件所在的目录。如果设置为 yes，模块会创建目录，以及设置一个已存在目录的拥有者和权限。如果通过 path 选项，重新指定了一个 authorized key 文件所在目录，那么应该将该选项设置为 no&lt;br /&gt;
&lt;br /&gt;
exclusive : 是否移除 authorized_keys 文件中其它非指定 key [default: no] &lt;br /&gt;
&lt;br /&gt;
state (Choices: present, absent) :  present 添加指定 key 到 authorized_keys 文件中；absent 从 authorized_keys 文件中移除指定 key [Default: present] &lt;br /&gt;
&lt;br /&gt;
-k : 本次操作通过密码认证节点&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ps: 如果是第一次ssh连接对端节点，可以考虑 ssh-keyscan -H ${node_ip} &amp;gt;&amp;gt; ~/.ssh/known_hosts 批量添加节点ssh指或者直接将ansible host_key_checking 设置为False (ssh-keyscan 中 -H参数代表将相关指纹和主机名结果都进行哈希化加密)&lt;br /&gt;
&lt;br /&gt;
===== command line example: =====&lt;br /&gt;
 ansible all -m authorized_key -a &amp;quot;user=root key='&amp;lt;nowiki&amp;gt;{{ lookup('file', '/root/.ssh/authorized_keys')}}&amp;lt;/nowiki&amp;gt;' path='/root/.ssh/authorized_keys' manage_dir=no&amp;quot; -k&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====selinux====&lt;br /&gt;
 ansible k8s -m selinux -m selinux -a state=disabled&lt;br /&gt;
https://my.oschina.net/ozakilsc/blog/693023&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====shell====&lt;br /&gt;
 ansible k8s -m shell -a getenforce&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a hostname&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;iptables -F &amp;amp;&amp;amp; iptables -X &amp;amp;&amp;amp; iptables -F -t nat &amp;amp;&amp;amp; iptables -t nat -X &amp;amp;&amp;amp; iptables -t raw -F &amp;amp;&amp;amp; iptables -t raw -X &amp;amp;&amp;amp; iptables -t mangle -F &amp;amp;&amp;amp; iptables -t mangle -X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;modprobe bridge &amp;amp;&amp;amp; modprobe br_netfilter &amp;amp;&amp;amp; sysctl -p /etc/sysctl.d/kubernetes.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;timedatectl set-timezone Asia/Shanghai &amp;amp;&amp;amp; timedatectl status&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;rpm -Uvh &amp;lt;nowiki&amp;gt;http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;yum --enablerepo=elrepo-kernel install -y kernel-lt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m shell -a &amp;quot;grub2-set-default 0&amp;quot;&lt;br /&gt;
自动切到root用户(-b)&lt;br /&gt;
 ansible all -b -m shell -a &amp;quot;cat &amp;lt;&amp;lt;&amp;lt; \$(jq '. + {\&amp;quot;bip\&amp;quot;: \&amp;quot;192.168.0.1/28\&amp;quot;}' /etc/docker/daemon.json) &amp;gt; /etc/docker/daemon.json&amp;quot;&lt;br /&gt;
如果需要强制指定 shell 为 bash shell，可以如下&lt;br /&gt;
 ansible all -e 'ansible_shell_executable=/usr/bin/bash' -a &amp;quot;ls&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====ping====&lt;br /&gt;
(用于判断远程客户端是否在线)&lt;br /&gt;
 ansible k8s -m ping&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====command====&lt;br /&gt;
(ansible default module)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====yum====&lt;br /&gt;
(default state:installed)&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim state=installed'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vim, httpd'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -km yum -a &amp;quot;name=yum-utils,chrony,conntrack,ipvsadm,ipset,jq,iptables,curl,sysstat,libseccomp,wget,socat,git&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a 'name=vsftpd  state=removed'&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m yum -a &amp;quot;name=bridge-utils&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible  all  -m yum -a &amp;quot;name=epel-release,chrony,conntrack,ipvsadm,ipset,jq,iptables,curl,sysstat,libseccomp,wget,socat,git,bind-utils state=installed&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====service====&lt;br /&gt;
 ansible k8s -m service -a &amp;quot; name='nginx' enabled=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=httpd state=started&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=firewalld state=stopped enabled=no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -km service -a &amp;quot;name=postfix state=stopped enabled=no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m service -a &amp;quot;name=chronyd enabled=yes state=started&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====copy====&lt;br /&gt;
 ansible k8s -m copy -a &amp;quot;src=./kubernetes.conf dest=/etc/sysctl.d/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible all -m copy -a &amp;quot;src=./authorized_keys dest=~/.ssh/authorized_keys mode=600&amp;quot; -k&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====file====&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/bin state=directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/work state=directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ansible k8s -m file -a &amp;quot;path=/opt/k8s/work state=absent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====others====&lt;br /&gt;
 ansible k8s -m shell -a &amp;quot;rpm --import file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Playbook===&lt;br /&gt;
&lt;br /&gt;
====copy====&lt;br /&gt;
 ---&lt;br /&gt;
 - hosts: all&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; tasks:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   - name: copy kubernetes server executeable file to master node&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     copy:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       src: '&amp;lt;nowiki&amp;gt;{{ item.src }}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       dest: '&amp;lt;nowiki&amp;gt;{{item.dest}}&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       mode: '0744'&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     with_items:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './apiextensions-apiserver', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubeadm', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-apiserver', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-controller-manager', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubectl', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kubelet', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-proxy', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './kube-scheduler', dest: '/opt/k8s/bin/'}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      - {src: './mounter', dest: '/opt/k8s/bin/'}&lt;br /&gt;
              &lt;br /&gt;
             [[分类:Linux]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other operations===&lt;br /&gt;
&lt;br /&gt;
====use the passphrase protected ssh private key without input the password====&lt;br /&gt;
使用带密码保护的私钥并且避免每次都要输入私钥密码(本次会话生效)&lt;br /&gt;
 $ eval `ssh-agent`  # you might have agent already running so this might not be needed&lt;br /&gt;
 $ ssh-add ~/.ssh/id_rsa&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
__无编辑段落__&lt;br /&gt;
__无新段落链接__&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1663</id>
		<title>一些routeros-script折腾随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1663"/>
		<updated>2025-07-28T07:18:08Z</updated>

		<summary type="html">&lt;p&gt;Admin：​Admin移动页面一些mikrotik-routeros-script折腾随记至一些routeros-script折腾随记，不留重定向&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:routeros-script折腾随记}}&lt;br /&gt;
&lt;br /&gt;
第三方cn docs: https://mikrotik-doc-cn.readthedocs.io/zh/latest/source/Scripts/content.html&lt;br /&gt;
&lt;br /&gt;
=== 常用操作: ===&lt;br /&gt;
变量定义: 可以通过 &amp;lt;code&amp;gt;:local&amp;lt;/code&amp;gt; 或者 &amp;lt;code&amp;gt;:global&amp;lt;/code&amp;gt; 定义，区别就是作用域不一样&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
&amp;lt;code&amp;gt;:put&amp;lt;/code&amp;gt; 可以将定义好的变量输出到console，但是不能输出到log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一般情况下，Scripts 在运行的时候，如果出现异常，不会有异常信息，只有简单的一句话:&amp;lt;blockquote&amp;gt;script,error executing script script-test from xxxxxxx failed, please check it manually&amp;lt;/blockquote&amp;gt;可以通过类似以下方式把 exception (e) 打到log中方便排查&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
some example:&lt;br /&gt;
&lt;br /&gt;
用于判断 pppoe 连接时间，如果不在 3-5 点，就运行指定的脚本&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 :local pppoeUptimeHour&lt;br /&gt;
 :local dayPos&lt;br /&gt;
 :local hourSemicolonPos&lt;br /&gt;
 :local timeCutPosStart 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set dayPos [:find $pppoeUptime &amp;quot;d&amp;quot;]&lt;br /&gt;
 :if ($dayPos &amp;gt;0) do={&lt;br /&gt;
         :set timeCutPosStart ($dayPos + 1)&lt;br /&gt;
         #:log debug &amp;quot;day pos found.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 :log info &amp;quot;timeCutPosStart: $timeCutPosStart&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set hourSemicolonPos [:find $pppoeUptime &amp;quot;:&amp;quot;]&lt;br /&gt;
 :set pppoeUptimeHour [:pick $pppoeUptime $timeCutPosStart $hourSemicolonPos]&lt;br /&gt;
 :log info &amp;quot;pppoeUptimeHour: $pppoeUptimeHour&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :if ( $pppoeUptimeHour &amp;gt; 5 or $pppoeUptimeHour &amp;lt; 3 ) do={&lt;br /&gt;
     :log info &amp;quot;PPPOE connection uptime not as expected! will be restarted...&amp;quot;&lt;br /&gt;
     /interface/pppoe-client/disable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface disabled&amp;quot;&lt;br /&gt;
     delay 3&lt;br /&gt;
     /interface/pppoe-client/enable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface enabled&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
关联关键词: mikrotik&lt;br /&gt;
[[分类:Router]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1662</id>
		<title>一些routeros-script折腾随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1662"/>
		<updated>2025-07-28T07:17:10Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:routeros-script折腾随记}}&lt;br /&gt;
&lt;br /&gt;
第三方cn docs: https://mikrotik-doc-cn.readthedocs.io/zh/latest/source/Scripts/content.html&lt;br /&gt;
&lt;br /&gt;
=== 常用操作: ===&lt;br /&gt;
变量定义: 可以通过 &amp;lt;code&amp;gt;:local&amp;lt;/code&amp;gt; 或者 &amp;lt;code&amp;gt;:global&amp;lt;/code&amp;gt; 定义，区别就是作用域不一样&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
&amp;lt;code&amp;gt;:put&amp;lt;/code&amp;gt; 可以将定义好的变量输出到console，但是不能输出到log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一般情况下，Scripts 在运行的时候，如果出现异常，不会有异常信息，只有简单的一句话:&amp;lt;blockquote&amp;gt;script,error executing script script-test from xxxxxxx failed, please check it manually&amp;lt;/blockquote&amp;gt;可以通过类似以下方式把 exception (e) 打到log中方便排查&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
some example:&lt;br /&gt;
&lt;br /&gt;
用于判断 pppoe 连接时间，如果不在 3-5 点，就运行指定的脚本&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 :local pppoeUptimeHour&lt;br /&gt;
 :local dayPos&lt;br /&gt;
 :local hourSemicolonPos&lt;br /&gt;
 :local timeCutPosStart 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set dayPos [:find $pppoeUptime &amp;quot;d&amp;quot;]&lt;br /&gt;
 :if ($dayPos &amp;gt;0) do={&lt;br /&gt;
         :set timeCutPosStart ($dayPos + 1)&lt;br /&gt;
         #:log debug &amp;quot;day pos found.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 :log info &amp;quot;timeCutPosStart: $timeCutPosStart&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set hourSemicolonPos [:find $pppoeUptime &amp;quot;:&amp;quot;]&lt;br /&gt;
 :set pppoeUptimeHour [:pick $pppoeUptime $timeCutPosStart $hourSemicolonPos]&lt;br /&gt;
 :log info &amp;quot;pppoeUptimeHour: $pppoeUptimeHour&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :if ( $pppoeUptimeHour &amp;gt; 5 or $pppoeUptimeHour &amp;lt; 3 ) do={&lt;br /&gt;
     :log info &amp;quot;PPPOE connection uptime not as expected! will be restarted...&amp;quot;&lt;br /&gt;
     /interface/pppoe-client/disable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface disabled&amp;quot;&lt;br /&gt;
     delay 3&lt;br /&gt;
     /interface/pppoe-client/enable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface enabled&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
关联关键词: mikrotik&lt;br /&gt;
[[分类:Router]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1661</id>
		<title>一些routeros-script折腾随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%B8%80%E4%BA%9Brouteros-script%E6%8A%98%E8%85%BE%E9%9A%8F%E8%AE%B0&amp;diff=1661"/>
		<updated>2025-07-28T07:14:59Z</updated>

		<summary type="html">&lt;p&gt;Admin：​Admin移动页面一些routeros-script折腾随记至一些mikrotik-routeros-script折腾随记，不留重定向&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:routeros-script折腾随记}}&lt;br /&gt;
&lt;br /&gt;
第三方cn docs: https://mikrotik-doc-cn.readthedocs.io/zh/latest/source/Scripts/content.html&lt;br /&gt;
&lt;br /&gt;
=== 常用操作: ===&lt;br /&gt;
变量定义: 可以通过 &amp;lt;code&amp;gt;:local&amp;lt;/code&amp;gt; 或者 &amp;lt;code&amp;gt;:global&amp;lt;/code&amp;gt; 定义，区别就是作用域不一样&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
&amp;lt;code&amp;gt;:put&amp;lt;/code&amp;gt; 可以将定义好的变量输出到console，但是不能输出到log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一般情况下，Scripts 在运行的时候，如果出现异常，不会有异常信息，只有简单的一句话:&amp;lt;blockquote&amp;gt;script,error executing script script-test from xxxxxxx failed, please check it manually&amp;lt;/blockquote&amp;gt;可以通过类似以下方式把 exception (e) 打到log中方便排查&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
some example:&lt;br /&gt;
&lt;br /&gt;
用于判断 pppoe 连接时间，如果不在 3-5 点，就运行指定的脚本&lt;br /&gt;
 :onerror e {&lt;br /&gt;
 :local pppoeInterface &amp;quot;pppoe-sfp-telecom&amp;quot;&lt;br /&gt;
 :local pppoeUptime&lt;br /&gt;
 :local pppoeUptimeHour&lt;br /&gt;
 :local dayPos&lt;br /&gt;
 :local hourSemicolonPos&lt;br /&gt;
 :local timeCutPosStart 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]&lt;br /&gt;
 :log info &amp;quot;PPPoE interface uptime: $pppoeUptime&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set dayPos [:find $pppoeUptime &amp;quot;d&amp;quot;]&lt;br /&gt;
 :if ($dayPos &amp;gt;0) do={&lt;br /&gt;
         :set timeCutPosStart ($dayPos + 1)&lt;br /&gt;
         #:log debug &amp;quot;day pos found.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 :log info &amp;quot;timeCutPosStart: $timeCutPosStart&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :set hourSemicolonPos [:find $pppoeUptime &amp;quot;:&amp;quot;]&lt;br /&gt;
 :set pppoeUptimeHour [:pick $pppoeUptime $timeCutPosStart $hourSemicolonPos]&lt;br /&gt;
 :log info &amp;quot;pppoeUptimeHour: $pppoeUptimeHour&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 :if ( $pppoeUptimeHour &amp;gt; 5 or $pppoeUptimeHour &amp;lt; 3 ) do={&lt;br /&gt;
     :log info &amp;quot;PPPOE connection uptime not as expected! will be restarted...&amp;quot;&lt;br /&gt;
     /interface/pppoe-client/disable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface disabled&amp;quot;&lt;br /&gt;
     delay 3&lt;br /&gt;
     /interface/pppoe-client/enable $pppoeInterface&lt;br /&gt;
     :log info &amp;quot;$pppoeInterface enabled&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 } do {:log info  &amp;quot;script running error: $e&amp;quot;}&lt;br /&gt;
[[分类:Router]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Kubectl_edit%E6%88%96get_cm%E6%A0%BC%E5%BC%8F%E6%B7%B7%E4%B9%B1&amp;diff=1660</id>
		<title>Kubectl edit或get cm格式混乱</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Kubectl_edit%E6%88%96get_cm%E6%A0%BC%E5%BC%8F%E6%B7%B7%E4%B9%B1&amp;diff=1660"/>
		<updated>2025-07-24T11:24:48Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;configmap中的内容需要 同时 满足以下条件以后，在kubectl  edit/get cm yaml下才不会被二次转义编码 &lt;br /&gt;
&lt;br /&gt;
# 换行前不要有空白字符 &amp;lt;pre&amp;gt;:%s/\\s\\n/\\n/g&amp;lt;/pre&amp;gt;&lt;br /&gt;
# 没有tab键(\t) &amp;lt;pre&amp;gt;:%s/\\t/    /g&amp;lt;/pre&amp;gt;&lt;br /&gt;
# 文尾没有换行符或空白字符(整个data object的最后一个字符不能是\n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS: 通过 &amp;lt;code&amp;gt;kubectl get cm xxxx -o jsonpath={.data}&amp;lt;/code&amp;gt; 也可以避免输出的内容 被二次转义编码&lt;br /&gt;
[[分类:K8s]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1659</id>
		<title>Elasticsearch的一些api随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1659"/>
		<updated>2025-07-01T03:52:05Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Health===&lt;br /&gt;
 /_cat/health&lt;br /&gt;
&lt;br /&gt;
 /_cluster/health&lt;br /&gt;
&lt;br /&gt;
===Indices health===&lt;br /&gt;
按条件查看索引状态&lt;br /&gt;
 /_cat/indices?help&lt;br /&gt;
 /_cat/indices?health=red&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=yellow&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=green&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
注意在配合 * 通配符搜索/操作索引的时候，如果涉及隐藏的datastream / 隐藏的index，默认不会匹配命中，必须指定 &amp;lt;code&amp;gt;expand_wildcards=all&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; https://www.elastic.co/guide/en/elasticsearch/reference/7.16/multi-index.html#hidden&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
 /_cat/nodes?v&lt;br /&gt;
查看es各节点磁盘空间占用、分片数目等&lt;br /&gt;
 /_cat/allocation?v&lt;br /&gt;
&lt;br /&gt;
 /_cat/nodeattrs&lt;br /&gt;
&lt;br /&gt;
===Get master node===&lt;br /&gt;
 /_cat/master?v&lt;br /&gt;
&lt;br /&gt;
===Cluster allocation explain related===&lt;br /&gt;
可以用于定位分片状态以及分片为何故障&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
 /_cluster/allocation/explain&lt;br /&gt;
&lt;br /&gt;
===Shards===&lt;br /&gt;
粗略查看分片情况，特别是查看分片分布节点或大小/状态&lt;br /&gt;
 GET /_cat/shards&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_name&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_na*&lt;br /&gt;
查看分片分配失败原因&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
==== Recovery API ====&lt;br /&gt;
Returns information about ongoing and completed shard recoveries, similar to the index recovery API.&lt;br /&gt;
&lt;br /&gt;
For data streams, the API returns information about the stream’s backing indices&lt;br /&gt;
&lt;br /&gt;
可以查看当前正在 relocating 的分片，也能查到各分片处理进度百分比&lt;br /&gt;
 GET /_cat/recovery?active_only=true&amp;amp;s=index&amp;amp;v&lt;br /&gt;
&lt;br /&gt;
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===&lt;br /&gt;
为别名设置可写索引或数据流&lt;br /&gt;
&lt;br /&gt;
If the alias doesn’t exist, the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; action creates it.&lt;br /&gt;
 POST /_aliases &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;actions&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
             &amp;quot;add&amp;quot;: {&lt;br /&gt;
                &amp;quot;index&amp;quot;: &amp;quot;es-k8s-logs-000020&amp;quot;,    &lt;br /&gt;
                &amp;quot;alias&amp;quot;: &amp;quot;es-k8s-logs-alias&amp;quot;,    &lt;br /&gt;
                &amp;quot;is_write_index&amp;quot;: true &lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Thread pool related===&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html&lt;br /&gt;
 /_cluster/settings?pretty&amp;amp;include_defaults=true | grep processors&lt;br /&gt;
&lt;br /&gt;
====Get maximum number of threads info====&lt;br /&gt;
 curl &amp;quot;127.1:9200/_cat/thread_pool?v&amp;amp;h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&amp;amp;pretty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Tasks ===&lt;br /&gt;
概览&lt;br /&gt;
 GET /_cat/tasks?v&amp;amp;s=action,node,start_time&lt;br /&gt;
tasks 详情&lt;br /&gt;
 GET /_tasks&lt;br /&gt;
&lt;br /&gt;
 GET /_tasks?group_by=parents&amp;amp;actions=*forcemerge*&amp;amp;detailed=true&lt;br /&gt;
&lt;br /&gt;
=== Templates 模板 ===&lt;br /&gt;
 /_cat/templates?v&lt;br /&gt;
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.&lt;br /&gt;
&lt;br /&gt;
新版本中使用 &amp;lt;code&amp;gt;/_index_template&amp;lt;/code&amp;gt; 取代&lt;br /&gt;
 GET/PUT /_template/${template_name}&lt;br /&gt;
但是 index_template 对比 legacy template有个很明显的差异就是，legacy template可以直接根据priority进行叠加覆盖，而index_template哪个template priority高，就只有哪个生效 https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html&amp;lt;blockquote&amp;gt;If a new data stream or index matches more than one index template, the index template with the highest priority is used.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Use template to change the replicas settings of all indexes (Legacy index template) ====&lt;br /&gt;
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. &lt;br /&gt;
&lt;br /&gt;
The order of the merging can be controlled using the &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; parameter, with lower order being applied first, '''and higher orders overriding them.''' &lt;br /&gt;
&lt;br /&gt;
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)&lt;br /&gt;
 PUT /_template/${template_name}&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;order&amp;quot;: 2147483647,&lt;br /&gt;
     &amp;quot;index_patterns&amp;quot;: [&lt;br /&gt;
         &amp;quot;*&amp;quot;&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;settings&amp;quot;: {&lt;br /&gt;
         &amp;quot;index&amp;quot;: {&lt;br /&gt;
             &amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
[[使用jq批量修改es index template的lifecycle配置]]&lt;br /&gt;
&lt;br /&gt;
=== ILM (index lifecycle policy) 索引生命周期 ===&lt;br /&gt;
顾名思义，ilm另外也可用于做ES集群的冷热温架构。&lt;br /&gt;
&lt;br /&gt;
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看&lt;br /&gt;
&lt;br /&gt;
比较难受的是，ilm目前没有类似 &amp;lt;code&amp;gt;_cat/templates&amp;lt;/code&amp;gt; 的接口一次性只查看这个集群已配置的 ILM 策略名字，只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)&lt;br /&gt;
 GET /_ilm/policy&lt;br /&gt;
&lt;br /&gt;
==== Get specific ilm policy detail 获取特定ILM策略定义 ====&lt;br /&gt;
 GET /_ilm/policy/${ilm_name}&lt;br /&gt;
&lt;br /&gt;
 PUT /_ilm/policy/ilm-30d-delete&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;policy&amp;quot;: {&lt;br /&gt;
     &amp;quot;phases&amp;quot;: {&lt;br /&gt;
       &amp;quot;delete&amp;quot;: {&lt;br /&gt;
         &amp;quot;min_age&amp;quot;: &amp;quot;30d&amp;quot;,&lt;br /&gt;
         &amp;quot;actions&amp;quot;: {&lt;br /&gt;
           &amp;quot;delete&amp;quot;: {&lt;br /&gt;
             &amp;quot;delete_searchable_snapshot&amp;quot;: true&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Get index's ilm status  获取索引当前 ILM 状态 ====&lt;br /&gt;
 GET /${index_name}/_ilm/explain&lt;br /&gt;
&lt;br /&gt;
 GET /${index_name}/_ilm/explain?human&lt;br /&gt;
&lt;br /&gt;
==== Move index's ilm to step  修改索引的ILM阶段状态(人为触发ILM action执行) ====&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html&lt;br /&gt;
 POST _ilm/move/my-index-000001&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;complete&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;warm&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;forcemerge&amp;quot;, &lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;forcemerge&amp;quot; &lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Manually create an index that is managed by template and ILM (including rollover operations by day)  ====&lt;br /&gt;
&lt;br /&gt;
===== 手动创建原本应由template和ilm管控的索引，且索引名内包含日期(动态索引名) =====&lt;br /&gt;
⚠️ 这种索引不能直接粗暴地 &amp;lt;code&amp;gt;PUT /index-name-2022.10.23-000022&amp;lt;/code&amp;gt; 以创建索引，否则手动创建出来的索引，在rollover滚动 (例如rollover-max_age:1d)的时候，创建出来的新索引名字仍然是创建索引时定义的日期，而不是当天轮滚发生时的日期(如 &amp;lt;code&amp;gt;index-name-2022.10.23-000023&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
这个现象可以通过判断 &amp;lt;code&amp;gt;GET /index-name/_settings&amp;lt;/code&amp;gt; 中 &amp;lt;code&amp;gt;index.provided_name&amp;lt;/code&amp;gt; 属性看出来&lt;br /&gt;
&lt;br /&gt;
解法:&lt;br /&gt;
 PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E&lt;br /&gt;
注意在kibana-Dev Tools中不要做URL Decode，他就是这样的需要编码一下(解码后就是: &amp;lt;code&amp;gt;&amp;lt;index-name-{now/d}-000099&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
ps: 如果怕创建错名字的话，可以使用 &amp;lt;code&amp;gt;GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings&amp;lt;/code&amp;gt; 预览一下生成的索引名效果&lt;br /&gt;
&lt;br /&gt;
对于索引最后的这个序号，[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么，该编号始终为 6 个字符，且为零填充]。即使手动创建的索引结尾是&amp;lt;code&amp;gt;-00001&amp;lt;/code&amp;gt;，在rollover发生以后，索引后缀序号依然会变成&amp;lt;code&amp;gt;-000002&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 故障处理: 有的时候对现有的索引修改了其引用的 ilm policy 为别的 policy,或者修改了其引用的 ilm policy中的 phase 定义。会导致索引ilm故障 ====&lt;br /&gt;
有可能导致他的ilm处理会出问题（不记得怎么告警），没记错的话通过 &amp;lt;code&amp;gt;GET {index_name}/_ilm/explain&amp;lt;/code&amp;gt; 能看到 error 信息，能看到卡在某个 phase 失败&lt;br /&gt;
&lt;br /&gt;
这时候需要人为修改 index 的 ilm phase 修复，如&lt;br /&gt;
 POST _ilm/move/insight-es-k8s-logs-dce5-aliyun-default-prd-2024.01.16&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;hot&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;rollover&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;ERROR&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;cold&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
或者尝试通过 &amp;lt;code&amp;gt;POST {index_name}/_ilm/retry&amp;lt;/code&amp;gt; 接口重试 &lt;br /&gt;
&lt;br /&gt;
===Cluster setting related ES集群参数设置===&lt;br /&gt;
 /_cluster/settings?include_defaults=true&amp;amp;pretty&lt;br /&gt;
&lt;br /&gt;
 /_cluster/settings?include_defaults=true&lt;br /&gt;
&lt;br /&gt;
==== Wildcard expressions or all indices are not allowed ====&lt;br /&gt;
&lt;br /&gt;
===== 允许泛匹配删除索引 =====&lt;br /&gt;
 PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
     &amp;quot;action&amp;quot;: {&lt;br /&gt;
       &amp;quot;destructive_requires_name&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====primaries recovery settings ====&lt;br /&gt;
=====控制索引恢复或者relocating的并发数=====&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 10,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_outgoing_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 20&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: null&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 30,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 10&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;.&lt;br /&gt;
 # PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 8&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===&lt;br /&gt;
加大此数值可以有效缩短es relocating index的耗时&lt;br /&gt;
&lt;br /&gt;
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to &amp;lt;code&amp;gt;40mb&amp;lt;/code&amp;gt; unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Index settings===&lt;br /&gt;
&lt;br /&gt;
====modify the number of replicas in bulk====&lt;br /&gt;
&lt;br /&gt;
===== 批量/单个 设置索引副本数 =====&lt;br /&gt;
 PUT /index_name*/_settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;index&amp;quot;: {&lt;br /&gt;
     &amp;quot;number_of_replicas&amp;quot;: 1&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Search Documents ===&lt;br /&gt;
&lt;br /&gt;
==== match_all 搜索 ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match_all&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 单字段排序匹配搜索(match) ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match&amp;quot;: {&lt;br /&gt;
       &amp;quot;segment_id&amp;quot;: &amp;quot;b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sort&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;start_time&amp;quot;: {&lt;br /&gt;
         &amp;quot;order&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行聚合(查询该字段有多少种类型的值) ====&lt;br /&gt;
 GET /.monitoring-es-7-2024.12.13/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;unique_types&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===&lt;br /&gt;
ECK operator下管理的Elasticsearch如果要修改&amp;lt;code&amp;gt;cluster.routing.allocation.exclude&amp;lt;/code&amp;gt; 的参数配置，需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false'，不然会配置一会就会被刷回原状&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
&lt;br /&gt;
====对于有大量索引的刚重启的es集群====&lt;br /&gt;
(主分片在1w-2w)&lt;br /&gt;
&lt;br /&gt;
=====加快es集群恢复速度=====&lt;br /&gt;
结合es节点资源监控图，观测节点cpu压力，以及cpu IO wait&lt;br /&gt;
&lt;br /&gt;
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
和 node_concurrent_recoveries &lt;br /&gt;
&lt;br /&gt;
(A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Defaults to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;)数值&lt;br /&gt;
&lt;br /&gt;
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从red状态到yellow状态的耗时：增加索引副本数量，增加node_initial_primaries_recoveries值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从yellow状态到green状态的耗时：增加 node_concurrent_recoveries 值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通过访问 &amp;lt;code&amp;gt;/_cluster/allocation/explain&amp;lt;/code&amp;gt; 接口查到阻碍集群 to green(yellow)的原因&lt;br /&gt;
&lt;br /&gt;
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====&lt;br /&gt;
调整缩小 jvm 配置值，尽量不超配(requests 和 limit尽量一致或提高requests值)&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
==== 集群分片数达到maximum错误 ====&lt;br /&gt;
集群分片数达到maximum错误会有如下log信息，但是集群的健康状态不会改变&lt;br /&gt;
 2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;&lt;br /&gt;
解决:&lt;br /&gt;
&lt;br /&gt;
调整index ilm 策略或者调整集群的max_shards_per_node配置&lt;br /&gt;
&lt;br /&gt;
临时生效配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;transient&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
永久更改性配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;persistent&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
{{DEFAULTSORT:api随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Java%E5%AE%B9%E5%99%A8%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0%E9%9A%8F%E8%AE%B0&amp;diff=1658</id>
		<title>Java容器相关参数随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Java%E5%AE%B9%E5%99%A8%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0%E9%9A%8F%E8%AE%B0&amp;diff=1658"/>
		<updated>2025-06-24T08:36:22Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Java动态参数随记|Java动态参数随记(注入运行时参数)]]&lt;br /&gt;
&lt;br /&gt;
[[Java命令参数随记]]&lt;br /&gt;
&lt;br /&gt;
=== 命令随记 ===&lt;br /&gt;
查看系统中有哪些java进程，命令 &amp;lt;code&amp;gt;jps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
查看指定java进程占用的内存情况，命令 &amp;lt;code&amp;gt;jmap -heap ${PID}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
查看系统或容器配置，命令 &amp;lt;code&amp;gt;java -XshowSettings:system -version&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
查看JVM的相关配置，命令 &amp;lt;code&amp;gt;java -XshowSettings:vm -version&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
查看支持的java参数列表 &amp;lt;code&amp;gt;java -XX:+PrintFlagsFinal -version&amp;lt;/code&amp;gt;，视情况需要加上&amp;lt;code&amp;gt;-XX:+UnlockExperimentalVMOptions&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;-XX:+UnlockDiagnosticVMOptions&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
查看是否支持&amp;lt;code&amp;gt;UseCGroupMemoryLimitForHeap&amp;lt;/code&amp;gt;参数 &amp;lt;code&amp;gt;java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version |grep -i UseCGroupMemoryLimitForHeap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JVM参数 ===&lt;br /&gt;
&lt;br /&gt;
==== -XX:+UnlockExperimentalVMOptions ====&lt;br /&gt;
用于解锁实验性参数&lt;br /&gt;
&lt;br /&gt;
==== -XX:+UnlockDiagnosticVMOptions ====&lt;br /&gt;
用于解锁一些诊断性的JVM选项。这些选项通常用于调试和诊断JVM的问题。&lt;br /&gt;
&lt;br /&gt;
当JVM运行时，某些选项可能会被禁用以提高安全性和稳定性。UnlockDiagnosticVMOptions参数可以用于解锁这些选项，以便可以在运行时使用它们来进行调试和诊断。&lt;br /&gt;
&lt;br /&gt;
==== -XX:+UseCGroupMemoryLimitForHeap ====&lt;br /&gt;
实验性参数，用于让Xmx感知docker的memory limit&lt;br /&gt;
&lt;br /&gt;
这个参数自JDK8u121加入，在java8,9,10中都可用，不过由于在JDK8u191后新增了容器支持开关-XX:UseContainerSupport，并且默认开启，建议使用UseContainerSupport参数&lt;br /&gt;
&lt;br /&gt;
java11正式移除UseCGroupMemoryLimitForHeap，代码改动见8194086: Remove deprecated experimental flag UseCGroupMemoryLimitForHeap&lt;br /&gt;
&lt;br /&gt;
==== 其他参数 ====&lt;br /&gt;
&lt;br /&gt;
JDK8u191增加了这些参数:&lt;br /&gt;
&lt;br /&gt;
* MaxRAMPercentage 堆的最大值百分比。&lt;br /&gt;
&lt;br /&gt;
* InitialRAMPercentage 堆的初始化的百分比。&lt;br /&gt;
&lt;br /&gt;
* MinRAMPercentage 堆的最小值的百分比。&lt;br /&gt;
&lt;br /&gt;
如果使用了-Xmx参数，则直接将MaxHeapSize（最大堆大小）等同于我们设置的-Xmx。&lt;br /&gt;
&lt;br /&gt;
=== cgroup 与 java ===&lt;br /&gt;
1. jvm当前生效感知的CPU 内存限制&lt;br /&gt;
&lt;br /&gt;
* 自 openjdk 8u131 起，有参数 -XX:+UseCGroupMemoryLimitForHeap 感知内存限制，8u191 起 XX:+UseContainerSupport 参数来支持 JVM 容器化。&lt;br /&gt;
&lt;br /&gt;
* 在 CGroup V2 下，需要 8u372、11.0.16、15 及以上才能正常感知到 (https://bugs.openjdk.org/browse/JDK-8230305) &lt;br /&gt;
&lt;br /&gt;
2. Oracle 相关 jdk/jre (8uxxx) yum 可以在 &amp;lt;nowiki&amp;gt;https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html&amp;lt;/nowiki&amp;gt; 获取&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
COPY FROM: &lt;br /&gt;
&lt;br /&gt;
* [https://blog.kelu.org/tech/2018/05/30/running-a-jvm-in-a-container-without-getting-killed.html 防止容器因 jvm 占用资源过多被杀死而频繁重启]&lt;br /&gt;
* [https://jvm-argument-for-docker.teaho.net/ 容器环境下的相关JVM参数]&lt;br /&gt;
* [https://cloud.tencent.com/developer/article/1340356 聊聊新版JDK对docker容器的支持]&lt;br /&gt;
* [https://blog.csdn.net/Thousa_Ho/article/details/77278656 JVM 参数使用总结]&lt;br /&gt;
&lt;br /&gt;
[[分类:Java]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1657</id>
		<title>使用jq批量修改es index template的lifecycle配置</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1657"/>
		<updated>2025-06-19T08:19:04Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;aka: use jq tool to modify es index template lifecycle setting in bulk&lt;br /&gt;
&lt;br /&gt;
新版本的es index template不支持通过结合索引匹配+优先级配置的方式来叠加批量修改已存在的索引模版(legacy template 支持)，只支持通过compose实现类似用法，部分场景会带来大量的搬砖成本(例如修改skywalking的索引模板中的生命周期配置或者索引副本数配置)&lt;br /&gt;
&lt;br /&gt;
引入脚本:&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#set -exu&lt;br /&gt;
set -ue&lt;br /&gt;
host=&amp;quot;127.0.0.1:9200&amp;quot;&lt;br /&gt;
username=&amp;quot;elastic&amp;quot;&lt;br /&gt;
password=&amp;quot;elastic&amp;quot;&lt;br /&gt;
ilm_name=&amp;quot;sw-default-ilm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl_options=(&lt;br /&gt;
  &amp;quot;-u&amp;quot; &amp;quot;$username:$password&amp;quot;&lt;br /&gt;
  &amp;quot;-s&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
es_sw_templates=`curl ${curl_options[@]} &amp;quot;$host/_cat/templates/sw*?s=name&amp;quot; | awk '{print $1}'`&lt;br /&gt;
# bak&lt;br /&gt;
curl ${curl_options[@]} &amp;quot;${host}/_index_template?pretty&amp;quot; &amp;gt; es-${host}-index-templates_`date +%F%T`.bak.json&lt;br /&gt;
&lt;br /&gt;
for template in ${es_sw_templates[@]}&lt;br /&gt;
do&lt;br /&gt;
  if [[ $template == &amp;quot;sw_segment&amp;quot; ]]&lt;br /&gt;
  then&lt;br /&gt;
    continue&lt;br /&gt;
  fi&lt;br /&gt;
  echo PUT /_index_template/${template}&lt;br /&gt;
  new_template=&amp;quot;&amp;quot;&lt;br /&gt;
  new_template=`curl ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; | jq '.index_templates[0].index_template |  .template.settings.index.lifecycle.name |= &amp;quot;'${ilm_name}'&amp;quot;'`&lt;br /&gt;
  curl -X PUT -H &amp;quot;Content-Type: application/json&amp;quot; ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; -d &amp;quot;${new_template}&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
{{DEFAULTSORT:jq}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1656</id>
		<title>使用jq批量修改es index template的lifecycle配置</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E4%BD%BF%E7%94%A8jq%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9es_index_template%E7%9A%84lifecycle%E9%85%8D%E7%BD%AE&amp;diff=1656"/>
		<updated>2025-06-19T08:17:57Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;aka: use jq tool to modify es index template lifecycle setting in bulk&lt;br /&gt;
&lt;br /&gt;
新版本的es index template不支持通过结合索引匹配+优先级配置的方式来叠加批量修改已存在的索引模版(legacy template 支持)，只支持通过compose实现类似用法，部分场景会带来大量的搬砖成本(例如修改skywalking的索引模板中的生命周期配置或者索引副本数配置)&lt;br /&gt;
&lt;br /&gt;
引入脚本:&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #set -exu&lt;br /&gt;
 set -ue&lt;br /&gt;
 host=&amp;quot;127.0.0.1:9200&amp;quot;&lt;br /&gt;
 username=&amp;quot;elastic&amp;quot;&lt;br /&gt;
 password=&amp;quot;elastic&amp;quot;&lt;br /&gt;
 ilm_name=&amp;quot;sw-default-ilm&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 curl_options=(&lt;br /&gt;
   &amp;quot;-u&amp;quot; &amp;quot;$username:$password&amp;quot;&lt;br /&gt;
   &amp;quot;-s&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 es_sw_templates=`curl ${curl_options[@]} &amp;quot;$host/_cat/templates/sw*?s=name&amp;quot; | awk '{print $1}'`&lt;br /&gt;
 # bak&lt;br /&gt;
 curl ${curl_options[@]} &amp;quot;${host}/_index_template?pretty&amp;quot; &amp;gt; es-${host}-index-templates_`date +%F%T`.bak.json&lt;br /&gt;
 &lt;br /&gt;
 for template in ${es_sw_templates[@]}&lt;br /&gt;
 do&lt;br /&gt;
   &lt;br /&gt;
   if [[ $template == &amp;quot;sw_segment&amp;quot; ]]&lt;br /&gt;
   then&lt;br /&gt;
     continue&lt;br /&gt;
   fi&lt;br /&gt;
   echo PUT /_index_template/${template}&lt;br /&gt;
   new_template=&amp;quot;&amp;quot;&lt;br /&gt;
   new_template=`curl ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; | jq '.index_templates[0].index_template |  .template.settings.index.lifecycle.name |= &amp;quot;'${ilm_name}'&amp;quot;'`&lt;br /&gt;
   curl -X PUT -H &amp;quot;Content-Type: application/json&amp;quot; ${curl_options[@]} &amp;quot;${host}/_index_template/${template}&amp;quot; -d &amp;quot;${new_template}&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
 done  &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
[[分类:Linux]]&lt;br /&gt;
{{DEFAULTSORT:jq}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E6%80%8E%E4%B9%88%E6%84%9F%E7%9F%A5%E5%88%B0%E5%86%85%E5%AD%98limit%E7%84%B6%E5%90%8E%E4%BC%A0%E9%80%92%E7%BB%99java%E7%9A%84xms%E5%92%8Cxmx%E5%8F%82%E6%95%B0&amp;diff=1655</id>
		<title>Elasticsearch7在容器中运行的时候是怎么感知到内存limit然后传递给java的xms和xmx参数</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E6%80%8E%E4%B9%88%E6%84%9F%E7%9F%A5%E5%88%B0%E5%86%85%E5%AD%98limit%E7%84%B6%E5%90%8E%E4%BC%A0%E9%80%92%E7%BB%99java%E7%9A%84xms%E5%92%8Cxmx%E5%8F%82%E6%95%B0&amp;diff=1655"/>
		<updated>2025-06-19T05:49:29Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;首先，看一下elasticsearch容器的启动命令，避免被&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; 迷惑&lt;br /&gt;
 [root@gzu1 ~]# docker inspect 1.1.1.1/library/elasticsearch:7.17.5| jq '.[].ContainerConfig | {Cmd,Entrypoint} '&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;Cmd&amp;quot;: [&lt;br /&gt;
     &amp;quot;/bin/sh&amp;quot;,&lt;br /&gt;
     &amp;quot;-c&amp;quot;,&lt;br /&gt;
     &amp;quot;#(nop) &amp;quot;,&lt;br /&gt;
     &amp;quot;CMD [\&amp;quot;eswrapper\&amp;quot;]&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;Entrypoint&amp;quot;: [&lt;br /&gt;
     &amp;quot;/bin/tini&amp;quot;,&lt;br /&gt;
     &amp;quot;--&amp;quot;,&lt;br /&gt;
     &amp;quot;/usr/local/bin/docker-entrypoint.sh&amp;quot;&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
进入到 es 容器中确认，与1号进程是预期一致的&lt;br /&gt;
 [root@gzu1 ~]# kubectl exec -it -n es-system es-data-0 -- bash&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''ps auxwwww'''&lt;br /&gt;
 USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND&lt;br /&gt;
 root           '''1'''  0.0  0.0   2500   540 ?        Ss   Mar27   3:07 '''&amp;lt;u&amp;gt;/bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 elastic+       7  103  4.7 103849888 18890788 ?  Sl   Mar27 124591:05 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-2689440660253749261 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m -Des.cgroups.hierarchy.override=/ '''&amp;lt;u&amp;gt;-Xms16384m -Xmx16384m&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=8589934592 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/usr/share/elasticsearch/config -Des.distribution.flavor=default -Des.distribution.type=docker -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch&lt;br /&gt;
 elastic+     224  0.0  0.0 108392  4636 ?        Sl   Mar27   0:00 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller&lt;br /&gt;
 root       50256  0.0  0.0   4244  2324 pts/0    Ss+  04:05   0:00 bash&lt;br /&gt;
 root       64422  0.3  0.0   4376  2328 pts/1    Ss   05:22   0:00 bash&lt;br /&gt;
 root       64430  0.0  0.0   5900  1492 pts/1    R+   05:22   0:00 ps auxwwww&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;br /&amp;gt;可以看到这里实际的运行 elasticsearch 的 java 命令中，居然有Xms 和Xmx，而且是 pod 内存限制的一半'''&lt;br /&gt;
&lt;br /&gt;
而在当前pod yaml中，并没有指定这些参数:&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[].resources'&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;limits&amp;quot;: {&lt;br /&gt;
     &amp;quot;cpu&amp;quot;: &amp;quot;8&amp;quot;,&lt;br /&gt;
     &amp;quot;memory&amp;quot;: &amp;quot;'''32Gi'''&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;requests&amp;quot;: {&lt;br /&gt;
     &amp;quot;cpu&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
     &amp;quot;memory&amp;quot;: &amp;quot;'''32Gi'''&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[].env'&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;POD_IP&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;status.podIP&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;POD_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;metadata.name&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NODE_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;spec.nodeName&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NAMESPACE&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;metadata.namespace&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;PROBE_PASSWORD_PATH&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;/mnt/elastic-internal/probe-user/elastic-internal-probe&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;PROBE_USERNAME&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;elastic-internal-probe&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;READINESS_PROBE_PROTOCOL&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;http&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;HEADLESS_SERVICE_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;dmp-es-data&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NSS_SDB_USE_CACHE&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[]'|grep -i env # 确认没有通过configmap等其他形式挂入env&lt;br /&gt;
   &amp;quot;env&amp;quot;: [&lt;br /&gt;
 [root@gzu1 ~]#&lt;br /&gt;
&lt;br /&gt;
这时候打开 &amp;lt;code&amp;gt;/usr/local/bin/docker-entrypoint.sh&amp;lt;/code&amp;gt; 脚本开始检查 该 elasticsearch 的初始化过程，能发现&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/docker-entrypoint.sh&amp;lt;/code&amp;gt; 经过一些简单的初始化以后，还会按需通过读取一些文件，转化为本文暂时不关注的环境变量，最后会调用 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
而 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt; ,众所周知，他还是一个脚本&lt;br /&gt;
&lt;br /&gt;
在该脚本中，他会执行 &amp;lt;code&amp;gt;source &amp;quot;`dirname &amp;quot;$0&amp;quot;`&amp;quot;/elasticsearch-env&amp;lt;/code&amp;gt; ，也就是通过 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch-env&amp;lt;/code&amp;gt; 做一些环境初始化， 例如定义&amp;lt;code&amp;gt;ES_JAVA_HOME&amp;lt;/code&amp;gt; 环境变量，以及决定用内置&amp;lt;code&amp;gt;jdk&amp;lt;/code&amp;gt;还是通过&amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt;指定的&amp;lt;code&amp;gt;jdk&amp;lt;/code&amp;gt;。还会按需通过读取一些文件，转化为本文暂时不关注的环境变量&lt;br /&gt;
&lt;br /&gt;
然后在指定完需要用哪个 &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; 以后，回到&amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以看到存在一些不起眼的代码&lt;br /&gt;
 # CONTROLLING STARTUP:&lt;br /&gt;
 #&lt;br /&gt;
 # This script relies on a few environment variables to determine startup&lt;br /&gt;
 # behavior, those variables are:&lt;br /&gt;
 #&lt;br /&gt;
 #   ES_PATH_CONF -- Path to config directory&lt;br /&gt;
 #   ES_JAVA_OPTS -- External Java Opts on top of the defaults set&lt;br /&gt;
 #&lt;br /&gt;
 # '''Optionally, exact memory values can be set using the `ES_JAVA_OPTS`'''. Example&lt;br /&gt;
 # values are &amp;quot;512m&amp;quot;, and &amp;quot;10g&amp;quot;.&lt;br /&gt;
 #&lt;br /&gt;
 #   ES_JAVA_OPTS=&amp;quot;-Xms8g -Xmx8g&amp;quot; ./bin/elasticsearch&lt;br /&gt;
 &lt;br /&gt;
 ........&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$ES_TMPDIR&amp;quot; ]; then&lt;br /&gt;
   ES_TMPDIR=`&amp;quot;$JAVA&amp;quot; &amp;quot;$XSHARE&amp;quot; -cp &amp;quot;$ES_CLASSPATH&amp;quot; org.elasticsearch.tools.launchers.TempDirectory`&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 .......&lt;br /&gt;
 &lt;br /&gt;
 # The JVM options parser produces the final JVM options to start Elasticsearch.&lt;br /&gt;
 # It does this by incorporating JVM options in the following way:&lt;br /&gt;
 #   '''- first, system JVM options are applied (these are hardcoded options in the'''&lt;br /&gt;
 #     '''parser)'''&lt;br /&gt;
 #   - second, JVM options are read from jvm.options and jvm.options.d/*.options&lt;br /&gt;
 #   - third, JVM options from ES_JAVA_OPTS are applied&lt;br /&gt;
 #   - fourth, ergonomic JVM options are applied&lt;br /&gt;
 '''ES_JAVA_OPTS=`export ES_TMPDIR; &amp;quot;$JAVA&amp;quot; &amp;quot;$XSHARE&amp;quot; -cp &amp;quot;$ES_CLASSPATH&amp;quot; org.elasticsearch.tools.launchers.JvmOptionsParser &amp;quot;$ES_PATH_CONF&amp;quot; &amp;quot;$ES_HOME/plugins&amp;quot;`'''&lt;br /&gt;
我们在 elasticsearch 容器中同样执行这些代码看看效果:&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; org.elasticsearch.tools.launchers.TempDirectory&lt;br /&gt;
 /tmp/elasticsearch-9132815636720135492&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# export ES_TMPDIR=/tmp/elasticsearch-9132815636720135492&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''/usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; &amp;lt;u&amp;gt;org.elasticsearch.tools.launchers.JvmOptionsParser&amp;lt;/u&amp;gt; /usr/share/elasticsearch/config /usr/share/elasticsearch/plugins'''&lt;br /&gt;
 -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-9132815636720135492 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m '''&amp;lt;u&amp;gt;-Xms16384m -Xmx16384m&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=8589934592 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25&lt;br /&gt;
在这里找到了Xms 和 Xmx的定义，也就是说 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt; 脚本会通过执行 &amp;lt;code&amp;gt;org.elasticsearch.tools.launchers.TempDirectory&amp;lt;/code&amp;gt; 产生一个临时文件夹，然后继续执行 &amp;lt;code&amp;gt;org.elasticsearch.tools.launchers.JvmOptionsParser&amp;lt;/code&amp;gt; 产生合适的 Xms 及 Xmx 参数&lt;br /&gt;
&lt;br /&gt;
而如果我们在环境变量中预先定义了 &amp;lt;code&amp;gt;ES_JAVA_OPTS&amp;lt;/code&amp;gt; ，就会有如下效果(在该脚本注释中也有提到)&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''export ES_JAVA_OPTS=&amp;quot;-Xms8g -Xmx8g&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''/usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; org.elasticsearch.tools.launchers.JvmOptionsParser /usr/share/elasticsearch/config /usr/share/elasticsearch/plugins'''&lt;br /&gt;
 -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-9132815636720135492 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m '''&amp;lt;u&amp;gt;-Xms8g -Xmx8g&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=4294967296 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25&lt;br /&gt;
[[分类:Elasticsearch]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E6%80%8E%E4%B9%88%E6%84%9F%E7%9F%A5%E5%88%B0%E5%86%85%E5%AD%98limit%E7%84%B6%E5%90%8E%E4%BC%A0%E9%80%92%E7%BB%99java%E7%9A%84xms%E5%92%8Cxmx%E5%8F%82%E6%95%B0&amp;diff=1654</id>
		<title>Elasticsearch7在容器中运行的时候是怎么感知到内存limit然后传递给java的xms和xmx参数</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E6%80%8E%E4%B9%88%E6%84%9F%E7%9F%A5%E5%88%B0%E5%86%85%E5%AD%98limit%E7%84%B6%E5%90%8E%E4%BC%A0%E9%80%92%E7%BB%99java%E7%9A%84xms%E5%92%8Cxmx%E5%8F%82%E6%95%B0&amp;diff=1654"/>
		<updated>2025-06-19T05:46:33Z</updated>

		<summary type="html">&lt;p&gt;Admin：​创建页面，内容为“首先，看一下elasticsearch容器的启动命令，避免被&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; 迷惑  [root@gzu1 ~]# docker inspect 1.1.1.1/library/elasticsearch:7.17.5| jq '.[].ContainerConfig | {Cmd,Entrypoint} '  {    &amp;quot;Cmd&amp;quot;: [      &amp;quot;/bin/sh&amp;quot;,      &amp;quot;-c&amp;quot;,      &amp;quot;#(nop) &amp;quot;,      &amp;quot;CMD [\&amp;quot;eswrapper\&amp;quot;]&amp;quot;    ],    &amp;quot;Entrypoint&amp;quot;: [      &amp;quot;/bin/tini&amp;quot;,      &amp;quot;--&amp;quot;,      &amp;quot;/usr/local/bin/docker-entrypoint.sh&amp;quot;    ]  } 进入到 es 容器中确认，与1号进程是预期一致的  [root@gz…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;首先，看一下elasticsearch容器的启动命令，避免被&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; 迷惑&lt;br /&gt;
 [root@gzu1 ~]# docker inspect 1.1.1.1/library/elasticsearch:7.17.5| jq '.[].ContainerConfig | {Cmd,Entrypoint} '&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;Cmd&amp;quot;: [&lt;br /&gt;
     &amp;quot;/bin/sh&amp;quot;,&lt;br /&gt;
     &amp;quot;-c&amp;quot;,&lt;br /&gt;
     &amp;quot;#(nop) &amp;quot;,&lt;br /&gt;
     &amp;quot;CMD [\&amp;quot;eswrapper\&amp;quot;]&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;Entrypoint&amp;quot;: [&lt;br /&gt;
     &amp;quot;/bin/tini&amp;quot;,&lt;br /&gt;
     &amp;quot;--&amp;quot;,&lt;br /&gt;
     &amp;quot;/usr/local/bin/docker-entrypoint.sh&amp;quot;&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
进入到 es 容器中确认，与1号进程是预期一致的&lt;br /&gt;
 [root@gzu1 ~]# kubectl exec -it -n es-system es-data-0 -- bash&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''ps auxwwww'''&lt;br /&gt;
 USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND&lt;br /&gt;
 root           '''1'''  0.0  0.0   2500   540 ?        Ss   Mar27   3:07 '''&amp;lt;u&amp;gt;/bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 elastic+       7  103  4.7 103849888 18890788 ?  Sl   Mar27 124591:05 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-2689440660253749261 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m -Des.cgroups.hierarchy.override=/ '''&amp;lt;u&amp;gt;-Xms16384m -Xmx16384m&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=8589934592 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/usr/share/elasticsearch/config -Des.distribution.flavor=default -Des.distribution.type=docker -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch&lt;br /&gt;
 elastic+     224  0.0  0.0 108392  4636 ?        Sl   Mar27   0:00 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller&lt;br /&gt;
 root       50256  0.0  0.0   4244  2324 pts/0    Ss+  04:05   0:00 bash&lt;br /&gt;
 root       64422  0.3  0.0   4376  2328 pts/1    Ss   05:22   0:00 bash&lt;br /&gt;
 root       64430  0.0  0.0   5900  1492 pts/1    R+   05:22   0:00 ps auxwwww&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
可以看到这里实际的运行 elasticsearch 的java命令中，居然有Xms 和Xmx，而且是pod 内存限制的一半&lt;br /&gt;
&lt;br /&gt;
而在当前pod yaml中，并没有指定这些参数:&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[].resources'&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;limits&amp;quot;: {&lt;br /&gt;
     &amp;quot;cpu&amp;quot;: &amp;quot;8&amp;quot;,&lt;br /&gt;
     &amp;quot;memory&amp;quot;: &amp;quot;'''32Gi'''&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;requests&amp;quot;: {&lt;br /&gt;
     &amp;quot;cpu&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
     &amp;quot;memory&amp;quot;: &amp;quot;'''32Gi'''&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[].env'&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;POD_IP&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;status.podIP&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;POD_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;metadata.name&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NODE_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;spec.nodeName&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NAMESPACE&amp;quot;,&lt;br /&gt;
     &amp;quot;valueFrom&amp;quot;: {&lt;br /&gt;
       &amp;quot;fieldRef&amp;quot;: {&lt;br /&gt;
         &amp;quot;apiVersion&amp;quot;: &amp;quot;v1&amp;quot;,&lt;br /&gt;
         &amp;quot;fieldPath&amp;quot;: &amp;quot;metadata.namespace&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;PROBE_PASSWORD_PATH&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;/mnt/elastic-internal/probe-user/elastic-internal-probe&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;PROBE_USERNAME&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;elastic-internal-probe&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;READINESS_PROBE_PROTOCOL&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;http&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;HEADLESS_SERVICE_NAME&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;dmp-es-data&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;NSS_SDB_USE_CACHE&amp;quot;,&lt;br /&gt;
     &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
 [root@gzu1 ~]# kubectl get pods -n es-system es-data-0 -o json | jq '.spec.containers[]'|grep -i env # 确认没有通过configmap等其他形式挂入env&lt;br /&gt;
   &amp;quot;env&amp;quot;: [&lt;br /&gt;
 [root@gzu1 ~]#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这时候打开 &amp;lt;code&amp;gt;/usr/local/bin/docker-entrypoint.sh&amp;lt;/code&amp;gt; 脚本开始检查 该 elasticsearch 的初始化过程，能发现&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/docker-entrypoint.sh&amp;lt;/code&amp;gt; 经过一些简单的初始化以后，还会按需通过读取一些文件，转化为本文暂时不关注的环境变量，最后会调用 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
而 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt; 总所周知，他还是一个脚本&lt;br /&gt;
&lt;br /&gt;
在该脚本中，他会执行 &amp;lt;code&amp;gt;source &amp;quot;`dirname &amp;quot;$0&amp;quot;`&amp;quot;/elasticsearch-env&amp;lt;/code&amp;gt; ，也就是通过 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch-env&amp;lt;/code&amp;gt; 做一些环境初始化， 例如定义&amp;lt;code&amp;gt;ES_JAVA_HOME&amp;lt;/code&amp;gt; 环境变量，以及决定用内置&amp;lt;code&amp;gt;jdk&amp;lt;/code&amp;gt;还是通过&amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt;指定的&amp;lt;code&amp;gt;jdk&amp;lt;/code&amp;gt;。还会按需通过读取一些文件，转化为本文暂时不关注的环境变量&lt;br /&gt;
&lt;br /&gt;
然后在指定完需要用哪个 &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; 以后，回到&amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以看到存在一些不起眼的代码&lt;br /&gt;
 # CONTROLLING STARTUP:&lt;br /&gt;
 #&lt;br /&gt;
 # This script relies on a few environment variables to determine startup&lt;br /&gt;
 # behavior, those variables are:&lt;br /&gt;
 #&lt;br /&gt;
 #   ES_PATH_CONF -- Path to config directory&lt;br /&gt;
 #   ES_JAVA_OPTS -- External Java Opts on top of the defaults set&lt;br /&gt;
 #&lt;br /&gt;
 # '''Optionally, exact memory values can be set using the `ES_JAVA_OPTS`'''. Example&lt;br /&gt;
 # values are &amp;quot;512m&amp;quot;, and &amp;quot;10g&amp;quot;.&lt;br /&gt;
 #&lt;br /&gt;
 #   ES_JAVA_OPTS=&amp;quot;-Xms8g -Xmx8g&amp;quot; ./bin/elasticsearch&lt;br /&gt;
 &lt;br /&gt;
 ........&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$ES_TMPDIR&amp;quot; ]; then&lt;br /&gt;
   ES_TMPDIR=`&amp;quot;$JAVA&amp;quot; &amp;quot;$XSHARE&amp;quot; -cp &amp;quot;$ES_CLASSPATH&amp;quot; org.elasticsearch.tools.launchers.TempDirectory`&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 .......&lt;br /&gt;
 &lt;br /&gt;
 # The JVM options parser produces the final JVM options to start Elasticsearch.&lt;br /&gt;
 # It does this by incorporating JVM options in the following way:&lt;br /&gt;
 #   '''- first, system JVM options are applied (these are hardcoded options in the'''&lt;br /&gt;
 #     '''parser)'''&lt;br /&gt;
 #   - second, JVM options are read from jvm.options and jvm.options.d/*.options&lt;br /&gt;
 #   - third, JVM options from ES_JAVA_OPTS are applied&lt;br /&gt;
 #   - fourth, ergonomic JVM options are applied&lt;br /&gt;
 '''ES_JAVA_OPTS=`export ES_TMPDIR; &amp;quot;$JAVA&amp;quot; &amp;quot;$XSHARE&amp;quot; -cp &amp;quot;$ES_CLASSPATH&amp;quot; org.elasticsearch.tools.launchers.JvmOptionsParser &amp;quot;$ES_PATH_CONF&amp;quot; &amp;quot;$ES_HOME/plugins&amp;quot;`'''&lt;br /&gt;
我们在 elasticsearch 容器中同样执行这些代码看看效果:&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; org.elasticsearch.tools.launchers.TempDirectory&lt;br /&gt;
 /tmp/elasticsearch-9132815636720135492&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# export ES_TMPDIR=/tmp/elasticsearch-9132815636720135492&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''/usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; &amp;lt;u&amp;gt;org.elasticsearch.tools.launchers.JvmOptionsParser&amp;lt;/u&amp;gt; /usr/share/elasticsearch/config /usr/share/elasticsearch/plugins'''&lt;br /&gt;
 -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-9132815636720135492 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m '''&amp;lt;u&amp;gt;-Xms16384m -Xmx16384m&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=8589934592 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25&lt;br /&gt;
在这里找到了Xms 和 Xmx的定义，也就是说 &amp;lt;code&amp;gt;/usr/share/elasticsearch/bin/elasticsearch&amp;lt;/code&amp;gt; 脚本会通过执行 &amp;lt;code&amp;gt;org.elasticsearch.tools.launchers.TempDirectory&amp;lt;/code&amp;gt; 产生一个临时文件夹，然后继续执行 &amp;lt;code&amp;gt;org.elasticsearch.tools.launchers.JvmOptionsParser&amp;lt;/code&amp;gt; 产生合适的 Xms 及 Xmx 参数&lt;br /&gt;
&lt;br /&gt;
而如果我们在环境变量中预先定义了 &amp;lt;code&amp;gt;ES_JAVA_OPTS&amp;lt;/code&amp;gt; ，就会有如下效果(在该脚本注释中也有提到)&lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''export ES_JAVA_OPTS=&amp;quot;-Xms8g -Xmx8g&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 root@es-data-0:/usr/share/elasticsearch# '''/usr/share/elasticsearch/jdk/bin/java -Xshare:auto -cp &amp;quot;/usr/share/elasticsearch/lib/*&amp;quot; org.elasticsearch.tools.launchers.JvmOptionsParser /usr/share/elasticsearch/config /usr/share/elasticsearch/plugins'''&lt;br /&gt;
 -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=SPI,COMPAT --add-opens=java.base/java.io=ALL-UNNAMED -Djava.security.manager=allow -XX:+UseG1GC -Djava.io.tmpdir=/tmp/elasticsearch-9132815636720135492 -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m '''&amp;lt;u&amp;gt;-Xms8g -Xmx8g&amp;lt;/u&amp;gt;''' -XX:MaxDirectMemorySize=4294967296 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1ReservePercent=25&lt;br /&gt;
[[分类:Elasticsearch]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1653</id>
		<title>Elasticsearch的一些api随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1653"/>
		<updated>2025-06-06T18:46:32Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Health===&lt;br /&gt;
 /_cat/health&lt;br /&gt;
&lt;br /&gt;
 /_cluster/health&lt;br /&gt;
&lt;br /&gt;
===Indices health===&lt;br /&gt;
按条件查看索引状态&lt;br /&gt;
 /_cat/indices?help&lt;br /&gt;
 /_cat/indices?health=red&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=yellow&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=green&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
注意在配合 * 通配符搜索/操作索引的时候，如果涉及隐藏的datastream / 隐藏的index，默认不会匹配命中，必须指定 &amp;lt;code&amp;gt;expand_wildcards=all&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; https://www.elastic.co/guide/en/elasticsearch/reference/7.16/multi-index.html#hidden&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
 /_cat/nodes?v&lt;br /&gt;
查看es各节点磁盘空间占用、分片数目等&lt;br /&gt;
 /_cat/allocation?v&lt;br /&gt;
&lt;br /&gt;
 /_cat/nodeattrs&lt;br /&gt;
&lt;br /&gt;
===Get master node===&lt;br /&gt;
 /_cat/master?v&lt;br /&gt;
&lt;br /&gt;
===Cluster allocation explain related===&lt;br /&gt;
可以用于定位分片状态以及分片为何故障&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
 /_cluster/allocation/explain&lt;br /&gt;
&lt;br /&gt;
===Shards===&lt;br /&gt;
粗略查看分片情况，特别是查看分片分布节点或大小/状态&lt;br /&gt;
 GET /_cat/shards&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_name&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_na*&lt;br /&gt;
查看分片分配失败原因&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
==== Recovery API ====&lt;br /&gt;
Returns information about ongoing and completed shard recoveries, similar to the index recovery API.&lt;br /&gt;
&lt;br /&gt;
For data streams, the API returns information about the stream’s backing indices&lt;br /&gt;
&lt;br /&gt;
可以查看当前正在 relocating 的分片，也能查到各分片处理进度百分比&lt;br /&gt;
 GET /_cat/recovery?active_only=true&amp;amp;s=index&amp;amp;v&lt;br /&gt;
&lt;br /&gt;
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===&lt;br /&gt;
为别名设置可写索引或数据流&lt;br /&gt;
&lt;br /&gt;
If the alias doesn’t exist, the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; action creates it.&lt;br /&gt;
 POST /_aliases &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;actions&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
             &amp;quot;add&amp;quot;: {&lt;br /&gt;
                &amp;quot;index&amp;quot;: &amp;quot;es-k8s-logs-000020&amp;quot;,    &lt;br /&gt;
                &amp;quot;alias&amp;quot;: &amp;quot;es-k8s-logs-alias&amp;quot;,    &lt;br /&gt;
                &amp;quot;is_write_index&amp;quot;: true &lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Thread pool related===&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html&lt;br /&gt;
 /_cluster/settings?pretty&amp;amp;include_defaults=true | grep processors&lt;br /&gt;
&lt;br /&gt;
====Get maximum number of threads info====&lt;br /&gt;
 curl &amp;quot;127.1:9200/_cat/thread_pool?v&amp;amp;h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&amp;amp;pretty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Templates 模板 ===&lt;br /&gt;
 /_cat/templates?v&lt;br /&gt;
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.&lt;br /&gt;
&lt;br /&gt;
新版本中使用 &amp;lt;code&amp;gt;/_index_template&amp;lt;/code&amp;gt; 取代&lt;br /&gt;
 GET/PUT /_template/${template_name}&lt;br /&gt;
但是 index_template 对比 legacy template有个很明显的差异就是，legacy template可以直接根据priority进行叠加覆盖，而index_template哪个template priority高，就只有哪个生效 https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html&amp;lt;blockquote&amp;gt;If a new data stream or index matches more than one index template, the index template with the highest priority is used.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Use template to change the replicas settings of all indexes (Legacy index template) ====&lt;br /&gt;
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. &lt;br /&gt;
&lt;br /&gt;
The order of the merging can be controlled using the &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; parameter, with lower order being applied first, '''and higher orders overriding them.''' &lt;br /&gt;
&lt;br /&gt;
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)&lt;br /&gt;
 PUT /_template/${template_name}&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;order&amp;quot;: 2147483647,&lt;br /&gt;
     &amp;quot;index_patterns&amp;quot;: [&lt;br /&gt;
         &amp;quot;*&amp;quot;&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;settings&amp;quot;: {&lt;br /&gt;
         &amp;quot;index&amp;quot;: {&lt;br /&gt;
             &amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
[[使用jq批量修改es index template的lifecycle配置]]&lt;br /&gt;
&lt;br /&gt;
=== ILM (index lifecycle policy) 索引生命周期 ===&lt;br /&gt;
顾名思义，ilm另外也可用于做ES集群的冷热温架构。&lt;br /&gt;
&lt;br /&gt;
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看&lt;br /&gt;
&lt;br /&gt;
比较难受的是，ilm目前没有类似 &amp;lt;code&amp;gt;_cat/templates&amp;lt;/code&amp;gt; 的接口一次性只查看这个集群已配置的 ILM 策略名字，只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)&lt;br /&gt;
 GET /_ilm/policy&lt;br /&gt;
&lt;br /&gt;
==== Get specific ilm policy detail 获取特定ILM策略定义 ====&lt;br /&gt;
 GET /_ilm/policy/${ilm_name}&lt;br /&gt;
&lt;br /&gt;
 PUT /_ilm/policy/ilm-30d-delete&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;policy&amp;quot;: {&lt;br /&gt;
     &amp;quot;phases&amp;quot;: {&lt;br /&gt;
       &amp;quot;delete&amp;quot;: {&lt;br /&gt;
         &amp;quot;min_age&amp;quot;: &amp;quot;30d&amp;quot;,&lt;br /&gt;
         &amp;quot;actions&amp;quot;: {&lt;br /&gt;
           &amp;quot;delete&amp;quot;: {&lt;br /&gt;
             &amp;quot;delete_searchable_snapshot&amp;quot;: true&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Get index's ilm status  获取索引当前 ILM 状态 ====&lt;br /&gt;
 GET /${index_name}/_ilm/explain&lt;br /&gt;
&lt;br /&gt;
 GET /${index_name}/_ilm/explain?human&lt;br /&gt;
&lt;br /&gt;
==== Move index's ilm to step  修改索引的ILM阶段状态(人为触发ILM action执行) ====&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html&lt;br /&gt;
 POST _ilm/move/my-index-000001&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;complete&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;warm&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;forcemerge&amp;quot;, &lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;forcemerge&amp;quot; &lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Manually create an index that is managed by template and ILM (including rollover operations by day)  ====&lt;br /&gt;
&lt;br /&gt;
===== 手动创建原本应由template和ilm管控的索引，且索引名内包含日期(动态索引名) =====&lt;br /&gt;
⚠️ 这种索引不能直接粗暴地 &amp;lt;code&amp;gt;PUT /index-name-2022.10.23-000022&amp;lt;/code&amp;gt; 以创建索引，否则手动创建出来的索引，在rollover滚动 (例如rollover-max_age:1d)的时候，创建出来的新索引名字仍然是创建索引时定义的日期，而不是当天轮滚发生时的日期(如 &amp;lt;code&amp;gt;index-name-2022.10.23-000023&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
这个现象可以通过判断 &amp;lt;code&amp;gt;GET /index-name/_settings&amp;lt;/code&amp;gt; 中 &amp;lt;code&amp;gt;index.provided_name&amp;lt;/code&amp;gt; 属性看出来&lt;br /&gt;
&lt;br /&gt;
解法:&lt;br /&gt;
 PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E&lt;br /&gt;
注意在kibana-Dev Tools中不要做URL Decode，他就是这样的需要编码一下(解码后就是: &amp;lt;code&amp;gt;&amp;lt;index-name-{now/d}-000099&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
ps: 如果怕创建错名字的话，可以使用 &amp;lt;code&amp;gt;GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings&amp;lt;/code&amp;gt; 预览一下生成的索引名效果&lt;br /&gt;
&lt;br /&gt;
对于索引最后的这个序号，[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么，该编号始终为 6 个字符，且为零填充]。即使手动创建的索引结尾是&amp;lt;code&amp;gt;-00001&amp;lt;/code&amp;gt;，在rollover发生以后，索引后缀序号依然会变成&amp;lt;code&amp;gt;-000002&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 故障处理: 有的时候对现有的索引修改了其引用的 ilm policy 为别的 policy,或者修改了其引用的 ilm policy中的 phase 定义。会导致索引ilm故障 ====&lt;br /&gt;
有可能导致他的ilm处理会出问题（不记得怎么告警），没记错的话通过 &amp;lt;code&amp;gt;GET {index_name}/_ilm/explain&amp;lt;/code&amp;gt; 能看到 error 信息，能看到卡在某个 phase 失败&lt;br /&gt;
&lt;br /&gt;
这时候需要人为修改 index 的 ilm phase 修复，如&lt;br /&gt;
 POST _ilm/move/insight-es-k8s-logs-dce5-aliyun-default-prd-2024.01.16&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;hot&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;rollover&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;ERROR&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;cold&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
或者尝试通过 &amp;lt;code&amp;gt;POST {index_name}/_ilm/retry&amp;lt;/code&amp;gt; 接口重试 &lt;br /&gt;
&lt;br /&gt;
===Cluster setting related ES集群参数设置===&lt;br /&gt;
 /_cluster/settings?include_defaults=true&amp;amp;pretty&lt;br /&gt;
&lt;br /&gt;
 /_cluster/settings?include_defaults=true&lt;br /&gt;
&lt;br /&gt;
==== Wildcard expressions or all indices are not allowed ====&lt;br /&gt;
&lt;br /&gt;
===== 允许泛匹配删除索引 =====&lt;br /&gt;
 PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
     &amp;quot;action&amp;quot;: {&lt;br /&gt;
       &amp;quot;destructive_requires_name&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====primaries recovery settings ====&lt;br /&gt;
=====控制索引恢复或者relocating的并发数=====&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 10,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_outgoing_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 20&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: null&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 30,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 10&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;.&lt;br /&gt;
 # PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 8&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===&lt;br /&gt;
加大此数值可以有效缩短es relocating index的耗时&lt;br /&gt;
&lt;br /&gt;
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to &amp;lt;code&amp;gt;40mb&amp;lt;/code&amp;gt; unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Index settings===&lt;br /&gt;
&lt;br /&gt;
====modify the number of replicas in bulk====&lt;br /&gt;
&lt;br /&gt;
===== 批量/单个 设置索引副本数 =====&lt;br /&gt;
 PUT /index_name*/_settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;index&amp;quot;: {&lt;br /&gt;
     &amp;quot;number_of_replicas&amp;quot;: 1&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Search Documents ===&lt;br /&gt;
&lt;br /&gt;
==== match_all 搜索 ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match_all&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 单字段排序匹配搜索(match) ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match&amp;quot;: {&lt;br /&gt;
       &amp;quot;segment_id&amp;quot;: &amp;quot;b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sort&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;start_time&amp;quot;: {&lt;br /&gt;
         &amp;quot;order&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行聚合(查询该字段有多少种类型的值) ====&lt;br /&gt;
 GET /.monitoring-es-7-2024.12.13/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;unique_types&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===&lt;br /&gt;
ECK operator下管理的Elasticsearch如果要修改&amp;lt;code&amp;gt;cluster.routing.allocation.exclude&amp;lt;/code&amp;gt; 的参数配置，需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false'，不然会配置一会就会被刷回原状&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
&lt;br /&gt;
====对于有大量索引的刚重启的es集群====&lt;br /&gt;
(主分片在1w-2w)&lt;br /&gt;
&lt;br /&gt;
=====加快es集群恢复速度=====&lt;br /&gt;
结合es节点资源监控图，观测节点cpu压力，以及cpu IO wait&lt;br /&gt;
&lt;br /&gt;
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
和 node_concurrent_recoveries &lt;br /&gt;
&lt;br /&gt;
(A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Defaults to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;)数值&lt;br /&gt;
&lt;br /&gt;
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从red状态到yellow状态的耗时：增加索引副本数量，增加node_initial_primaries_recoveries值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从yellow状态到green状态的耗时：增加 node_concurrent_recoveries 值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通过访问 &amp;lt;code&amp;gt;/_cluster/allocation/explain&amp;lt;/code&amp;gt; 接口查到阻碍集群 to green(yellow)的原因&lt;br /&gt;
&lt;br /&gt;
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====&lt;br /&gt;
调整缩小 jvm 配置值，尽量不超配(requests 和 limit尽量一致或提高requests值)&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
==== 集群分片数达到maximum错误 ====&lt;br /&gt;
集群分片数达到maximum错误会有如下log信息，但是集群的健康状态不会改变&lt;br /&gt;
 2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;&lt;br /&gt;
解决:&lt;br /&gt;
&lt;br /&gt;
调整index ilm 策略或者调整集群的max_shards_per_node配置&lt;br /&gt;
&lt;br /&gt;
临时生效配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;transient&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
永久更改性配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;persistent&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
{{DEFAULTSORT:api随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1652</id>
		<title>Elasticsearch的一些api随记</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch%E7%9A%84%E4%B8%80%E4%BA%9Bapi%E9%9A%8F%E8%AE%B0&amp;diff=1652"/>
		<updated>2025-05-08T09:35:05Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Health===&lt;br /&gt;
 /_cat/health&lt;br /&gt;
&lt;br /&gt;
 /_cluster/health&lt;br /&gt;
&lt;br /&gt;
===Indices health===&lt;br /&gt;
按条件查看索引状态&lt;br /&gt;
 /_cat/indices?help&lt;br /&gt;
 /_cat/indices?health=red&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=yellow&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
&lt;br /&gt;
 /_cat/indices?health=green&amp;amp;v&amp;amp;s=store.size:desc,index&lt;br /&gt;
注意在配合 * 通配符搜索/操作索引的时候，如果涉及隐藏的datastream / 隐藏的index，默认不会匹配命中，必须指定 &amp;lt;code&amp;gt;expand_wildcards=all&amp;lt;/code&amp;gt; 参数&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; https://www.elastic.co/guide/en/elasticsearch/reference/7.16/multi-index.html#hidden&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
 /_cat/nodes?v&lt;br /&gt;
查看es各节点磁盘空间占用、分片数目等&lt;br /&gt;
 /_cat/allocation?v&lt;br /&gt;
&lt;br /&gt;
 /_cat/nodeattrs&lt;br /&gt;
&lt;br /&gt;
===Get master node===&lt;br /&gt;
 /_cat/master?v&lt;br /&gt;
&lt;br /&gt;
===Cluster allocation explain related===&lt;br /&gt;
可以用于定位分片状态以及分片为何故障&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
 /_cluster/allocation/explain&lt;br /&gt;
&lt;br /&gt;
===Shards===&lt;br /&gt;
粗略查看分片情况，特别是查看分片分布节点或大小/状态&lt;br /&gt;
 GET /_cat/shards&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_name&lt;br /&gt;
&lt;br /&gt;
 GET /_cat/shards?index=index_na*&lt;br /&gt;
查看分片分配失败原因&lt;br /&gt;
 /_cat/shards/index_name-*?v&amp;amp;s=state,index&amp;amp;h=index,shard,prirep,state,docs,store,ip,node,unassigned.reason&lt;br /&gt;
&lt;br /&gt;
==== Recovery API ====&lt;br /&gt;
Returns information about ongoing and completed shard recoveries, similar to the index recovery API.&lt;br /&gt;
&lt;br /&gt;
For data streams, the API returns information about the stream’s backing indices&lt;br /&gt;
&lt;br /&gt;
可以查看当前正在 relocating 的分片，也能查到各分片处理进度百分比&lt;br /&gt;
 GET /_cat/recovery?active_only=true&amp;amp;s=index&amp;amp;v&lt;br /&gt;
&lt;br /&gt;
=== Adds a data stream or index to an alias, and sets the write index or data stream for the alias ===&lt;br /&gt;
为别名设置可写索引或数据流&lt;br /&gt;
&lt;br /&gt;
If the alias doesn’t exist, the &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; action creates it.&lt;br /&gt;
 POST /_aliases &lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;actions&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
             &amp;quot;add&amp;quot;: {&lt;br /&gt;
                &amp;quot;index&amp;quot;: &amp;quot;es-k8s-logs-000020&amp;quot;,    &lt;br /&gt;
                &amp;quot;alias&amp;quot;: &amp;quot;es-k8s-logs-alias&amp;quot;,    &lt;br /&gt;
                &amp;quot;is_write_index&amp;quot;: true &lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Thread pool related===&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-thread-pool.html&lt;br /&gt;
 /_cluster/settings?pretty&amp;amp;include_defaults=true | grep processors&lt;br /&gt;
&lt;br /&gt;
====Get maximum number of threads info====&lt;br /&gt;
 curl &amp;quot;127.1:9200/_cat/thread_pool?v&amp;amp;h=ip,node_name,id,name,max,size,queue_size,queue,active,rejected&amp;amp;pretty&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Templates 模板 ===&lt;br /&gt;
 /_cat/templates?v&lt;br /&gt;
⚠️ /_template/${template_name} is legacy index templates, which are deprecated and will be replaced by the composable templates introduced in Elasticsearch 7.8.&lt;br /&gt;
&lt;br /&gt;
新版本中使用 &amp;lt;code&amp;gt;/_index_template&amp;lt;/code&amp;gt; 取代&lt;br /&gt;
 GET/PUT /_template/${template_name}&lt;br /&gt;
&lt;br /&gt;
==== Use template to change the replicas settings of all indexes (Legacy index template) ====&lt;br /&gt;
Multiple index templates can potentially match an index, in this case, both the settings and mappings are merged into the final configuration of the index. &lt;br /&gt;
&lt;br /&gt;
The order of the merging can be controlled using the &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; parameter, with lower order being applied first, '''and higher orders overriding them.''' &lt;br /&gt;
&lt;br /&gt;
legacy es template 中, 取值范围为 0 - 2^31-1 (0~2147483647)&lt;br /&gt;
 PUT /_template/${template_name}&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;order&amp;quot;: 2147483647,&lt;br /&gt;
     &amp;quot;index_patterns&amp;quot;: [&lt;br /&gt;
         &amp;quot;*&amp;quot;&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;settings&amp;quot;: {&lt;br /&gt;
         &amp;quot;index&amp;quot;: {&lt;br /&gt;
             &amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
[[使用jq批量修改es index template的lifecycle配置]]&lt;br /&gt;
&lt;br /&gt;
=== ILM (index lifecycle policy) 索引生命周期 ===&lt;br /&gt;
顾名思义，ilm另外也可用于做ES集群的冷热温架构。&lt;br /&gt;
&lt;br /&gt;
不同的阶段(phase)能做哪些事可以在这个 [https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-index-lifecycle.html Document] 查看&lt;br /&gt;
&lt;br /&gt;
比较难受的是，ilm目前没有类似 &amp;lt;code&amp;gt;_cat/templates&amp;lt;/code&amp;gt; 的接口一次性只查看这个集群已配置的 ILM 策略名字，只能一次性获取全部策略具体定义 (不过可以利用浏览器的F12 json preview折叠来曲线救国)&lt;br /&gt;
 GET /_ilm/policy&lt;br /&gt;
&lt;br /&gt;
==== Get specific ilm policy detail 获取特定ILM策略定义 ====&lt;br /&gt;
 GET /_ilm/policy/${ilm_name}&lt;br /&gt;
&lt;br /&gt;
 PUT /_ilm/policy/ilm-30d-delete&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;policy&amp;quot;: {&lt;br /&gt;
     &amp;quot;phases&amp;quot;: {&lt;br /&gt;
       &amp;quot;delete&amp;quot;: {&lt;br /&gt;
         &amp;quot;min_age&amp;quot;: &amp;quot;30d&amp;quot;,&lt;br /&gt;
         &amp;quot;actions&amp;quot;: {&lt;br /&gt;
           &amp;quot;delete&amp;quot;: {&lt;br /&gt;
             &amp;quot;delete_searchable_snapshot&amp;quot;: true&lt;br /&gt;
           }&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Get index's ilm status  获取索引当前 ILM 状态 ====&lt;br /&gt;
 GET /${index_name}/_ilm/explain&lt;br /&gt;
&lt;br /&gt;
 GET /${index_name}/_ilm/explain?human&lt;br /&gt;
&lt;br /&gt;
==== Move index's ilm to step  修改索引的ILM阶段状态(人为触发ILM action执行) ====&lt;br /&gt;
https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-move-to-step.html&lt;br /&gt;
 POST _ilm/move/my-index-000001&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;new&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;complete&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;complete&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;warm&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;forcemerge&amp;quot;, &lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;forcemerge&amp;quot; &lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Manually create an index that is managed by template and ILM (including rollover operations by day)  ====&lt;br /&gt;
&lt;br /&gt;
===== 手动创建原本应由template和ilm管控的索引，且索引名内包含日期(动态索引名) =====&lt;br /&gt;
⚠️ 这种索引不能直接粗暴地 &amp;lt;code&amp;gt;PUT /index-name-2022.10.23-000022&amp;lt;/code&amp;gt; 以创建索引，否则手动创建出来的索引，在rollover滚动 (例如rollover-max_age:1d)的时候，创建出来的新索引名字仍然是创建索引时定义的日期，而不是当天轮滚发生时的日期(如 &amp;lt;code&amp;gt;index-name-2022.10.23-000023&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
这个现象可以通过判断 &amp;lt;code&amp;gt;GET /index-name/_settings&amp;lt;/code&amp;gt; 中 &amp;lt;code&amp;gt;index.provided_name&amp;lt;/code&amp;gt; 属性看出来&lt;br /&gt;
&lt;br /&gt;
解法:&lt;br /&gt;
 PUT %3Cindex-name-%7Bnow%2Fd%7D-000099%3E&lt;br /&gt;
注意在kibana-Dev Tools中不要做URL Decode，他就是这样的需要编码一下(解码后就是: &amp;lt;code&amp;gt;&amp;lt;index-name-{now/d}-000099&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
ps: 如果怕创建错名字的话，可以使用 &amp;lt;code&amp;gt;GET %3Cindex-name-%7Bnow%2Fd%7D-000099%3E/_settings&amp;lt;/code&amp;gt; 预览一下生成的索引名效果&lt;br /&gt;
&lt;br /&gt;
对于索引最后的这个序号，[https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html#increment-index-names-for-alias 无论前一个索引的名称是什么，该编号始终为 6 个字符，且为零填充]。即使手动创建的索引结尾是&amp;lt;code&amp;gt;-00001&amp;lt;/code&amp;gt;，在rollover发生以后，索引后缀序号依然会变成&amp;lt;code&amp;gt;-000002&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 故障处理: 有的时候对现有的索引修改了其引用的 ilm policy 为别的 policy,或者修改了其引用的 ilm policy中的 phase 定义。会导致索引ilm故障 ====&lt;br /&gt;
有可能导致他的ilm处理会出问题（不记得怎么告警），没记错的话通过 &amp;lt;code&amp;gt;GET {index_name}/_ilm/explain&amp;lt;/code&amp;gt; 能看到 error 信息，能看到卡在某个 phase 失败&lt;br /&gt;
&lt;br /&gt;
这时候需要人为修改 index 的 ilm phase 修复，如&lt;br /&gt;
 POST _ilm/move/insight-es-k8s-logs-dce5-aliyun-default-prd-2024.01.16&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;current_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;hot&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;rollover&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;ERROR&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;next_step&amp;quot;: { &lt;br /&gt;
     &amp;quot;phase&amp;quot;: &amp;quot;cold&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
或者尝试通过 &amp;lt;code&amp;gt;POST {index_name}/_ilm/retry&amp;lt;/code&amp;gt; 接口重试 &lt;br /&gt;
&lt;br /&gt;
===Cluster setting related ES集群参数设置===&lt;br /&gt;
 /_cluster/settings?include_defaults=true&amp;amp;pretty&lt;br /&gt;
&lt;br /&gt;
 /_cluster/settings?include_defaults=true&lt;br /&gt;
&lt;br /&gt;
==== Wildcard expressions or all indices are not allowed ====&lt;br /&gt;
&lt;br /&gt;
===== 允许泛匹配删除索引 =====&lt;br /&gt;
 PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
     &amp;quot;action&amp;quot;: {&lt;br /&gt;
       &amp;quot;destructive_requires_name&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====primaries recovery settings ====&lt;br /&gt;
=====控制索引恢复或者relocating的并发数=====&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 10,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_outgoing_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 20&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;transient&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: null&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_initial_primaries_recoveries&amp;quot;: 30,&lt;br /&gt;
                     &amp;quot;node_concurrent_incoming_recoveries&amp;quot;: null,&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 10&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
cluster.routing.allocation.node_concurrent_recoveries: A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;.&lt;br /&gt;
 # PUT /_cluster/settings&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;persistent&amp;quot;: {&lt;br /&gt;
         &amp;quot;cluster&amp;quot;: {&lt;br /&gt;
             &amp;quot;routing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;allocation&amp;quot;: {&lt;br /&gt;
                     &amp;quot;node_concurrent_recoveries&amp;quot;: 8&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== recovery.max_bytes_per_sec [https://www.elastic.co/guide/en/elasticsearch/reference/7.17/recovery.html 修改relocating时并发传输数据量] ===&lt;br /&gt;
加大此数值可以有效缩短es relocating index的耗时&lt;br /&gt;
&lt;br /&gt;
indices.recovery.max_bytes_per_sec: Limits total inbound and outbound recovery traffic for each node. Applies to both peer recoveries as well as snapshot recoveries (i.e., restores from a snapshot). Defaults to &amp;lt;code&amp;gt;40mb&amp;lt;/code&amp;gt; unless the node is a dedicated cold or frozen node, in which case the default relates to the total memory available to the node.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Index settings===&lt;br /&gt;
&lt;br /&gt;
====modify the number of replicas in bulk====&lt;br /&gt;
&lt;br /&gt;
===== 批量/单个 设置索引副本数 =====&lt;br /&gt;
 PUT /index_name*/_settings&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;index&amp;quot;: {&lt;br /&gt;
     &amp;quot;number_of_replicas&amp;quot;: 1&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Search Documents ===&lt;br /&gt;
&lt;br /&gt;
==== match_all 搜索 ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match_all&amp;quot;: {}&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 单字段排序匹配搜索(match) ====&lt;br /&gt;
 GET /sw_segment-20230914/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;query&amp;quot;: {&lt;br /&gt;
     &amp;quot;match&amp;quot;: {&lt;br /&gt;
       &amp;quot;segment_id&amp;quot;: &amp;quot;b7bb26fae59e4f45b101346cb83ff796.69.16946808855979526&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;sort&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;start_time&amp;quot;: {&lt;br /&gt;
         &amp;quot;order&amp;quot;: &amp;quot;desc&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;size&amp;quot;: 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 对某个字段的值进行聚合(查询该字段有多少种类型的值) ====&lt;br /&gt;
 GET /.monitoring-es-7-2024.12.13/_search&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
   &amp;quot;aggs&amp;quot;: {&lt;br /&gt;
     &amp;quot;unique_types&amp;quot;: {&lt;br /&gt;
       &amp;quot;terms&amp;quot;: {&lt;br /&gt;
         &amp;quot;field&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
         &amp;quot;size&amp;quot;: 10&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Elastic Cloud on Kubernetes (ECK / Elastic operator) ===&lt;br /&gt;
ECK operator下管理的Elasticsearch如果要修改&amp;lt;code&amp;gt;cluster.routing.allocation.exclude&amp;lt;/code&amp;gt; 的参数配置，需要先为 elasticsearch 实例配置annotation: 'eck.k8s.elastic.co/managed=false'，不然会配置一会就会被刷回原状&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
&lt;br /&gt;
====对于有大量索引的刚重启的es集群====&lt;br /&gt;
(主分片在1w-2w)&lt;br /&gt;
&lt;br /&gt;
=====加快es集群恢复速度=====&lt;br /&gt;
结合es节点资源监控图，观测节点cpu压力，以及cpu IO wait&lt;br /&gt;
&lt;br /&gt;
适当通过update cluster settings接口动态增加node_initial_primaries_recoveries (Defaults to &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
和 node_concurrent_recoveries &lt;br /&gt;
&lt;br /&gt;
(A shortcut to set both &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_incoming_recoveries&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cluster.routing.allocation.node_concurrent_outgoing_recoveries&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Defaults to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;)数值&lt;br /&gt;
&lt;br /&gt;
通过使用 cluster settings + include_defaults=true 筛选查到当前配置值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从red状态到yellow状态的耗时：增加索引副本数量，增加node_initial_primaries_recoveries值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
减少集群从yellow状态到green状态的耗时：增加 node_concurrent_recoveries 值&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通过访问 &amp;lt;code&amp;gt;/_cluster/allocation/explain&amp;lt;/code&amp;gt; 接口查到阻碍集群 to green(yellow)的原因&lt;br /&gt;
&lt;br /&gt;
=====在es集群恢复期间因节点内存压力大(node was low on resources: memory.)而被k8s Evicted=====&lt;br /&gt;
调整缩小 jvm 配置值，尽量不超配(requests 和 limit尽量一致或提高requests值)&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
==== 集群分片数达到maximum错误 ====&lt;br /&gt;
集群分片数达到maximum错误会有如下log信息，但是集群的健康状态不会改变&lt;br /&gt;
 2022-11-10T10:26:03.643184618Z org.elasticsearch.common.ValidationException: Validation Failed: 1: this action would add [3] shards, but this cluster currently has [1999]/[2000] maximum normal shards open;&lt;br /&gt;
解决:&lt;br /&gt;
&lt;br /&gt;
调整index ilm 策略或者调整集群的max_shards_per_node配置&lt;br /&gt;
&lt;br /&gt;
临时生效配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;transient&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
永久更改性配置:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -H &amp;quot;content-type: application/json&amp;quot; -X PUT &amp;quot;127.0.0.1:9200/_cluster/settings&amp;quot; -d '{&amp;quot;persistent&amp;quot;: {&amp;quot;cluster.max_shards_per_node&amp;quot;: &amp;quot;5000&amp;quot;}}'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[分类:Elasticsearch]]&lt;br /&gt;
{{DEFAULTSORT:api随记}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E5%9C%A8%E4%BD%BF%E7%94%A8kubectl_apply%E6%93%8D%E4%BD%9Cworkload%E4%BA%A7%E7%94%9F%E7%9A%84%E9%9D%9E%E9%A2%84%E6%9C%9F%E8%A1%8C%E4%B8%BA&amp;diff=1651</id>
		<title>在使用kubectl apply操作workload产生的非预期行为</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E5%9C%A8%E4%BD%BF%E7%94%A8kubectl_apply%E6%93%8D%E4%BD%9Cworkload%E4%BA%A7%E7%94%9F%E7%9A%84%E9%9D%9E%E9%A2%84%E6%9C%9F%E8%A1%8C%E4%B8%BA&amp;diff=1651"/>
		<updated>2025-05-07T10:44:20Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== 简述 ===&lt;br /&gt;
&lt;br /&gt;
* kubectl apply 对于之前本身就是 apply 或者 create --save-config 产生的resources，可能存在非预期行为( kubectl.kubernetes.io/last-applied-configuration )，例如修改原有的workload probe settings(bug at 1.18.x), 或者修改hostAlias(修改原有的 hostalias 的 ip)&lt;br /&gt;
&lt;br /&gt;
=== hostalias复现: ===&lt;br /&gt;
先通过&amp;lt;code&amp;gt;kubectl create -f&amp;lt;/code&amp;gt; 创建一个普通的deployment(不要用 &amp;lt;code&amp;gt;kubectl apply -f&amp;lt;/code&amp;gt; 来创建，不然就绕过这个bug了~)&lt;br /&gt;
 apiVersion: apps/v1&lt;br /&gt;
 kind: Deployment&lt;br /&gt;
 metadata:&lt;br /&gt;
   labels:&lt;br /&gt;
     sit.k8s.io/app: yaml-test&lt;br /&gt;
   name: yaml-test&lt;br /&gt;
 spec:&lt;br /&gt;
   replicas:0&lt;br /&gt;
   selector:&lt;br /&gt;
     matchLabels:&lt;br /&gt;
       sit.k8s.io/app: yaml-test&lt;br /&gt;
   strategy:&lt;br /&gt;
     rollingUpdate:&lt;br /&gt;
       maxSurge: 25%&lt;br /&gt;
       maxUnavailable: 25%&lt;br /&gt;
     type: RollingUpdate&lt;br /&gt;
   template:&lt;br /&gt;
     metadata:&lt;br /&gt;
       labels:&lt;br /&gt;
         sit.k8s.io/app: yaml-test&lt;br /&gt;
       name: yaml-test&lt;br /&gt;
     spec:&lt;br /&gt;
       hostAliases:&lt;br /&gt;
       - hostnames:&lt;br /&gt;
         - testaaaa.com&lt;br /&gt;
         - testbbb.com&lt;br /&gt;
         ip: 1.1.1.7&lt;br /&gt;
       containers:&lt;br /&gt;
       - image: 192.168.150.181/test/nginx-2048:latest&lt;br /&gt;
         imagePullPolicy: IfNotPresent&lt;br /&gt;
         name: yaml-test&lt;br /&gt;
         readinessProbe:&lt;br /&gt;
             httpGet:&lt;br /&gt;
               path: /&lt;br /&gt;
               port: 80&lt;br /&gt;
               scheme: HTTP&lt;br /&gt;
             initialDelaySeconds: 10&lt;br /&gt;
             timeoutSeconds: 1&lt;br /&gt;
             periodSeconds: 10&lt;br /&gt;
             successThreshold: 1&lt;br /&gt;
             failureThreshold: 3&lt;br /&gt;
         resources:&lt;br /&gt;
           limits:&lt;br /&gt;
             cpu: &amp;quot;1&amp;quot;&lt;br /&gt;
             memory: &amp;quot;64Mi&amp;quot;&lt;br /&gt;
           requests:&lt;br /&gt;
             cpu: 64m&lt;br /&gt;
             memory: &amp;quot;64Mi&amp;quot;&lt;br /&gt;
       dnsPolicy: ClusterFirst&lt;br /&gt;
       restartPolicy: Always&lt;br /&gt;
&lt;br /&gt;
然后修改一下hostAliases的值(例如下面这样)，执行&amp;lt;code&amp;gt;kubectl apply -f  xxx.yaml --dry-run=server -oyaml&amp;lt;/code&amp;gt;&lt;br /&gt;
 apiVersion: apps/v1&lt;br /&gt;
 kind: Deployment&lt;br /&gt;
 metadata:&lt;br /&gt;
   labels:&lt;br /&gt;
     sit.k8s.io/app: yaml-test&lt;br /&gt;
   name: yaml-test&lt;br /&gt;
 spec:&lt;br /&gt;
   replicas: 0&lt;br /&gt;
   selector:&lt;br /&gt;
     matchLabels:&lt;br /&gt;
       sit.k8s.io/app: yaml-test&lt;br /&gt;
   strategy:&lt;br /&gt;
     rollingUpdate:&lt;br /&gt;
       maxSurge: 25%&lt;br /&gt;
       maxUnavailable: 25%&lt;br /&gt;
     type: RollingUpdate&lt;br /&gt;
   template:&lt;br /&gt;
     metadata:&lt;br /&gt;
       labels:&lt;br /&gt;
         sit.k8s.io/app: yaml-test&lt;br /&gt;
       name: yaml-test&lt;br /&gt;
     spec:&lt;br /&gt;
       hostAliases:&lt;br /&gt;
       - hostnames:&lt;br /&gt;
         - testaaaa.com&lt;br /&gt;
         - testbbb.com&lt;br /&gt;
         ip: 1.1.1.8&lt;br /&gt;
       containers:&lt;br /&gt;
       - image: 192.168.150.181/test/nginx-2048:latest&lt;br /&gt;
         imagePullPolicy: IfNotPresent&lt;br /&gt;
         name: yaml-test&lt;br /&gt;
         readinessProbe:&lt;br /&gt;
             httpGet:&lt;br /&gt;
               path: /&lt;br /&gt;
               port: 80&lt;br /&gt;
               scheme: HTTP&lt;br /&gt;
             initialDelaySeconds: 10&lt;br /&gt;
             timeoutSeconds: 1&lt;br /&gt;
             periodSeconds: 10&lt;br /&gt;
             successThreshold: 1&lt;br /&gt;
             failureThreshold: 3&lt;br /&gt;
         resources:&lt;br /&gt;
           limits:&lt;br /&gt;
             cpu: &amp;quot;1&amp;quot;&lt;br /&gt;
             memory: &amp;quot;64Mi&amp;quot;&lt;br /&gt;
           requests:&lt;br /&gt;
             cpu: 64m&lt;br /&gt;
             memory: &amp;quot;64Mi&amp;quot;&lt;br /&gt;
       dnsPolicy: ClusterFirst&lt;br /&gt;
       restartPolicy: Always&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
会发现apply以后的结果hostAliases字段非预期（1.1.1.8直接被追加了进去，而不是替换）&lt;br /&gt;
&lt;br /&gt;
[[文件:Kubectl apply merge.png|无框|400x400像素]]&lt;br /&gt;
&lt;br /&gt;
或者一开始使用apply创建资源，然后删除kubectl.kubernetes.io/last-applied-configuration: ，再修改ip，再apply&lt;br /&gt;
&lt;br /&gt;
如果一开始是用&amp;lt;code&amp;gt;kubectl apply -f xxxx&amp;lt;/code&amp;gt;创建资源，然后用&amp;lt;code&amp;gt;apply -f&amp;lt;/code&amp;gt;更新资源，则不会复现&lt;br /&gt;
&lt;br /&gt;
==== 这个也是跟k8s apply的实现方式有关系 ====&lt;br /&gt;
主要跟 kubectl.kubernetes.io/last-applied-configuration 这个annotation有关系&lt;br /&gt;
&lt;br /&gt;
[https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/#how-apply-calculates-differences-and-merges-changes How apply calculates differences and merges changes]&lt;br /&gt;
&lt;br /&gt;
[[文件:Kubectl apply patch strategy.png|无框|900x900像素]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Related article: [[K8s的一些小坑或者bug简要记录]]&lt;br /&gt;
&lt;br /&gt;
[[分类:K8s]]&lt;br /&gt;
{{DEFAULTSORT:apply}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E6%96%87%E4%BB%B6:Kubectl_apply_patch_strategy.png&amp;diff=1650</id>
		<title>文件:Kubectl apply patch strategy.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E6%96%87%E4%BB%B6:Kubectl_apply_patch_strategy.png&amp;diff=1650"/>
		<updated>2025-05-07T10:42:11Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kubectl_apply_patch_strategy&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=%E6%96%87%E4%BB%B6:Kubectl_apply_merge.png&amp;diff=1649</id>
		<title>文件:Kubectl apply merge.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=%E6%96%87%E4%BB%B6:Kubectl_apply_merge.png&amp;diff=1649"/>
		<updated>2025-05-07T10:39:49Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kubectl_apply_merge&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Keycloak%E8%AE%BE%E7%BD%AEhttp%E4%BB%A3%E7%90%86proxy&amp;diff=1648</id>
		<title>Keycloak设置http代理proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Keycloak%E8%AE%BE%E7%BD%AEhttp%E4%BB%A3%E7%90%86proxy&amp;diff=1648"/>
		<updated>2025-04-29T09:56:49Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== keycloak 开启log debug: ===&lt;br /&gt;
环境变量 KC_LOG_LEVEL    debug&lt;br /&gt;
&lt;br /&gt;
如果不生效，还可以考虑  ROOT_LOGLEVEL debug&lt;br /&gt;
&lt;br /&gt;
=== 为keycloak发起的访问请求设置http代理(Proxy settings for keycloak outgoing requests) ===&lt;br /&gt;
&lt;br /&gt;
==== Official document ====&lt;br /&gt;
https://www.keycloak.org/docs/latest/server_installation/#_proxymappings&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Related configuration file path ====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;There are some things you’ll need to configure in &amp;lt;code&amp;gt;standalone.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;standalone-ha.xml&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;domain.xml&amp;lt;/code&amp;gt;. The location of this file depends on your operating mode.&amp;lt;/blockquote&amp;gt;/opt/jboss/keycloak/standalone/configuration/****&lt;br /&gt;
&lt;br /&gt;
eg: /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;spi name=&amp;quot;connectionsHttpClient&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;provider name=&amp;quot;default&amp;quot; enabled=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;properties&amp;gt;&lt;br /&gt;
            &amp;lt;property name=&amp;quot;proxy-mappings&amp;quot; value=&amp;quot;[&amp;amp;amp;quot;.*\\.(microsoft|microsoftonline)\\.com;&amp;lt;nowiki&amp;gt;http://your-proxy-address.net:8080&amp;lt;/nowiki&amp;gt;&amp;amp;amp;quot;]&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/properties&amp;gt;&lt;br /&gt;
     &amp;lt;/provider&amp;gt;&lt;br /&gt;
 &amp;lt;/spi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ps====&lt;br /&gt;
需要注意的是 &amp;amp;amp;quot; 是 &amp;quot; 的实体字符&lt;br /&gt;
 Note that one needs to encode &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; characters with &amp;lt;code&amp;gt;&amp;amp;amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
 [[分类:Softwares]]&lt;br /&gt;
 &lt;br /&gt;
 [[分类:Other]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1647</id>
		<title>Elasticsearch7系列下同索引主分片分布不均衡思考</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1647"/>
		<updated>2025-04-28T16:23:05Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;es版本: 7.17.5&lt;br /&gt;
&lt;br /&gt;
现象:&lt;br /&gt;
 &amp;gt; GET /_cat/shards/sw_segment-20250429?v&amp;amp;s=shard,prirep &amp;gt; es-shard-status-sw_segment-20250428&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-0|wc -l&lt;br /&gt;
 26&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-1|wc -l&lt;br /&gt;
 27&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-2|wc -l&lt;br /&gt;
 72&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-3|wc -l&lt;br /&gt;
 29&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-4|wc -l&lt;br /&gt;
 26&lt;br /&gt;
可以看到 sw_segment-20250428 这个索引在不同节点上，主分片分布非常不均衡，如果这个索引写入量/数据量很大的话，很容易导致 IO 相对其他实例有很大的差异&lt;br /&gt;
&lt;br /&gt;
但是经过查询后发现，在整个集群所有分片中，主分片在所有es 实例中分布较为均衡&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
而es7系列原生自带的 balance 行为不支持针对同 index 的 primary shard 进行干预 (8.12 有 &amp;lt;code&amp;gt;cluster.routing.allocation.balance.write_load&amp;lt;/code&amp;gt; 的权重配置)&lt;br /&gt;
&lt;br /&gt;
这时候可以利用index &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;选项来进行较为'''十分不灵活不优雅&amp;lt;u&amp;gt;不可靠&amp;lt;/u&amp;gt;'''的干预，先将索引副本数设置为0，然后在索引初始化前设置该配置，以强制约束每一个es实例分布一样数量的分片数量。等到全部主分片都调度初始化好了，再根据需要把副本数调整回来，把 &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt; 也根据&amp;lt;code&amp;gt;(该索引的分片数 * 副本数)&amp;lt;/code&amp;gt;进行合适的调整。&lt;br /&gt;
&lt;br /&gt;
也可以为了长期打算，将&amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;数量配置为 &amp;lt;code&amp;gt;(该索引的分片数 * 副本数) / (集群中可调度该索引分片的es实例数 - 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当然，也可以像社区issue中提到那样，用现成的工具 / 开发工具，利用&amp;lt;code&amp;gt;reroute&amp;lt;/code&amp;gt;等api接口进行实时干预，并将相关shard进行统计监控&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
相关社区issue: https://github.com/elastic/elasticsearch/issues/41543&lt;br /&gt;
[[分类:Elasticsearch]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1646</id>
		<title>Elasticsearch7系列下同索引主分片分布不均衡思考</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1646"/>
		<updated>2025-04-28T16:22:49Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;es版本: 7.17.5&lt;br /&gt;
&lt;br /&gt;
现象:&lt;br /&gt;
 &amp;gt; GET /_cat/shards/sw_segment-20250429?v&amp;amp;s=shard,prirep &amp;gt; es-shard-status-sw_segment-20250428&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | greep es-data-ssd-0|wc -l&lt;br /&gt;
 26&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-1|wc -l&lt;br /&gt;
 27&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-2|wc -l&lt;br /&gt;
 72&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-3|wc -l&lt;br /&gt;
 29&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-4|wc -l&lt;br /&gt;
 26&lt;br /&gt;
可以看到 sw_segment-20250428 这个索引在不同节点上，主分片分布非常不均衡，如果这个索引写入量/数据量很大的话，很容易导致 IO 相对其他实例有很大的差异&lt;br /&gt;
&lt;br /&gt;
但是经过查询后发现，在整个集群所有分片中，主分片在所有es 实例中分布较为均衡&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
而es7系列原生自带的 balance 行为不支持针对同 index 的 primary shard 进行干预 (8.12 有 &amp;lt;code&amp;gt;cluster.routing.allocation.balance.write_load&amp;lt;/code&amp;gt; 的权重配置)&lt;br /&gt;
&lt;br /&gt;
这时候可以利用index &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;选项来进行较为'''十分不灵活不优雅&amp;lt;u&amp;gt;不可靠&amp;lt;/u&amp;gt;'''的干预，先将索引副本数设置为0，然后在索引初始化前设置该配置，以强制约束每一个es实例分布一样数量的分片数量。等到全部主分片都调度初始化好了，再根据需要把副本数调整回来，把 &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt; 也根据&amp;lt;code&amp;gt;(该索引的分片数 * 副本数)&amp;lt;/code&amp;gt;进行合适的调整。&lt;br /&gt;
&lt;br /&gt;
也可以为了长期打算，将&amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;数量配置为 &amp;lt;code&amp;gt;(该索引的分片数 * 副本数) / (集群中可调度该索引分片的es实例数 - 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当然，也可以像社区issue中提到那样，用现成的工具 / 开发工具，利用&amp;lt;code&amp;gt;reroute&amp;lt;/code&amp;gt;等api接口进行实时干预，并将相关shard进行统计监控&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
相关社区issue: https://github.com/elastic/elasticsearch/issues/41543&lt;br /&gt;
[[分类:Elasticsearch]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1645</id>
		<title>Elasticsearch7系列下同索引主分片分布不均衡思考</title>
		<link rel="alternate" type="text/html" href="https://wiki.sanxian.tech/index.php?title=Elasticsearch7%E7%B3%BB%E5%88%97%E4%B8%8B%E5%90%8C%E7%B4%A2%E5%BC%95%E4%B8%BB%E5%88%86%E7%89%87%E5%88%86%E5%B8%83%E4%B8%8D%E5%9D%87%E8%A1%A1%E6%80%9D%E8%80%83&amp;diff=1645"/>
		<updated>2025-04-28T16:22:37Z</updated>

		<summary type="html">&lt;p&gt;Admin：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;es版本: 7.17.5&lt;br /&gt;
&lt;br /&gt;
现象:&lt;br /&gt;
 &amp;gt; GET /_cat/shards/sw_segment-20250429?v&amp;amp;s=shard,prirep &amp;gt; es-shard-status-sw_segment-20250428&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | greep es-data-ssd-0|wc -l&lt;br /&gt;
 26&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-1|wc -l&lt;br /&gt;
 27&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; | grep es-data-ssd-2|wc -l&lt;br /&gt;
 72&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; |grep es-data-ssd-3|wc -l&lt;br /&gt;
 29&lt;br /&gt;
 &lt;br /&gt;
 &amp;gt; cat es-shard-status-sw_segment-20250428 | grep &amp;quot; p &amp;quot; |grep es-data-ssd-4|wc -l&lt;br /&gt;
 26&lt;br /&gt;
可以看到 sw_segment-20250428 这个索引在不同节点上，主分片分布非常不均衡，如果这个索引写入量/数据量很大的话，很容易导致 IO 相对其他实例有很大的差异&lt;br /&gt;
&lt;br /&gt;
但是经过查询后发现，在整个集群所有分片中，主分片在所有es 实例中分布较为均衡&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
而es7系列原生自带的 balance 行为不支持针对同 index 的 primary shard 进行干预 (8.12 有 &amp;lt;code&amp;gt;cluster.routing.allocation.balance.write_load&amp;lt;/code&amp;gt; 的权重配置)&lt;br /&gt;
&lt;br /&gt;
这时候可以利用index &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;选项来进行较为'''十分不灵活不优雅&amp;lt;u&amp;gt;不可靠&amp;lt;/u&amp;gt;'''的干预，先将索引副本数设置为0，然后在索引初始化前设置该配置，以强制约束每一个es实例分布一样数量的分片数量。等到全部主分片都调度初始化好了，再根据需要把副本数调整回来，把 &amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt; 也根据&amp;lt;code&amp;gt;(该索引的分片数 * 副本数)&amp;lt;/code&amp;gt;进行合适的调整。&lt;br /&gt;
&lt;br /&gt;
也可以为了长期打算，将&amp;lt;code&amp;gt;total_shards_per_node&amp;lt;/code&amp;gt;数量配置为 &amp;lt;code&amp;gt;(该索引的分片数 * 副本数) / (集群中可调度该索引分片的es实例数 - 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当然，也可以像社区issue中提到那样，用现成的工具 / 开发工具，利用&amp;lt;code&amp;gt;reroute&amp;lt;/code&amp;gt;等api接口进行实时干预，并将相关shard进行统计监控&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
相关社区issue: https://github.com/elastic/elasticsearch/issues/41543&lt;br /&gt;
[[分类:Elasticsearch]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>