こんにちは。グループIT推進本部 CIU (CyberAgent group Infrastructure Unit) 所属の 阿部 (@KA33570JP) です。
私は普段、CIU が開発・運用しているプライベートクラウド上で稼働する KaaS (Kubernetes as a Service) である「AKE」の開発・運用に従事しています。
KubeCon + CloudNativeCon Japan 2025に参加したきっかけ
KubeCon では、CloudNative の分野における最新情報であったり、他社の事例、ベストプラクティスなど、様々な情報を得ることができます。
元々 KubeCon には参加してみたい!と思っていましたが、海外に出るという時点で、とても高いハードルになっていました。
しかし、今回は初の日本開催ということで、行くしかない!と思い参加しました。
また、社内の周りにも、OSS にコントリビュートしている人が多く、そのための雰囲気を掴むことも目的としていました。
特に気になったセッションの紹介
Kubernetes SIG Node Intro and Deep Dive
SIG Node では、kubelet をベースに、(コンテナランタイムを通した)コンテナの制御や、ノード上のリソース管理に関するコンポーネントの開発を行っています。
Pod に基づいたコンテナの作成・削除、ボリュームのアタッチ、ログ管理など、その対象範囲は多岐にわたります。
1.33~1.34 までの主なアップデート
In-Place Pod Resize
Pod に割り当てる vCPU や、メモリの量を変えたい場合は、Pod 自体を再作成する必要がありましたが、Pod の再起動なしに割り当て変更を行う機能が、1.33 をもって beta に昇格しました。
(beta に昇格した機能は、デフォルトで有効になります)
In-Place Pod Resize では、 resize
というサブリソースを操作することで、リソースの割り当てを変えることができます。
例えば、このような Pod があったとします。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
spec:
containers:
- name: test-container
image: nginx:latest
ports:
- containerPort: 80
resources:
limits:
cpu: "100m"
memory: "128Mi"
requests:
cpu: "50m"
memory: "64Mi"
Describe してみます。
% kubectl describe pods test-pod
Name: test-pod
*** 中略 ***
Containers:
test-container:
Limits:
cpu: 100m
memory: 128Mi
Requests:
cpu: 50m
memory: 64Mi
kubectl
を使い、 patch
してみます。
% kubectl patch pod test-pod --subresource=resize -p '{"spec": {"containers": [{"name": "test-container", "resources": {"limits": {"cpu": "200Mi"}, "requests": {"cpu": "100Mi"}}}]}}'
pod/test-pod patched
再度、Describe すると、リソースの割り当てが変わっていることがわかります。
% kubectl describe pods test-pod
Name: test-pod
Namespace: default
*** 中略 ***
Containers:
test-container:
Limits:
cpu: 200Mi
memory: 128Mi
Requests:
cpu: 100Mi
memory: 64Mi
このように、Pod の再起動を伴うことなく、リソースの割り当てを変えることができるため、初回処理でリソースを食ってしまうため起動直後はリソースの割り当てを多めにしておき、初回処理が完了したら割り当てリソースを減らすようなことができます。
(なお、メモリの割り当てを「減らす」ことは、まだ未対応のようです)
Sidecar Container
私は、このセッションを聴くまで、サイドカーパターンといえば「 containers
に2コンテナ目として入れる」で、「サイドカーコンテナはすでにあるじゃないか」と思っていたのですが、 initContainers
に入れて、restartPolicy を Always
にするというパターンができ、この度 GA に昇格しました。
例えば、WordPress コンテナに対して、サイドカーで CloudSQL Proxy のコンテナを持たせることをイメージすると、このようになります。
apiVersion: v1
kind: Pod
metadata:
name: test-wordpress-pod
namespace: default
spec:
containers:
- name: wordpress
image: wordpress:latest
ports:
- containerPort: 80
resources:
limits:
cpu: "200m"
memory: "128Mi"
requests:
cpu: "100m"
memory: "64Mi"
env:
- name: WORDPRESS_DB_HOST
value: "localhost:3306"
initContainers:
- name: cloudsql-proxy
image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:latest
restartPolicy: Always
args:
- --credential_file=/secrets/cloudsql/credentials.json
- <YOUR_CONNECTION_NAME>
ports:
- containerPort: 3306
apply してみると、コンテナが2つ稼働していることがわかります。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
test-wordpress-pod 1/2 Running 0 13s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
test-wordpress-pod 2/2 Running 0 33s
initContainers
なので、コンテナの起動順序を明示することができ、上記のようにサイドカーで行う処理に依存する場合などの起動時処理が便利になりそうです。
KubeCon に参加してみて
KubeCon では、各社の事例紹介だけでなく、Kubernetes 自体のアップデートであったり、便利な OSS の紹介など、日々変化を続ける CloudNative の領域を鳥瞰することができました。
セッションのほとんどは英語で行われていたのもあり、英語が苦手な私にとっては、まだ理解が追いついていない部分はありますが、マルチクラスタ運用であったり、Pod のデバッグなど、私たちのプロジェクトの中でも共通する話題について、キーワードを持ち帰ることができました。
とりわけ印象的だったのは、(コミットに限らない)コントリビュートへの期待があちこちで見られたことです。
普段の業務では、OSS を利用しながらプラットフォームを作っていますが、OSS へのコントリビュートを通して、積極的にキャッチアップしていきたいと感じました。