<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[linuxの飘扬]]></title> 
<link>https://www.linuxfly.org/index.php</link> 
<description><![CDATA[Power by www.linuxfly.org]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[linuxの飘扬]]></copyright>
<item>
<link>https://www.linuxfly.org/post/733/</link>
<title><![CDATA[修改 k3s 证书有效期时间]]></title> 
<author>linuxing &lt;emos#linuxfly.org&gt;</author>
<category><![CDATA[Kubernetes]]></category>
<pubDate>Wed, 17 Jan 2024 10:38:16 +0000</pubDate> 
<guid>https://www.linuxfly.org/post/733/</guid> 
<description>
<![CDATA[ 
	好久没有更新了，遇到个问题，简单记录一下吧。<br/><br/>创建 k3s 时，默认 CA 证书有效期 10 年，Client 证书 1 年。在 Client 证书到期前，可以通过重启 k3s 服务来自动延期（不影响运行中 Pod）。但如果是 CA 证书到期，那就麻烦多了，官方的<a href="https://docs.k3s.io/zh/cli/certificate#%E8%BD%AE%E6%8D%A2%E8%87%AA%E5%AE%9A%E4%B9%89-ca-%E8%AF%81%E4%B9%A6" target="_blank">轮换证书</a>的方式相当的复杂。<br/><br/>所以，网上才有了通过自定义 100 年时效的 CA 证书，以及修改系统时间，生成更长 Client 证书的方式。<br/><br/>参考：<br/><a href="https://www.cnblogs.com/KSPT/p/16688400.html" target="_blank">K3s生成100年CA证书 </a><br/><a href="https://www.cnblogs.com/KSPT/p/16688336.html" target="_blank">K3s生成100年非CA证书</a><br/><br/>这方式不用修改 k3s 源码，可以通过脚本来处理，但调整系统时间可能会引发其他的问题，而且步骤也比较多。<br/><br/>既然证书是 k3s 生成的，那么应该从 k3s 代码中会有这部分的处理逻辑。经过分析，其实 k3s 是引用 <a href="https://github.com/rancher/dynamiclistener" target="_blank">dynamiclistener</a> 这个库来生成证书的。<br/><br/>查看 dynamiclistener 的说明，其原来就有提供一个 CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS 来控制生成 Client 证书的有效期时间。但 k3s 的 install.sh 脚本中没有引用（首次启动 k3s 服务时）。<br/><br/>沿用类似的方法，对 dynamiclistener 做了简单的修改，增加一个环境变量 CATTLE_NEW_SIGNED_CA_EXPIRATION_YEARS ，可以定义 CA 证书的有效期，单位是年，默认 100 年。<br/>具体 commit 见<a href="https://github.com/qkboy/dynamiclistener/commit/587be474c1897c64fd28339aa91ca19f978b33bc" target="_blank">这里</a>，tag 对应 v0.3.6-ske.3 。<br/><br/>然后，可以修改 k3s 项目的 go.mod ，替换为修改过的 dynamiclistener。<br/><div class="code"><br/>replace github.com/rancher/dynamiclistener =&gt; github.com/qkboy/dynamiclistener v0.3.6-ske.3<br/>require github.com/rancher/dynamiclistener v0.0.0-00010101000000-000000000000<br/></div><br/><br/>保存后，手动运行一下 go mod tidy 生成新的 go.sum ，重新编译 k3s 即可。<br/><div class="code"># SKIP_VALIDATE=true make</div><br/><br/>从源码编译 k3s 也没什么复杂的，只要当前环境装了 docker ，可以科学上网，直接运行就能搞掂。<br/><br/>最后一步，改改 instal.sh ，让在首次启动 k3s 时可以读到新增的两个环境变量：<br/><div class="code"># --- capture current env and create file containing k3s_ variables ---<br/>create_env_file() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;info &quot;env: Creating environment file $&#123;FILE_K3S_ENV&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$SUDO touch $&#123;FILE_K3S_ENV&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$SUDO chmod 0600 $&#123;FILE_K3S_ENV&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sh -c export &#124; while read x v; do echo $v; done &#124; grep -E &#039;^(K3S&#124;CONTAINERD)_&#039; &#124; $SUDO tee $&#123;FILE_K3S_ENV&#125; &gt;/dev/null<br/>&nbsp;&nbsp;&nbsp;&nbsp;sh -c export &#124; while read x v; do echo $v; done &#124; grep -Ei &#039;^(NO&#124;HTTP&#124;HTTPS)_PROXY&#039; &#124; $SUDO tee -a $&#123;FILE_K3S_ENV&#125; &gt;/dev/null<br/>&nbsp;&nbsp;&nbsp;&nbsp;sh -c export &#124; while read x v; do echo $v; done &#124; grep -E &#039;^(CATTLE_NEW_SIGNED_CA_EXPIRATION_YEARS&#124;CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS)&#039; &#124; $SUDO tee -a $&#123;FILE_K3S_ENV&#125; &gt;/dev/null<br/>&#125;</div><br/><br/>用修改后的 install.sh 运行安装 k3s：<br/><div class="code"># INSTALL_K3S_SKIP_DOWNLOAD=true CATTLE_NEW_SIGNED_CERT_EXPIRATION_DAYS=3650 CATTLE_NEW_SIGNED_CA_EXPIRATION_YEARS=50 ./install.sh</div><br/><br/>结果：<br/><div class="code">root@env2-node01:~# for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done<br/>/var/lib/rancher/k3s/server/tls/client-admin.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT &lt;-- 客户端 10年<br/>/var/lib/rancher/k3s/server/tls/client-ca.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT &lt;-- 根 CA 50 年<br/>/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/client-controller.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-k3s-cloud-controller.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-k3s-controller.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-kube-proxy.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-scheduler.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/client-supervisor.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/request-header-ca.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/server-ca.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>root@env2-node01:~# for i in `ls /var/lib/rancher/k3s/server/tls/etcd/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done<br/>/var/lib/rancher/k3s/server/tls/etcd/client.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT<br/>/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt<br/>notAfter=Jan&nbsp;&nbsp;3 07:46:06 2074 GMT<br/>/var/lib/rancher/k3s/server/tls/etcd/server-client.crt<br/>notAfter=Jan 13 07:46:06 2034 GMT</div><br/><br/>结束语，如果你觉得上面修改比较复杂。可以使用我修改过的两个 k3s 版本：<br/><a href="https://github.com/qkboy/k3s/tree/v1.24.17%2Bk3s1-longcert" target="_blank">v1.24.17+k3s1 </a><br/><a href="https://github.com/qkboy/k3s/tree/v1.29.0%2Bk3s1-longcert" target="_blank">v1.29.0+k3s1</a><br/><br/>下载对应的分支后，直接编译即可。<br/>相关的修改已经提了 PR（<a href="https://github.com/rancher/dynamiclistener/pull/91" target="_blank">#90</a>），等待回复。<br/>有空我再把编译好的二进制文件放上来吧。<br/>Tags - <a href="https://www.linuxfly.org/tags/k3s/" rel="tag">k3s</a> , <a href="https://www.linuxfly.org/tags/certificate/" rel="tag">certificate</a>
]]>
</description>
</item><item>
<link>https://www.linuxfly.org/kubernetes-19-conflict-with-centos7/</link>
<title><![CDATA[【原】kubernetes 1.9 与 CentOS 7.3 内核兼容问题]]></title> 
<author>linuxing &lt;emos#linuxfly.org&gt;</author>
<category><![CDATA[Kubernetes]]></category>
<pubDate>Fri, 30 Mar 2018 12:39:02 +0000</pubDate> 
<guid>https://www.linuxfly.org/kubernetes-19-conflict-with-centos7/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;生产环境发现不定时 Java 应用出现 coredump 故障，测试环境不定时出现写入 /cgroup/memory 报&nbsp;&nbsp;no space left on device 的故障，导致整个 kubernetes node 节点无法使用。设置会随着堆积的 cgroup 越来越多，docker ps 执行异常，直到把内存吃光，机器挂死。<br/>&nbsp;&nbsp;&nbsp;&nbsp;典型报错：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">kubelet.ns-k8s-node001.root.log.ERROR.20180214-113740.15702:1593018:E0320 04:59:09.572336 15702 remote_runtime.go:92] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed to start sa<br/>ndbox container for pod "osp-xxx-com-ljqm19-54bf7678b8-bvz9s": Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258: applying cgroup configuration<br/>for process caused &#92;"mkdir /sys/fs/cgroup/memory/kubepods/burstable/podf1bd9e87-1ef2-11e8-afd3-fa163ecf2dce/8710c146b3c8b52f5da62e222273703b1e3d54a6a6270a0ea7ce1b194f1b5053: <span style="color: #FF0000;">no space left on device</span>&#92;""</div></div><br/>或者<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Mar 26 18:36:59 ns-k8s-node-s0054 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0x8020)<br/>Mar 26 18:36:59 ns-k8s-noah-node001 kernel: cache: ip6_dst_cache(1995:6b6bc0c9f30123084a409d89a300b017d26ee5e2c3ac8a02c295c378f3dbfa5f), object size: 448, buffer size: 448, default order: 2, min order: 0</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;该问题发生前后，进行过 kubernetes 1.6 到 1.9 的升级工作。怀疑问题与 kubernetes 、内核有关。<br/>............<br/><br/>Tags - <a href="https://www.linuxfly.org/tags/kubernetes/" rel="tag">kubernetes</a> , <a href="https://www.linuxfly.org/tags/docker/" rel="tag">docker</a>
]]>
</description>
</item>
</channel>
</rss>