🐈

kubanetesで簡単なCRDを作成してみる

2023/04/22に公開

Kubernetes(K8s)とは

Kubernetes(K8s)のCustomResourceDefinition(CRD)は、Kubernetes APIに新しいカスタムリソースを追加するための仕組みです。Kubernetesには、Pod、Service、Deployment、ConfigMap、Secretなど、さまざまなリソースが用意されていますが、特定のユースケースに合わせて、独自のリソースを定義することができます。

Kubernetesのオブジェクトの操作には、Kubernetes APIを介してRESTfulなHTTPリクエストを使用するため、CRDを定義することで、独自のオブジェクトを作成、更新、削除することができます。例えば、特定のアプリケーションに必要な特別な設定やリソースを定義し、Kubernetesで管理できます。

CRDを使用すると、Kubernetesのプラットフォーム機能を拡張することができます。例えば、KubernetesでCI/CDパイプラインを実行する場合、KubernetesのDeploymentやServiceリソースを使用して、アプリケーションをデプロイすることができます。しかし、特定のアプリケーションに必要なリソースがある場合は、CRDを使用してカスタムリソースを作成することができます。

CRDを作成するには、CRDの仕様をYAMLファイルに定義し、kubectl applyコマンドを使用してKubernetesクラスターに適用する必要があります。そして、カスタムリソースを使用するために、クライアントアプリケーションはKubernetes APIにアクセスする必要があります。

簡単なCRD作成してみる

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: foos.example.com # <names.plural>.<group>
spec:
  group: example.com
  names:
    kind: Foo
    plural: foos
  scope: Namespaced # `Cluster` and `Namespaced`
  versions:
    - name: v1alpha1
      served: true # trueにするとkubectlでの操作が可能になる
      storage: true # ここをtrueにするとetcdに情報が保存される。基本は一つのバージョンでtrueにする
      additionalPrinterColumns: # kubectl get fooをした時にデフォルトだと表示されるものがNameのみだが追加で表示したいものがある時などはここで定義していく
        - name: Test String
          jsonPath: .testString
          type: string
        - name: Test Num
          jsonPath: .testNum
          type: integer
      schema:
        openAPIV3Schema:
          type: object
          properties: # マニュフェストファイルに指定しないといけないものをかく
            testString:
              type: string
            testNum:
              type: integer

上記のCRDを実行するためのマニフェストファイル

apiVersion: example.com/v1alpha1
kind: Foo
metadata:
  name: test
testString: "first foo"
testNum: 1

Discussion