
のびろ、ろくろ首の首よ!「ろくろ首」に学ぶ、Kubernetes自動スケーリング入門
首が伸びる!? 山間の宿で働く女中たちは、客の増加に合わせて首を伸ばし、仕事をこなす驚異の能力を持つろくろ首だった! だが、祭りの夜、客殺到でリソース枯渇! 伸びきった首は悲鳴を上げ、システムは崩壊寸前… 果たして、武士は古の妖怪と最新技術「Kubernetes」を融合させ、宿の危機を救えるのか? 究極の自動スケーリング、その行方は!?
首が伸びる!コンテナの自動スケーリング開始!
山間の宿の奥座敷。囲炉裏の火がパチパチと爆ぜる音を背に、女中たちが集まっていた。旅の武士は、柱の陰から彼女たちの様子を窺っていた。
「今日はお客さん、多いわね」と、お梅が呟いた。「部屋の掃除に、食事の支度に、大忙しだよ」
「あら、でも大丈夫よ」とお竹がにっこり笑う。すると、彼女の首が、にゅるりと伸び始めた。天井を突き抜け、隣の部屋まで届く。「若旦那、手が足りないみたいだから、手伝ってくれるって」
武士は息を呑んだ。他の女中たちも、次々と首を伸ばし始める。まるで無数の蔓が天井を這うようだ。伸びた首は、遠くの部屋の様子を探ったり、厨房の進捗状況を確認したりしている。
「これって…一体…」武士は呟いた。すると、お梅の伸びた首が、武士の目の前に降りてきた。「驚かせちゃってごめんなさいね。私たち、こういう体質なの」
「でも、便利なのよ」とお絹が付け加える。彼女の首は、帳場まで伸びて売上を確認している。「お客さんが増えたら、私たちも首を伸ばして仕事すればいいんだもの」
「まるで、Kubernetesの自動スケーリングみたいだな…」武士は思わず呟いた。
func rokuroskubiAutoscaling(requests int) {
currentReplicas := getRokurokubiCount()
threshold := 10 // リクエスト10ごとにろくろ首1人追加
if requests/threshold > currentReplicas {
addRokurokubi(requests/threshold - currentReplicas)
fmt.Println("首が伸びた!ろくろ首を追加しました!")
} else if requests/threshold < currentReplicas {
removeRokurokubi(currentReplicas - requests/threshold)
fmt.Println("首が縮んだ!ろくろ首を減らしました!")
} else {
fmt.Println("現状維持!")
}
}
「お客さんが増えると、リクエストが増える。すると、まるで首が伸びるように、コンテナが増えて処理能力が上がる。そして、お客さんが減ると、首が縮むようにコンテナが減る…なるほど、うまくできているものだ」
武士は、妖怪の不思議な力と、技術の進歩に、深い感銘を受けていた。

リソース枯渇!ろくろ首の悲鳴!
祭りの夜、宿は大賑わいだった。次々とやってくる客に、女中たちは嬉しい悲鳴を上げていた…はずだった。
「お梅さん、手が足りないわ!もっと首を伸ばして!」お竹が叫ぶ。彼女の首は既に限界まで伸び、天井に張り付いていた。
「無理よ…もうこれ以上伸びない…」お梅は苦しそうに答えた。彼女の首もまた、細く長く伸びきっていた。普段なら帳場まで届くはずの首が、今日は半分も届かない。
「どうしたんだ?もっと人を呼べ!」と、若旦那が焦って指示を出す。
「でも、若旦那…お部屋はもう満室で…」お絹の震える声が響く。彼女の首は制御を失い、まるで蛇のように天井を這い回り始めた。「きゃあああ!」悲鳴が上がる。
「これは…まるでリソース不足だな…」柱の陰で見ていた武士は呟いた。「Kubernetesクラスタのリソースが足りていない。だから、新しいPod(ろくろ首)が起動できないんだ」
var rokurokubiResource requests = 100 //ろくろ首一人当たりのリソース要求量
var clusterResourceLimit int = 500 //クラスタのリソース上限
func handleRequest(newRequests int) error {
neededRokurokubi := newRequests * rokurokubiResource
if neededRokurokubi > clusterResourceLimit {
fmt.Println("リソース不足!首が伸びない!")
return errors.New("リソース不足")
}
// ... ここでリソース割り当て処理 ...
fmt.Println("首が伸びた!リクエスト処理中!")
return nil
}
「ろくろ首一人あたりに必要なリソースと、クラスタ全体のリソース上限を設定しておかないと、今回のように、いざという時に首が伸びなくなる。設定を見直さなければ…」
武士は、技術の難しさと、適切な設定の重要性を改めて実感していた。

設定見直し!首の伸縮、完璧制御!
宿の騒動を目の当たりにした武士は、若旦那に歩み寄った。「若旦那、どうやら女中たちの首の制御がうまくいっていないようだ。私が少し手助けしよう」
「お侍様、一体どうすれば…」と、若旦那は不安げに尋ねる。
「Kubernetesの設定を見直せば良いのだ。リソースの設定と、HPA(Horizontal Pod Autoscaler)を調整すれば、女中たちの首もスムーズに伸縮するようになるだろう」
武士は懐から小さな巻物を取り出し、広げた。そこには、奇妙な記号がびっしりと書かれていた。
// rokurokubiHPA.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: rokurokubi-autoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: rokurokubi-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
「これは…?」若旦那は首を傾げる。
「HPAの設定ファイルだ。`minReplicas`で最小のろくろ首の人数、`maxReplicas`で最大のろくろ首の人数を設定する。そして、`metrics`でCPU使用率を監視し、`averageUtilization`で目標値を設定する。CPU使用率が50%を超えたら、ろくろ首の人数を増やし、下回ったら減らすのだ」
「なるほど…まるで、お客さんの数に合わせて、女中たちの首の長さを自動的に調整するようなものか…」
「その通り。さらに、ろくろ首一人あたりに必要なリソースも設定しておこう」
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: rokurokubi
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 200m
memory: 400Mi
「これで、リソース不足で首が伸びなくなることもなくなるだろう」
武士の指示通りに設定を変更すると、女中たちの首は、まるで魔法のようにスムーズに伸縮するようになった。必要な時に必要なだけ首を伸ばし、仕事が終われば縮める。宿は再び活気を取り戻し、女中たちは笑顔で働いていた。
「お侍様、ありがとうございます!」若旦那は深々と頭を下げた。「おかげで、宿の経営も安定しそうです」
武士は静かに頷いた。「技術を正しく使えば、妖怪の力も最大限に活かせるのだ」

平和な宿、そして未来へ!
宿は、Kubernetesの適切な設定によって、以前とは見違えるように安定した運営ができるようになった。女中たちは、自分の能力を自由にコントロールできるようになり、笑顔で働いていた。
「お侍様のおかげで、私たちも安心して暮らせるようになりました」お梅が、にっこりと微笑む。彼女の首は、今は普通の長さだ。必要な時にだけ伸ばせるようになったことが、彼女たちに自信を与えていた。
「お竹はもう、天井に首がくっついてしまう心配もないね」お絹が笑いながら言うと、お竹も「ええ、もう大丈夫よ!」と元気よく答えた。彼女の首も、今は縮まっている。伸び縮みの制御が完璧になったことで、無駄な体力消費もなくなった。
「よかった、よかった」武士は満足そうに頷いた。「これで私も安心して旅を続けられる」
「お侍様、いつまでもお元気で!」女中たちは、口々に武士に別れを告げた。
// rokurokubiStatus.go
package main
import "fmt"
type Rokurokubi struct {
Name string
Neck int // 首の長さ (0: 通常, 1-10: 伸びた長さ)
}
func (r *Rokurokubi) UpdateNeck(length int) {
if length < 0 {
r.Neck = 0
} else if length > 10 {
r.Neck = 10
} else {
r.Neck = length
}
if r.Neck > 0 {
fmt.Printf("%sの首が%d伸びた!\n", r.Name, r.Neck)
} else {
fmt.Printf("%sの首は通常の状態です。\n", r.Name)
}
}
武士は宿を後にし、再び山道を歩き始めた。振り返ると、宿の窓から、女中たちが手を振っているのが見えた。彼女たちの首は、今は普通の長さだ。しかし、武士の心には、彼女たちの自在に伸び縮みする首が、Kubernetesの柔軟性と効率性の象徴として焼き付いていた。
「そういえば、あの宿のWi-Fi、全然繋がらなかったな…」武士は呟きながら、山道を進んでいった。
