kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Kubeval で kustomization.yaml を対象外にする

Kubeval で Kubernetes マニフェストを検査する場合に kustomize を使っていると,以下のように kustomization.yaml でエラーになってしまう.kustomization.yaml には kind フィールドがなく,Kubeval の対象外にしたい!

$ kubeval --version
Version: 0.16.1
Commit: f5dba6b486fa18b9179b91e15eb6f2b0f7a5a69e
Date: 2021-03-30T15:17:06Z

$ kubeval --directories .
ERR  - base/kustomization.yaml: Missing 'kind' key
ERR  - overlays/dev/kustomization.yaml: Missing 'kind' key

kustomization.yaml を対象外にする

Kubeval には指定したファイルを対象外にする --ignored-filename-patterns オプションがあり,以下のように指定できる.解決!

$ kubeval --directories . --ignored-filename-patterns 'kustomization.yaml'

なお kustomization.yaml に関連する issue も出ている.他にも類似したオプションとして --ignore-missing-schemas--skip-kinds もあるけど使えないため,やはり --ignored-filename-patterns オプションを使うのが現状は良さそう👌

github.com

GitHub Actions 対応

しかし GitHub Actions で Kubeval を使おうとするとまた違う問題に遭遇する.公開されている Actions--ignored-filename-patterns オプションをサポートしていない.プルリクエストは出ているけど,1年以上放置されているように見える.よって使えなかった😇

github.com

となると,Kubeval Docker イメージを直接指定して使うことになる.公開されている garethr/kubeval Docker イメージ(GitHub リポジトリは garethr/kubeval から instrumenta/kubeval にリダイレクトされる)を使って,以下のように workflow.yml を設定すれば,期待した通りに使えるようになった.解決!

name: Workflow
on: push
jobs:
  kubeval:
    name: kubeval
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: kubeval
      uses: docker://garethr/kubeval
      with:
        args: '--directories . --ignored-filename-patterns "kustomization.yaml|workflow.yml"'

まとめ

Kubevalkustomization.yaml を対象外にできるようになった!引き続き issue は確認しよう👀

macOS のディスプレイ設定でメニューバー(通知欄)の位置を変えることができる

リモートワークに移行してから,以下のように大きく「2拠点(部屋)」で日々仕事をしている.それぞれの部屋で微妙に機材も違っていて,今回は Mac (macOS) のディスプレイ設定 Tips を紹介する.

  • 通常業務 🏢 自宅
    • 正面ディスプレイ : LG 27UL850-W 🖥
    • 左側ディスプレイ : MacBook Pro 13 inch
  • リモート研修配信環境 🏠 実家の空いている部屋
    • 正面ディスプレイ : MacBook Pro 13 inch
    • 左側ディスプレイ : Uperfect 4K 🖥

Mac (macOS) で通知欄の位置を変える

デフォルトだと MacBook Pro 側に「通知」が表示される.上記の通り,部屋によって MacBook Pro の位置が「正面ディスプレイ」だったり「左側ディスプレイ」だったりするため,特に通知が「左側ディスプレイ」に表示されると気付きにくいという課題があった.なお,以下はサンプルとして AppleScript で通知を表示している.

f:id:kakku22:20211012193134p:plain

$ osascript -e 'display notification "@kakakakakku" with title "hello!"'

そこで「メニューバー(通知欄)」の位置を変える.以下のように Mac (macOS) のディスプレイ設定で「白枠 = メニューバー(通知欄)」をドラッグして位置を変えることができる💡実はつい最近まで知らなかった😇

f:id:kakku22:20211012155532p:plain

まとめ

知っておくと便利な Mac (macOS) のディスプレイ設定 Tips を紹介した!もしかしたら知らなかったのは僕だけかもしれない!

kubectl や kube-apiserver など Kubernetes バイナリを checksum で検証する

以下のドキュメントを読んでいたら kubectl コマンド(バイナリファイル)をダウンロードした後に checksum を使って検証(改ざんなし)をする手順が載っていた.kubectl に限定する必要はなく kube-apiserver などにも適用できる.さっそく試していく!

kubernetes.io

ちなみに Certified Kubernetes Security Specialist (CKS) の出題範囲には「Verify platform binaries before deploying」と書いてあり,内容としては関連していると思う.

github.com

checksum を取得する

checksum (SHA-256) は公開されているため curl コマンドを使って取得できる.例えば kubectlkube-apiserver を例にすると以下のようになる.最新バージョン(今日時点では v1.22.2)は https://dl.k8s.io/release/stable.txt で確認できるし,具体的にバージョンを指定することもできる.バイナリファイルとしては,他にも kube-schedulerkubeletkube-proxy なども指定できる.

  • kubectl コマンド
    • 最新
      • https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256
      • aeca0018958c1cae0bf2f36f566315e52f87bdab38b440df349cd091e9f13f36
    • v1.22.2
      • https://dl.k8s.io/v1.22.2/bin/linux/amd64/kubectl.sha256
      • aeca0018958c1cae0bf2f36f566315e52f87bdab38b440df349cd091e9f13f36
    • v1.20.11
      • https://dl.k8s.io/v1.20.11/bin/linux/amd64/kubectl.sha256
      • 3a2bf981939df89f807858a481f6f5f2e33a7b9708bd029c8bece434db228efe
  • kube-apiserver コマンド
    • 最新
      • https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kube-apiserver.sha256
      • 1887dcff21492cd4fe83682ad22908c8614e732dead927f3af2e5f8fada9a089
    • v1.22.2
      • https://dl.k8s.io/v1.22.2/bin/linux/amd64/kube-apiserver.sha256
      • 1887dcff21492cd4fe83682ad22908c8614e732dead927f3af2e5f8fada9a089
    • v1.20.11
      • https://dl.k8s.io/v1.20.11/bin/linux/amd64/kube-apiserver.sha256
      • bec4c071f6b75b478fd679ec01115f118ba0bcb49131a9011b29a8c53275b3cd

checksum を使って検証をする

以下のように sha256sum --check コマンドを使って検証をすることができる.結果的に OK もしくは WARNING と表示される.

$ curl -LO "https://dl.k8s.io/v1.22.2/bin/linux/amd64/kubectl.sha256"

$ echo "$(<kubectl.sha256) /usr/local/bin/kubectl" | sha256sum --check
kubectl: OK

$ echo "$(<kubectl.sha256) /usr/local/bin/kubectl" | sha256sum --check
/usr/local/bin/kubectl: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

おまけ : macOS で sha256sum コマンドを使う

macOS だと sha256sum コマンドが使えなかった.今回は Homebrew で使えるようにした.

$ which sha256sum
sha256sum not found

$ brew install coreutils

$ which sha256sum
/usr/local/bin/sha256sum

Helmfile で kustomize プロジェクトをデプロイする機能を試した

Helmfile のドキュメントを読んでいたら Advanced Features として「Deploy Kustomization with Helmfile(Helmfile で kustomize をデプロイする)」という機能が載っていた.最初はどういう意味?と疑問だったけど,簡単に言うと helmfile apply コマンドを使って kustomize プロジェクトをデプロイできる機能だった. 試したことをまとめていく!

github.com

Helmfile で kustomize をデプロイする ☸️

さっそく base/overlays/ から構成された通常の kustomize プロジェクトを準備する.今回は kakakakakku/sandbox-kustomize を使う.そして Helmfile の設定ファイルである helmfile.yaml を追加しておく.

$ tree .
.
├── base
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   ├── namespace.yaml
│   └── service.yaml
├── helmfile.yaml
└── overlays
    └── dev
        ├── deployment.yaml
        └── kustomization.yaml

3 directories, 7 files

なお helmfile.yaml は以下のようになる.設定はシンプルで chartkustomizeoverlays ディレクトリを指定している.

releases:
  - name: my-kustomize
    chart: ./overlays/dev/

さっそく helmfile apply コマンドを実行する.なんと簡単に kustomize プロジェクトをデプロイできてしまう🎉もしデプロイはせずにテンプレートを確認する場合は helmfile template コマンドを使えば OK👌

$ helmfile apply

(中略)

UPDATED RELEASES:
NAME           CHART                                                                             VERSION
my-kustomize   /var/folders/tm/whkdv3gd0p17xv63827c4vc00000gr/T/chartify020976714/my-kustomize

$ kubectl get pods -n kakakakakku-dev
NAME                                     READY   STATUS    RESTARTS   AGE
kakakakakku-dev-nginx-7c7bbd5d59-49hfm   2/2     Running   0          80s
kakakakakku-dev-nginx-7c7bbd5d59-54wdd   2/2     Running   0          80s
kakakakakku-dev-nginx-7c7bbd5d59-76wzq   2/2     Running   0          80s
kakakakakku-dev-nginx-7c7bbd5d59-klnrg   2/2     Running   0          80s
kakakakakku-dev-nginx-7c7bbd5d59-rkghp   2/2     Running   0          80s

そして helmfile apply コマンドの結果から確認できる通り,CHART 列に /var/folders/tm/whkdv3gd0p17xv63827c4vc00000gr/T/chartify020976714/my-kustomize と書いてある.ようするに Helmfile は内部的に「一時的な Helm Chart」を作っている.なるほど!仕組みが少し理解できた気がする.

$ cd /var/folders/tm/whkdv3gd0p17xv63827c4vc00000gr/T/chartify410376923/my-kustomize

$ tree .
.
├── Chart.yaml
├── files
│   └── templates
│       └── kustomized.yaml
└── templates
    └── kustomized.yaml

3 directories, 3 files

次の検証に進むため1度消しておく.

$ helmfile delete

(中略)

DELETED RELEASES:
NAME
my-kustomize

Helmfile で Helm Chart と kustomize をデプロイする ☸️

とは言え,kustomize プロジェクトをデプロイするなら普通に kustomize build コマンドを使えば良く,どんなシナリオで便利なのかを考えてみた.例えば Helm Chartkustomize を併用する場合に便利だと思う.具体的には「Jenkins などミドルウェア関連は Helm Chart」「自分で実装をしたアプリケーション関連は kustomize」という場合はどうだろうか?そうなると helm コマンドと kustomize コマンドを併用する必要があるけどhelmfile コマンドで統一的に操作できる」という点はメリットになると思う💡

JenkinsHelm Chart でインストールする例だとすると helmfile.yaml は以下のようになる.

releases:
  - name: my-kustomize
    chart: ./overlays/dev/
  - name: my-jenkins
    chart: jenkins/jenkins
    version: 3.4.1

同じように helmfile apply コマンドを実行すると,なんと Helm Chartkustomize プロジェクトもデプロイすることができた!便利!

$ helmfile apply

(中略)

UPDATED RELEASES:
NAME           CHART                                                                             VERSION
my-kustomize   /var/folders/tm/whkdv3gd0p17xv63827c4vc00000gr/T/chartify251994092/my-kustomize
my-jenkins     jenkins/jenkins                                                                     3.4.1

helmfile.yaml を簡単に図解すると以下のようになる.

f:id:kakku22:20210927084759p:plain

まとめ ☸️

引き続き Helmfile を試している.今回は kustomize と連携する機能を試した.Helm Chatkustomize プロジェクトも helmfile コマンドで統一的に操作できるのは便利だと思う.

関連記事 ☸️

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Helmfile の「テンプレート機能」を試した

前回の記事では Helmfile に入門した!Helm Chart を宣言的に管理することができて便利だった💡

引き続き Helmfile を試していて,GitHub に載っている「The Helmfile Best Practices Guide」を読んでいたら「テンプレート機能」が紹介されていた.Helmfile で多くの Helm Chart を管理していくと,徐々に helmfile.yaml が長くなる可能性がある.そこで「テンプレート機能」を使って共通化をすることで可読性を高くシンプルに記述できるようになる.さっそく試していく!

github.com

「テンプレート機能」を使わずに Helmfile を記述する

まずは「テンプレート機能」を使わずに Helmfile を記述する.今回はサンプルとして bitnami/metrics-serverbitnami/nginx-ingress-controllerHelm Chart でセットアップする.

artifacthub.io

artifacthub.io

ディレクトリ構成は以下とする.helmfile.yaml と環境ごとに values.yaml を用意する.

$ tree .
.
├── helmfile.yaml
├── metrics-server
│   ├── values-development.yaml
│   ├── values-production.yaml
│   └── values-staging.yaml
└── nginx-ingress-controller
    ├── values-development.yaml
    ├── values-production.yaml
    └── values-staging.yaml

2 directories, 7 files

helmfile.yaml を以下のように記述する.複雑な記述はなく bitnami/metrics-serverbitnami/nginx-ingress-controller を含めている.

environments:
  development:
  staging:
  production:

releases:
  - name: metrics-server
    chart: bitnami/metrics-server
    namespace: kube-system
    version: 5.10.0
    values:
      - metrics-server/values-{{`{{ .Environment.Name }}`}}.yaml
  - name: nginx-ingress-controller
    chart: bitnami/nginx-ingress-controller
    namespace: kube-system
    version: 7.6.21
    values:
      - nginx-ingress-controller/values-{{`{{ .Environment.Name }}`}}.yaml

実際に helmfile apply コマンドを実行するとうまくセットアップできた.

$ helmfile -e staging apply

(中略)

UPDATED RELEASES:
NAME                       CHART                              VERSION
metrics-server             bitnami/metrics-server              5.10.0
nginx-ingress-controller   bitnami/nginx-ingress-controller    7.6.21

$ helmfile delete

「テンプレート機能」を使って Helmfile を書く

今度は「テンプレート機能」を使って Helmfile を記述する.以下のように templates を使って Helm Chart の宣言をテンプレート化できる.今回は chartnamespacevalues を含めつつ .Release.Name.Environment.Name をパラメータとして埋め込むようにしている.そして YAML 自体に実装されているマージ機能 << を使って releases を記述している.

environments:
  development:
  staging:
  production:

templates:
  default: &default
    chart: bitnami/{{`{{ .Release.Name }}`}}
    namespace: kube-system
    values:
      - "{{`{{ .Release.Name }}`}}/values-{{`{{ .Environment.Name }}`}}.yaml"

releases:
- name: metrics-server
  version: 5.10.0
  <<: *default
- name: nginx-ingress-controller
  version: 7.6.21
  <<: *default

結果は同じく helmfile apply コマンドを実行してセットアップすることができた.

$ helmfile -e staging apply

(中略)

UPDATED RELEASES:
NAME                       CHART                              VERSION
metrics-server             bitnami/metrics-server              5.10.0
nginx-ingress-controller   bitnami/nginx-ingress-controller    7.6.21

$ helmfile delete

まとめ

Helmfile「テンプレート機能」を使うと helmfile.yaml を 共通化して可読性を高くシンプルに記述できるようになる.今回のサンプルでは「18行」「19行」とむしろ行数が増えてしまったけど,Helm Chart を増やせばメリットが出てくるし,何しろ設定ミスを減らすことにも繋がるため,行数だけでは判断できないと思う.引き続き Helmfile を試していくぞー!

関連記事

kakakakakku.hatenablog.com