<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>云原生 on lidongqi</title>
    <link>https://lidongqi.github.io/categories/%E4%BA%91%E5%8E%9F%E7%94%9F/</link>
    <description>Recent content in 云原生 on lidongqi</description>
    <generator>Hugo -- 0.137.0</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 13 Nov 2024 16:33:24 +0800</lastBuildDate>
    <atom:link href="https://lidongqi.github.io/categories/%E4%BA%91%E5%8E%9F%E7%94%9F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>实现一个operator（1）</title>
      <link>https://lidongqi.github.io/posts/nginx-operator_1/</link>
      <pubDate>Wed, 13 Nov 2024 16:33:24 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/nginx-operator_1/</guid>
      <description>&lt;h1 id=&#34;写在前面&#34;&gt;写在前面&lt;/h1&gt;
&lt;p&gt;kubebuilder 是一个集成工具，为了更好的理解k8s工作流程。这里使用k8s tools实现一个operator。&lt;/p&gt;
&lt;h1 id=&#34;创建crd&#34;&gt;创建CRD&lt;/h1&gt;
&lt;h2 id=&#34;custom-resource&#34;&gt;Custom Resource&lt;/h2&gt;
&lt;p&gt;以Resource的角度来审视k8s，可以发现k8s实际上做的事情是对Resource的CRUD操作。&lt;/p&gt;
&lt;p&gt;Custom Resource是一种用户定义的k8s resource数据，可以通过k8s api对定义的Resource进行CRUD操作。&lt;/p&gt;
&lt;p&gt;对于resource本身而言，只是存储结构化的数据，如果期望资源数据改变时集群中状态发生对应变化，就需要有一个Controller来对数据变化感知，然后修改集群内的状态。&lt;/p&gt;
&lt;h2 id=&#34;custom-controller&#34;&gt;Custom Controller&lt;/h2&gt;
&lt;p&gt;custom controller就是用户定义的controller。完成对customer resource内容变更的对应操作。&lt;/p&gt;
&lt;p&gt;将Custom Resource 和Custom Controller结合起来，就是operator模式。&lt;/p&gt;
&lt;h2 id=&#34;聚合api和独立api&#34;&gt;聚合API和独立API&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#should-i-add-a-cr-to-my-k8s-cluster&#34;&gt;官方文档&lt;/a&gt;很详细，引用一下&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;考虑 API 聚合的情况&lt;/td&gt;
          &lt;td&gt;优选独立 API 的情况&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你的 API 是&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis&#34;&gt;声明式的&lt;/a&gt;&lt;br&gt;&lt;br&gt;。&lt;/td&gt;
          &lt;td&gt;你的 API 不符合&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#declarative-apis&#34;&gt;声明式&lt;/a&gt;&lt;br&gt;&lt;br&gt;模型。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望可以是使用 kubectl 来读写你的新资源类别。&lt;/td&gt;
          &lt;td&gt;不要求 kubectl 支持。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望在 Kubernetes UI （如仪表板）中和其他内置类别一起查看你的新资源类别。&lt;/td&gt;
          &lt;td&gt;不需要 Kubernetes UI 支持。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你在开发新的 API。&lt;/td&gt;
          &lt;td&gt;你已经有一个提供 API 服务的程序并且工作良好。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你有意愿取接受 Kubernetes 对 REST 资源路径所作的格式限制，例如 API 组和名字空间。（参阅 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/overview/kubernetes-api/&#34;&gt;API 概述&lt;/a&gt;&lt;br&gt;&lt;br&gt;）&lt;/td&gt;
          &lt;td&gt;你需要使用一些特殊的 REST 路径以便与已经定义的 REST API 保持兼容。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你的资源可以自然地界定为集群作用域或集群中某个名字空间作用域。&lt;/td&gt;
          &lt;td&gt;集群作用域或名字空间作用域这种二分法很不合适；你需要对资源路径的细节进行控制。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;你希望复用 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#common-features&#34;&gt;Kubernetes API 支持特性&lt;/a&gt;&lt;br&gt;&lt;br&gt;。&lt;/td&gt;
          &lt;td&gt;你不需要这类特性。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单解释就是CRD方式可以使用k8s已有api，当k8s已有api不满足条件时，才使用聚合层api来扩展。&lt;/p&gt;</description>
    </item>
    <item>
      <title>容器加密</title>
      <link>https://lidongqi.github.io/posts/%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/</link>
      <pubDate>Wed, 06 Nov 2024 15:11:16 +0800</pubDate>
      <guid>https://lidongqi.github.io/posts/%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/</guid>
      <description>&lt;h2 id=&#34;oci&#34;&gt;OCI&lt;/h2&gt;
&lt;p&gt;容器运行时标准，&lt;a href=&#34;https://github.com/opencontainers&#34;&gt;Open Container Initiative&lt;/a&gt;
containerd,cri-o,docker,rkt都是OCI的实现。
所以对镜像加密实际上是需要对OCI镜像进行处理。
# containerd
containerd 支持对image的加解密具体说明参考&lt;a href=&#34;https://github.com/containerd/containerd/blob/main/docs/cri/decryption.md&#34;&gt;containerd文档&lt;/a&gt;。
加密的镜像是包含加密blob(二进制对象)的OCI格式的镜像。
# 加密
## imgcrypt
### install
需要提前准备好golang环境&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/containerd/imgcrypt.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; imgcrypt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;encrypt&#34;&gt;encrypt&lt;/h3&gt;
&lt;p&gt;创建RSA key&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl genrsa -out mykey.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl rsa -in mykey.pem -pubout -out mypubkey.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建加密镜像&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 这里使用已经安装好的containerd服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod &lt;span class=&#34;m&#34;&gt;0666&lt;/span&gt; /run/containerd/containerd.sock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CTR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/local/bin/ctr-enc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images pull --all-platforms docker.io/library/bash:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看镜像层数&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images layerinfo --platform linux/amd64 docker.io/library/bash:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
&lt;img
src=&#34;../%E5%AE%B9%E5%99%A8%E5%8A%A0%E5%AF%86/dc6ba61292a2cf9ce405af7c985d08d628db30e4.png&#34;
title=&#34;wikilink&#34; alt=&#34;Pastedimage20241106181333.png&#34; /&gt;
&lt;figcaption
aria-hidden=&#34;true&#34;&gt;Pastedimage20241106181333.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;加密&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$CTR&lt;/span&gt; images encrypt --recipient jwe:mypubkey.pem --platform linux/amd64 docker.io/library/bash:latest bash.enc:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看镜像层数&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
