N100マシン上のKubernetesクラスタにMinIOをデプロイしようとしてハマった話

[公式ドキュメント](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant.html#minio-k8s-deploy-minio-tenant)を見ながらMinIO TenantをKubernetesクラスタにデプロイしていたときに、ハマった箇所を残しておくためのメモ。

# 環境

ホストマシン: GMKtec N100
仮想化基盤: Proxmox
VM OS: Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-49-generic x86_64)

Kubernetes: 1.31.3
CRI-O: 1.31.3

# エラー

PodのStatusがErrorになっているので、ログを確認すると
```bash
Defaulted container "minio" out of: minio, sidecar, validate-arguments (init)
Fatal glibc error: CPU does not support x86-64-v2
```

どうやらCPUの命令セットとの互換性が無いらしい。

# 解決策

コンテナレジストリを確認すると

```bash
% curl -s "https://quay.io/api/v1/repository/minio/minio/tag/?limit=100&page=1" | jq '.tags[] | .name' 
"RELEASE.2024-11-07T00-52-20Z.fips"
"RELEASE.2024-11-07T00-52-20Z-cpuv1"
"RELEASE.2024-11-07T00-52-20Z"
"latest"
"RELEASE.2024-10-29T16-01-48Z.fips"
"RELEASE.2024-10-29T16-01-48Z-cpuv1"
"RELEASE.2024-10-29T16-01-48Z"
"RELEASE.2024-10-13T13-34-11Z.fips"
"RELEASE.2024-10-13T13-34-11Z-cpuv1"
"RELEASE.2024-10-13T13-34-11Z"
```

cpuv1というタグが付いたイメージがある。

マニフェストを持ってきて、使われるイメージを確認すると

```bash
kubectl kustomize https://github.com/minio/operator/examples/kustomization/base/ > tenant-base.yaml
```

```yaml:tenant-base.yaml
spec:
  certConfig: {}
  configuration:
    name: storage-configuration
  env: []
  externalCaCertSecret: []
  externalCertSecret: []
  externalClientCertSecrets: []
  features:
    bucketDNS: false
    domains: {}
  image: quay.io/minio/minio:RELEASE.2024-10-02T17-50-41Z #ここ
```

無印で落ちてくるのは、v2以上に対応しているもののようなので、今回のエラーに見舞われてしまった。
`-cpuv1`をつけると、問題なく起動することができた。

# 原因

lscpuコマンドで対応している命令セットを見てみる。

```bash:N100
fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx
fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq
pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti
```

```bash:Ryzen 9 7900
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx
fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good
nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1
sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm
cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs
ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpci d avx512f avx512dq rdseed
adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec
xgetbv1 xsaves avx512_bf16 clzero xsaveerptr a rat npt nrip_save tsc_scale vmcb_clean
flushbyasid decodeassists pausefilter pfthreshold v_vmsave_vmload avx512vbmi umip
avx512_vbmi2 gfni vaes vpclmulqdq avx 512_vnni avx512_bitalg avx512_vpopcntdq rdpid
fsrm
```

と、対応している命令セットにかなり違いがあることがわかる。

RedHatさんによると

>x86-64-v2 brings support (among other things) for vector instructions up to Streaming SIMD Extensions 4.2 (SSE4.2)  and Supplemental Streaming SIMD Extensions 3 (SSSE3), the POPCNT instruction (useful for data analysis and bit-fiddling in some data structures), and CMPXCHG16B (a two-word compare-and-swap instruction useful for concurrent algorithms).
x86-64-v3 adds vector instructions up to AVX2, MOVBE (for big-endian data access), and additional bit-manipulation instructions.
x86-64-v4 includes vector instructions from some of the AVX-512 variants.
>
>https://developers.redhat.com/blog/2021/01/05/building-red-hat-enterprise-linux-9-for-the-x86-64-v2-microarchitecture-level#

つまり、AVX512まで対応しているRyzen 9 7900はv4、SSE4.2やSSSE3にすら対応していないN100はv1ということになる。