SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
コンテナ時代に
インフラエンジニアは何をするの
か
グリー株式会社 開発本部 駒﨑 拓斗
2
●グリー入社前
○ 組み込みソフト企業
○ 携帯電話向けプラットフォームの開発
●2012年より グリーインフラ部門
○ 開発環境の構築、運用
○ デプロイツール・フロー改善
○ 商用サービス部門向き合いのインフラ構築・運用・相談
○ 最近の主なフィールドは AWS や GCP
2
自己紹介
駒﨑 拓斗
3
3
とつぜんですが
クイズです
1. init オプション付きで起動する
1. pid=host オプション付きで起動する
1. user=1000:1000 オプション付きで起動する
1. sig-proxy=true オプション付きで起動する
4
次のコマンドは Ctrl+C で停止できません
run のオプションで停止可能にできます。効果があるものを全て選んでください
Q1. Docker クイズ
$ docker run --rm busybox sleep 10000
$ docker run --rm --init busybox sleep 10000
$ docker run --rm --pid=host busybox sleep 10000
$ docker run --rm --user=1000:1000 busybox sleep 10000
$ docker run --rm --sig-proxy=true busybox sleep 10000
5
5
ⓘ Start presenting to display the poll results on this slide.
Ctrl+c で停止可能なのはどれ? (複数選択)
1. init オプション付きで起動する
1. pid=host オプション付きで起動する
1. user=1000:1000 オプション付きで起動する
1. sig-proxy=true オプション付きで起動する
6
次のコマンドは Ctrl+C で停止できません
run のオプションで停止可能にできます。効果があるものを全て選んでください
Q1. 簡易解説
$ docker run --rm busybox sleep 10000
$ docker run --rm --init busybox sleep 10000
$ docker run --rm --pid=host busybox sleep 10000
$ docker run --rm --user=1000:1000 busybox sleep 10000
$ docker run --rm --sig-proxy=true busybox sleep 10000
PID1 のプロセスは明示的にハンドルしない限
り
INT や TERM シグナルで停止しない
軽量 init プロセスを PID1 とし、
コマンドをその子として実行するオプション
→ init 経由でシグナルが伝わり停止する
ホストと PID namespace を共有するオプション
→ PID1 でなくなりシグナルが伝わり停止する
uid:gid を指定するオプション
→ 特に本件では関係ない シグナルの伝搬を指定するオプション
→ デフォルトで true 、本件では指定しても意味がな
い
逆に false にすると Ctrl+C で
KILL が送信され停止する
1. Service type: ExternalName を作成し
Pod から Service 名で参照
$ curl https://greetech/
2. そのままの名前で参照
$ curl https://greetech.example.com/
3. そのままの名前 (末尾 . 付き)で参照
$ curl https://greetech.example.com./
7
Kubernetes の ある Pod から
外部サービス https://greetech.example.com にアクセスします
最も少ない DNS トラフィックが期待できるのは次のうちどれでしょう
※ 一般的な初期設定の Kubernetes クラスタにおいて Pod - クラスタ内 DNS サーバ間
Q2. Kubernetes クイズ
apiVersion: v1
kind: Service
metadata:
name: greetech
spec:
type: ExternalName
externalName: greetech.example.com.
※同一 namespace
8
8
ⓘ Start presenting to display the poll results on this slide.
DNS トラフィックが少ないのは?
1. Service type: ExternalName を作成し
Pod から Service 名で参照
$ curl https://greetech/
2. そのままの名前で参照
$ curl https://greetech.example.com/
3. そのままの名前 (末尾 . 付き)で参照
$ curl https://greetech.example.com./
9
Kubernetes の ある Pod から
外部サービス https://greetech.example.com にアクセスします
最も少ない DNS トラフィックが期待できるのは次のうちどれでしょう
※ 一般的な初期設定の Kubernetes クラスタにおいて Pod - クラスタ内 DNS サーバ間
Q2. 簡易解説
apiVersion: v1
kind: Service
metadata:
name: greetech
spec:
type: ExternalName
externalName: greetech.example.com.
※同一 namespace
# 標準的な resolv.conf (EKS)
nameserver 10.100.0.10
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
options ndots:5
search リスト、ndots: 5 が特徴
→ 名前に含まれるドットが5より少なければ search リストを順番にためすよ、の意
ドット<5 なので search リストの先頭
greetech.default.svc.cluster.local. に問い合わせ、
返された CNAME greetech.example.com. に問い合わせ
ドット<5 なので search リストの先頭から
greetech.example.com.default.svc.cluster.local. ,
greetech.example.com.svc.cluster.local. ,
greetech.example.com.cluster.local. ,
greetech.example.com.ec2.internal. ,
と問い合わせた後、
greetech.example.com. に問い合わせ
FQDN なので greetech.example.com. に問い合わせ
10
10
お付き合いありがとうございました
11
11
本題
コンテナ時代のインフラ
●アプリケーション担当者/チーム (アプリチーム)
○ あるサービスのビジネスロジックを担当する
○ カスタマーに対し サービスを開発、運用する
○ 典型的には、サーバアプリケーション開発者チーム
●インフラストラクチャ担当者/チーム (インフラチーム)
○ アプリチームに対し基盤を提供、開発、運用する
○ 複数のサービスを受け持ち、共通課題を横串で担当する
■ 横串で受け持つことで、コスト・リソースの最適化を狙う
●理想的にはワンチームでプロダクトが作れたらよい、が
○ 複数事業をさばくため
12
アプリチームとインフラチーム
背景: 本日の "インフラエンジニア" について
●サービスを提供するインフラは絶えず変化
●ベアメタルから VM、コンテナへ
●2020 現在グリーでは
○ オンプレミス・パブリッククラウド併用中
○ さらにパブリッククラウドへ移行中
13
グリーグループのインフラの歩み
背景: Web サービスインフラの移り変わり
ベアメタル
オンプレ VM
パブリッククラウド VM
サーバレス
コンテナ
●ベアメタル時代
○ サーバ調達、インベントリ管理、OS 設定、プロビジョニング、...
○ 監視・アラートシステム 内製
●VM 時代 初期
○ プロビジョニングツールの導入
○ Infrastructure as Code による自動化
○ 構造はそのまま クラウドへの "リフト" が行われた
●VM 時代 後期
○ パブリッククラウドの活用
■ プログラマブル / 宣言的な構築 により自動化がさらに進む
■ クラウドに合わせた設計の浸透
■ スケーリング操作など一部運用がアプリチーム側へ
14
インフラのデリバリー・運用の変化
これまでの変化 (ホストベース時代)
●実用的なコンテナ基盤の普及
○ アプリチームからもコンテナが身近なものに
■ docker-compose
■ Cloud Run
■ AWS copilot (ecs-cli)
■ Kubernetes
●マネージド Kubernetes の大きなインパクト
15
コンテナ時代へ
16
消えるインフラ業務、残る生まれるインフラ業務
マネージド Kubernetes の出現
ランタイム / Lib 更新したい
VM イメージ作り直してもらえます
か
サーバにつなげる
最小限の E2E 環境がほしい
構築とデプロイお願いします
デプロイツールの改修を
…
Dockerfile をちょいと
FROM php:7.4-apache 、と
クラスタぽちぽち、
Deployment に Service に
Ingress 書いて、apply 、と
●たしかに 一部の既存業務は ほぼなくなった
○ VM イメージ管理
○ デプロイツール
○ オートスケーリング設定
●引き続きやってくモノ・新しく生まれるモノ
○ サイト信頼性エンジニアリング (SRE) 関連
■ 可観測性の面でより重要度が高まる
○ データストアやネットワーク、CDN などの専門知識
○ 本番運用に耐えるための Kubernetes 自体の知識
○ これまでも VM やパブリッククラウドの登場による変化はあったが
Kubernetes による変化はそれよりかなり大きい
17
消えるインフラ業務、残る生まれるインフラ業務
マネージド Kubernetes の出現
●(少なくとも今のとこは) まだまだ
●例. 冒頭のクイズの領域
○ Q1. Docker クイズ (The PID1 Problem)
■ Dockerfile の書き方を気をつける問題、nodejs で遭遇しがち
○ Q2. Kubernetes クイズ (dnsPolicy ClusterFirst の設定)
■ 名前解決のお作法に気をつける問題
○ しかし全くビジネスロジックには関係無い
■ アプリチームが頑張るところだろうか?
■ 組織として横串で共有すべきノウハウの類
●"アプリチームに基盤を提供する" 仕事の本質は同じ
○ が、どこまでが基盤なの?
18
Kubernetes でインフラの業務範囲はどんどん縮小する?
これから仕事減りそう?
19
ホストベースのころ
19
PHP : アプリチーム
CI : アプリチーム
Deploy : インフラチーム
apache : インフラチーム
VM : インフラチーム
LB : インフラチーム
︙
チーム担当範囲の境界はどこだ
これから
Dockerfile : アプリチーム...?
ちょっとインフラ?
CI/CD : アプリ?インフラ?
K8s : インフラチーム...?
とアプリチーム...?
︙
従来型分担とのアンマッチ
●ソフトの構造と組織の構造に相関がある、として
●従来のチーム分け
○ VM時代以前(ホストベース) の構造に最適化されたもの
●インフラの新しいレイヤが積まれ構造が変化
○ 一段上のプラットフォームができた
○ 抽象化・ソフトの構造が変化した
○ 従来の組織でアンマッチを感じるのは自然
20
ソフトウェアの変化、変化前の組織とのアンマッチ
なぜアンマッチが発生するか
●現状は双方からコミット
●コミュニケーションを大事に
●サービスの時期によって柔軟に
○ 弊社ケース
■ 初期はインフラチーム率高め
■ 安定運用 & K8s 習熟度向上してくるとアプリチーム率高め
■ 境界のあいまいさは許容
21
インフラチーム / アプリチームの壁を越えてコミュニケーション
現時点の状況
Dockerfile
インフラチーム アプリチーム
K8s manifest
K8s Cluster Config
Dockerfile
インフラチーム アプリチーム
K8s manifest
K8s Cluster Config
Dockerfile
インフラチーム アプリチーム
K8s manifest
K8s Cluster Config
CI/CD CI/CDCI/CD
むしろ、従来の構造のチームにキッチリ
合わせようとしてしまうと
Kubernetes 的/クラウドネイティブ的
なソフトを活かせなくなる可能性も
●グリーでは現状 ホストベース環境が主流
○ コンテナ/Kubernetes に向けて即組織刷新とかはない
●いま 2020 年、両方やらなくちゃいけない
●Kubernetes との向き合い方には気をつける
○ コンテナ管理ツール ではなく プラットフォームとして
○ 今までのやり方を延長するより、段を登ってみる
○ さらにプラットフォームのためのプラットフォームでもある
○ プラットフォームの意図を汲む
22
従来のホストベース環境も両方見ていく
現時点の状況
● Dokcer も Kubernetes も関係無しに
実現するとしたら?
○ 環境ごとに VPC を分ける
VPC ごとの DNS サーバを使って
レコードを切り替える
○ AWS Route53 など
23
例.
23
DNS 管理者の帽子
「自前 DNS サーバでコントロールしよう」
アプリから外部サービス API を参照する。
Production / QA / Develop の
環境ごとに参照先を切りかえたい…
どうやって実現しようか
● Dokcer コンテナ的なお作法で
実現するとしたら?
○ コンテナ内で環境変数を参照させ
実行環境で環境変数に参照先ドメインを流し込む
○ コンテナ内に全パターンの config を埋めておき、
環境変数で config パスを切り替える
24
例.
24
Docker の帽子
「APP_PORT_TCP_ADDR 環境変数を
参照させよう」
DNS 管理者の帽子
「自前 DNS サーバでコントロールしよう」
アプリから外部サービス API を参照する。
Production / QA / Develop の
環境ごとに参照先を切りかえたい…
どうやって実現しようか
● Kubernetes のお作法で
実現するとしたら?
○ コンテナ内の名前は固定してよい
Service リソースで流し込む
○ または Docker のとこで挙げたパターンもよい
25
例.
25
Kubernetes の帽子
「Service リソース名を参照させよう」
「もしくは環境変数でもよい」
Docker の帽子
「APP_PORT_TCP_ADDR 環境変数を
参照させよう」
DNS 管理者の帽子
「自前 DNS サーバでコントロールしよう」
アプリから外部サービス API を参照する。
Production / QA / Develop の
環境ごとに参照先を切りかえたい…
どうやって実現しようか
●帽子のかぶりわけ
○ 範囲を明確に認識出来ている状態
●まずは一番上の帽子をかぶる
○ だめなら下の帽子をかぶりなおす
○ どの帽子をかぶっているかを忘れない
●柔軟なプラットフォームほど
帽子を見失いがち
●作る側に回るときにも必要
26
このプラットフォームはどう使われることを想定しているのか
プラットフォームの意図を汲む
Kubernetes の帽子
「Service リソース名を参照させよう」
「もしくは環境変数でもよい」
Docker の帽子
「APP_PORT_TCP_ADDR 環境変数を
参照させよう」
外部サービスの参照先を
環境ごとに切りかえたい
…
DNS 管理者の帽子
「自前 DNS サーバでコントロールしよう」
●アンラーニングで新しい帽子を手に入れる
○ 既存知識との境界を認識する、引きずらない
■ 既存知識の活用・応用はあとからでいい
●多くの場合、高次の帽子が "筋がいい" が
○ ときには帽子をかぶりわける
○ プラットフォームの機能が十分でないとき
○ あえて違う作法を選ぶとき
●帽子を混ぜない!どっちつかずは運用混乱を招く
○ どっちつかずの例.
■ ingress-controller で LB を作成したが、別の方法で設定追加
■ external-dns で作成したレコードと手動作成したレコード混在して参照させる
27
新しい帽子を手に入れる・帽子をかぶりわける
どっちつかずの帽子
●コンテナ・クラウドネイティブ時代も変わらないもの
○ アプリチームがビジネスに集中できる基盤を提供する
○ 横串でノウハウ・サービスを展開する
●ホストベース時代とコンテナ時代の構造の違いを認識
○ どちらにもマッチするチームは難しい
○ (気持ちは) チームの柵を越えていく
●インフラの階層ごとに頭を切り替える
○ インフラ領域も確実に抽象化層が増えた
○ 帽子をかぶりわけるように
○ どの階層の話なのか? をはっきり
28
移行期のインフラエンジニアとして
ホストベース時代からコンテナ時代へ
29
29
ⓘ Start presenting to display the poll results on this slide.
よろしければ教えて下さい皆様の担当領域は?
30
31
Q1. Docker クイズ (The PID1 Problem) 資料
参考リンク
● "Docker/Kubernetes で PID 1 問題を回避する" https://text.superbrothers.dev/200328-how-to-avoid-pid-1-
problem-in-kubernetes/
● "PID1 は、カーネルから特別扱いされてるって本当ですか?" https://speakerdeck.com/superbrothers/pid1-ha-
kanerukara-te-bie-xi-isareterututeben-dang-desuka
● "Docker and Node.js Best Practices"
> Node.js was not designed to run as PID 1 which leads to unexpected behaviour …
https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernel-signals
● Google Cloud "PID 1、シグナル処理、ゾンビプロセスの適切な処理" https://cloud.google.com/solutions/best-
practices-for-building-containers?hl=ja#signal-handling
● docker アプリが適切な signal handling をしていない場合に、アプリの適切な終了処理ができなかったり、実行環境・ア
プリによっては fork したプロセスが回収されずゾンビ大量発生などの問題を招く
● 現実的には nodejs や LL の簡易サーバ、crond などで遭遇しがち
● 自分のアプリが適切に handling できているかについては、クイズのように docker run してみて Ctrl+C や docker stop
/ docker kill --signal="TERM" のようにしてみると簡単に確認できる
● 対応については、alpine ベースであれば apk で tini (軽量 init プロセス) を入れてしまうのが便利
$ docker run --rm busybox sleep 10000
32
Q2. Kubernetes クイズ (dnsPolicy ClusterFirst の設定) 資
料
参考リンク
● "RESOLV.CONF(5)" https://linuxjm.osdn.jp/html/LDP_man-pages/man5/resolv.conf.5.html
● "Kubernetes Documentation >..> DNS for Services and Pods" https://kubernetes.io/docs/concepts/services-
networking/dns-pod-service/#srv-records
● GitHub "update docker's resolv.conf file with options ndots:5"
https://github.com/kubernetes/kubernetes/pull/10266
● GREE Engineer's blog "スマホゲームの API サーバにおける EKS の運用事例 > DNS の名前解決に失敗する"
https://labs.gree.jp/blog/2020/01/20271/#anker612
● "Amazon EKS での DNS 障害のトラブルシューティング" https://aws.amazon.com/jp/premiumsupport/knowledge-
center/eks-dns-failure/
● まずは resolv.conf(5) man の options ndots 項を参照のこと
● Kubernetes 固有の問題。ふつうの(?) Linux 環境であれば ndots: 5 が入っていることはそうそう無いので、
curl https://greetech.example.com/ で何も問題ない
● Kubernetes では、SRV レコードによるサービスディスカバリの利便性のためにこういう設定になっている (下記 github
の kubernetes/kubernetes リンクも参照)
● クイズで問題のある例として挙げた方法では、IPv6 が有効な場合 AAAA レコードにも問い合わせを行い、1つの名前解決
だけで 10 以上のクエリが発生する場合がある
# 標準的な resolv.conf (EKS)
nameserver 10.100.0.10
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
options ndots:5
search リスト、ndots: 5 が特徴
→ 名前に含まれるドットが5より少なければ search リストを順番にためすよ、の意

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Selenium×PostgreSQL15×Grafanaで思い出を保存&分析するプロジェクト(第35回PostgreSQLアンカンファレンス@オンライン...
Selenium×PostgreSQL15×Grafanaで思い出を保存&分析するプロジェクト(第35回PostgreSQLアンカンファレンス@オンライン...Selenium×PostgreSQL15×Grafanaで思い出を保存&分析するプロジェクト(第35回PostgreSQLアンカンファレンス@オンライン...
Selenium×PostgreSQL15×Grafanaで思い出を保存&分析するプロジェクト(第35回PostgreSQLアンカンファレンス@オンライン...
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
 
KeycloakのCNCF incubating project入りまでのアップストリーム活動の歩み
KeycloakのCNCF incubating project入りまでのアップストリーム活動の歩みKeycloakのCNCF incubating project入りまでのアップストリーム活動の歩み
KeycloakのCNCF incubating project入りまでのアップストリーム活動の歩み
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
分散ストレージ技術Cephの最新情報
分散ストレージ技術Cephの最新情報分散ストレージ技術Cephの最新情報
分散ストレージ技術Cephの最新情報
 
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
 
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
 
[Cloud OnAir] Google Cloud とつなぐ色々な方法 〜 つなぐ方法をゼロからご紹介します〜 2019年1月31日 放送
[Cloud OnAir] Google Cloud とつなぐ色々な方法 〜 つなぐ方法をゼロからご紹介します〜 2019年1月31日 放送[Cloud OnAir] Google Cloud とつなぐ色々な方法 〜 つなぐ方法をゼロからご紹介します〜 2019年1月31日 放送
[Cloud OnAir] Google Cloud とつなぐ色々な方法 〜 つなぐ方法をゼロからご紹介します〜 2019年1月31日 放送
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 

Ähnlich wie コンテナ時代にインフラエンジニアは何をするのか

泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
Yosuke Hiraishi
 

Ähnlich wie コンテナ時代にインフラエンジニアは何をするのか (20)

Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
Fabric Essentials
Fabric EssentialsFabric Essentials
Fabric Essentials
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
Tdd
TddTdd
Tdd
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Dapr on Kubernetes
Dapr on KubernetesDapr on Kubernetes
Dapr on Kubernetes
 
Jenkins cicdテンプレートazure版の利用方法解説
Jenkins cicdテンプレートazure版の利用方法解説Jenkins cicdテンプレートazure版の利用方法解説
Jenkins cicdテンプレートazure版の利用方法解説
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)
 
AnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeAnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a Code
 
Db2 Warehouse Spark利用ガイド チュートリアル編
Db2 Warehouse Spark利用ガイド チュートリアル編Db2 Warehouse Spark利用ガイド チュートリアル編
Db2 Warehouse Spark利用ガイド チュートリアル編
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
 

Mehr von gree_tech

Mehr von gree_tech (20)

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件について
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジー
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
 

コンテナ時代にインフラエンジニアは何をするのか

  • 2. 2 ●グリー入社前 ○ 組み込みソフト企業 ○ 携帯電話向けプラットフォームの開発 ●2012年より グリーインフラ部門 ○ 開発環境の構築、運用 ○ デプロイツール・フロー改善 ○ 商用サービス部門向き合いのインフラ構築・運用・相談 ○ 最近の主なフィールドは AWS や GCP 2 自己紹介 駒﨑 拓斗
  • 4. 1. init オプション付きで起動する 1. pid=host オプション付きで起動する 1. user=1000:1000 オプション付きで起動する 1. sig-proxy=true オプション付きで起動する 4 次のコマンドは Ctrl+C で停止できません run のオプションで停止可能にできます。効果があるものを全て選んでください Q1. Docker クイズ $ docker run --rm busybox sleep 10000 $ docker run --rm --init busybox sleep 10000 $ docker run --rm --pid=host busybox sleep 10000 $ docker run --rm --user=1000:1000 busybox sleep 10000 $ docker run --rm --sig-proxy=true busybox sleep 10000
  • 5. 5 5 ⓘ Start presenting to display the poll results on this slide. Ctrl+c で停止可能なのはどれ? (複数選択)
  • 6. 1. init オプション付きで起動する 1. pid=host オプション付きで起動する 1. user=1000:1000 オプション付きで起動する 1. sig-proxy=true オプション付きで起動する 6 次のコマンドは Ctrl+C で停止できません run のオプションで停止可能にできます。効果があるものを全て選んでください Q1. 簡易解説 $ docker run --rm busybox sleep 10000 $ docker run --rm --init busybox sleep 10000 $ docker run --rm --pid=host busybox sleep 10000 $ docker run --rm --user=1000:1000 busybox sleep 10000 $ docker run --rm --sig-proxy=true busybox sleep 10000 PID1 のプロセスは明示的にハンドルしない限 り INT や TERM シグナルで停止しない 軽量 init プロセスを PID1 とし、 コマンドをその子として実行するオプション → init 経由でシグナルが伝わり停止する ホストと PID namespace を共有するオプション → PID1 でなくなりシグナルが伝わり停止する uid:gid を指定するオプション → 特に本件では関係ない シグナルの伝搬を指定するオプション → デフォルトで true 、本件では指定しても意味がな い 逆に false にすると Ctrl+C で KILL が送信され停止する
  • 7. 1. Service type: ExternalName を作成し Pod から Service 名で参照 $ curl https://greetech/ 2. そのままの名前で参照 $ curl https://greetech.example.com/ 3. そのままの名前 (末尾 . 付き)で参照 $ curl https://greetech.example.com./ 7 Kubernetes の ある Pod から 外部サービス https://greetech.example.com にアクセスします 最も少ない DNS トラフィックが期待できるのは次のうちどれでしょう ※ 一般的な初期設定の Kubernetes クラスタにおいて Pod - クラスタ内 DNS サーバ間 Q2. Kubernetes クイズ apiVersion: v1 kind: Service metadata: name: greetech spec: type: ExternalName externalName: greetech.example.com. ※同一 namespace
  • 8. 8 8 ⓘ Start presenting to display the poll results on this slide. DNS トラフィックが少ないのは?
  • 9. 1. Service type: ExternalName を作成し Pod から Service 名で参照 $ curl https://greetech/ 2. そのままの名前で参照 $ curl https://greetech.example.com/ 3. そのままの名前 (末尾 . 付き)で参照 $ curl https://greetech.example.com./ 9 Kubernetes の ある Pod から 外部サービス https://greetech.example.com にアクセスします 最も少ない DNS トラフィックが期待できるのは次のうちどれでしょう ※ 一般的な初期設定の Kubernetes クラスタにおいて Pod - クラスタ内 DNS サーバ間 Q2. 簡易解説 apiVersion: v1 kind: Service metadata: name: greetech spec: type: ExternalName externalName: greetech.example.com. ※同一 namespace # 標準的な resolv.conf (EKS) nameserver 10.100.0.10 search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal options ndots:5 search リスト、ndots: 5 が特徴 → 名前に含まれるドットが5より少なければ search リストを順番にためすよ、の意 ドット<5 なので search リストの先頭 greetech.default.svc.cluster.local. に問い合わせ、 返された CNAME greetech.example.com. に問い合わせ ドット<5 なので search リストの先頭から greetech.example.com.default.svc.cluster.local. , greetech.example.com.svc.cluster.local. , greetech.example.com.cluster.local. , greetech.example.com.ec2.internal. , と問い合わせた後、 greetech.example.com. に問い合わせ FQDN なので greetech.example.com. に問い合わせ
  • 12. ●アプリケーション担当者/チーム (アプリチーム) ○ あるサービスのビジネスロジックを担当する ○ カスタマーに対し サービスを開発、運用する ○ 典型的には、サーバアプリケーション開発者チーム ●インフラストラクチャ担当者/チーム (インフラチーム) ○ アプリチームに対し基盤を提供、開発、運用する ○ 複数のサービスを受け持ち、共通課題を横串で担当する ■ 横串で受け持つことで、コスト・リソースの最適化を狙う ●理想的にはワンチームでプロダクトが作れたらよい、が ○ 複数事業をさばくため 12 アプリチームとインフラチーム 背景: 本日の "インフラエンジニア" について
  • 13. ●サービスを提供するインフラは絶えず変化 ●ベアメタルから VM、コンテナへ ●2020 現在グリーでは ○ オンプレミス・パブリッククラウド併用中 ○ さらにパブリッククラウドへ移行中 13 グリーグループのインフラの歩み 背景: Web サービスインフラの移り変わり ベアメタル オンプレ VM パブリッククラウド VM サーバレス コンテナ
  • 14. ●ベアメタル時代 ○ サーバ調達、インベントリ管理、OS 設定、プロビジョニング、... ○ 監視・アラートシステム 内製 ●VM 時代 初期 ○ プロビジョニングツールの導入 ○ Infrastructure as Code による自動化 ○ 構造はそのまま クラウドへの "リフト" が行われた ●VM 時代 後期 ○ パブリッククラウドの活用 ■ プログラマブル / 宣言的な構築 により自動化がさらに進む ■ クラウドに合わせた設計の浸透 ■ スケーリング操作など一部運用がアプリチーム側へ 14 インフラのデリバリー・運用の変化 これまでの変化 (ホストベース時代)
  • 15. ●実用的なコンテナ基盤の普及 ○ アプリチームからもコンテナが身近なものに ■ docker-compose ■ Cloud Run ■ AWS copilot (ecs-cli) ■ Kubernetes ●マネージド Kubernetes の大きなインパクト 15 コンテナ時代へ
  • 16. 16 消えるインフラ業務、残る生まれるインフラ業務 マネージド Kubernetes の出現 ランタイム / Lib 更新したい VM イメージ作り直してもらえます か サーバにつなげる 最小限の E2E 環境がほしい 構築とデプロイお願いします デプロイツールの改修を … Dockerfile をちょいと FROM php:7.4-apache 、と クラスタぽちぽち、 Deployment に Service に Ingress 書いて、apply 、と
  • 17. ●たしかに 一部の既存業務は ほぼなくなった ○ VM イメージ管理 ○ デプロイツール ○ オートスケーリング設定 ●引き続きやってくモノ・新しく生まれるモノ ○ サイト信頼性エンジニアリング (SRE) 関連 ■ 可観測性の面でより重要度が高まる ○ データストアやネットワーク、CDN などの専門知識 ○ 本番運用に耐えるための Kubernetes 自体の知識 ○ これまでも VM やパブリッククラウドの登場による変化はあったが Kubernetes による変化はそれよりかなり大きい 17 消えるインフラ業務、残る生まれるインフラ業務 マネージド Kubernetes の出現
  • 18. ●(少なくとも今のとこは) まだまだ ●例. 冒頭のクイズの領域 ○ Q1. Docker クイズ (The PID1 Problem) ■ Dockerfile の書き方を気をつける問題、nodejs で遭遇しがち ○ Q2. Kubernetes クイズ (dnsPolicy ClusterFirst の設定) ■ 名前解決のお作法に気をつける問題 ○ しかし全くビジネスロジックには関係無い ■ アプリチームが頑張るところだろうか? ■ 組織として横串で共有すべきノウハウの類 ●"アプリチームに基盤を提供する" 仕事の本質は同じ ○ が、どこまでが基盤なの? 18 Kubernetes でインフラの業務範囲はどんどん縮小する? これから仕事減りそう?
  • 19. 19 ホストベースのころ 19 PHP : アプリチーム CI : アプリチーム Deploy : インフラチーム apache : インフラチーム VM : インフラチーム LB : インフラチーム ︙ チーム担当範囲の境界はどこだ これから Dockerfile : アプリチーム...? ちょっとインフラ? CI/CD : アプリ?インフラ? K8s : インフラチーム...? とアプリチーム...? ︙ 従来型分担とのアンマッチ
  • 20. ●ソフトの構造と組織の構造に相関がある、として ●従来のチーム分け ○ VM時代以前(ホストベース) の構造に最適化されたもの ●インフラの新しいレイヤが積まれ構造が変化 ○ 一段上のプラットフォームができた ○ 抽象化・ソフトの構造が変化した ○ 従来の組織でアンマッチを感じるのは自然 20 ソフトウェアの変化、変化前の組織とのアンマッチ なぜアンマッチが発生するか
  • 21. ●現状は双方からコミット ●コミュニケーションを大事に ●サービスの時期によって柔軟に ○ 弊社ケース ■ 初期はインフラチーム率高め ■ 安定運用 & K8s 習熟度向上してくるとアプリチーム率高め ■ 境界のあいまいさは許容 21 インフラチーム / アプリチームの壁を越えてコミュニケーション 現時点の状況 Dockerfile インフラチーム アプリチーム K8s manifest K8s Cluster Config Dockerfile インフラチーム アプリチーム K8s manifest K8s Cluster Config Dockerfile インフラチーム アプリチーム K8s manifest K8s Cluster Config CI/CD CI/CDCI/CD むしろ、従来の構造のチームにキッチリ 合わせようとしてしまうと Kubernetes 的/クラウドネイティブ的 なソフトを活かせなくなる可能性も
  • 22. ●グリーでは現状 ホストベース環境が主流 ○ コンテナ/Kubernetes に向けて即組織刷新とかはない ●いま 2020 年、両方やらなくちゃいけない ●Kubernetes との向き合い方には気をつける ○ コンテナ管理ツール ではなく プラットフォームとして ○ 今までのやり方を延長するより、段を登ってみる ○ さらにプラットフォームのためのプラットフォームでもある ○ プラットフォームの意図を汲む 22 従来のホストベース環境も両方見ていく 現時点の状況
  • 23. ● Dokcer も Kubernetes も関係無しに 実現するとしたら? ○ 環境ごとに VPC を分ける VPC ごとの DNS サーバを使って レコードを切り替える ○ AWS Route53 など 23 例. 23 DNS 管理者の帽子 「自前 DNS サーバでコントロールしよう」 アプリから外部サービス API を参照する。 Production / QA / Develop の 環境ごとに参照先を切りかえたい… どうやって実現しようか
  • 24. ● Dokcer コンテナ的なお作法で 実現するとしたら? ○ コンテナ内で環境変数を参照させ 実行環境で環境変数に参照先ドメインを流し込む ○ コンテナ内に全パターンの config を埋めておき、 環境変数で config パスを切り替える 24 例. 24 Docker の帽子 「APP_PORT_TCP_ADDR 環境変数を 参照させよう」 DNS 管理者の帽子 「自前 DNS サーバでコントロールしよう」 アプリから外部サービス API を参照する。 Production / QA / Develop の 環境ごとに参照先を切りかえたい… どうやって実現しようか
  • 25. ● Kubernetes のお作法で 実現するとしたら? ○ コンテナ内の名前は固定してよい Service リソースで流し込む ○ または Docker のとこで挙げたパターンもよい 25 例. 25 Kubernetes の帽子 「Service リソース名を参照させよう」 「もしくは環境変数でもよい」 Docker の帽子 「APP_PORT_TCP_ADDR 環境変数を 参照させよう」 DNS 管理者の帽子 「自前 DNS サーバでコントロールしよう」 アプリから外部サービス API を参照する。 Production / QA / Develop の 環境ごとに参照先を切りかえたい… どうやって実現しようか
  • 26. ●帽子のかぶりわけ ○ 範囲を明確に認識出来ている状態 ●まずは一番上の帽子をかぶる ○ だめなら下の帽子をかぶりなおす ○ どの帽子をかぶっているかを忘れない ●柔軟なプラットフォームほど 帽子を見失いがち ●作る側に回るときにも必要 26 このプラットフォームはどう使われることを想定しているのか プラットフォームの意図を汲む Kubernetes の帽子 「Service リソース名を参照させよう」 「もしくは環境変数でもよい」 Docker の帽子 「APP_PORT_TCP_ADDR 環境変数を 参照させよう」 外部サービスの参照先を 環境ごとに切りかえたい … DNS 管理者の帽子 「自前 DNS サーバでコントロールしよう」
  • 27. ●アンラーニングで新しい帽子を手に入れる ○ 既存知識との境界を認識する、引きずらない ■ 既存知識の活用・応用はあとからでいい ●多くの場合、高次の帽子が "筋がいい" が ○ ときには帽子をかぶりわける ○ プラットフォームの機能が十分でないとき ○ あえて違う作法を選ぶとき ●帽子を混ぜない!どっちつかずは運用混乱を招く ○ どっちつかずの例. ■ ingress-controller で LB を作成したが、別の方法で設定追加 ■ external-dns で作成したレコードと手動作成したレコード混在して参照させる 27 新しい帽子を手に入れる・帽子をかぶりわける どっちつかずの帽子
  • 28. ●コンテナ・クラウドネイティブ時代も変わらないもの ○ アプリチームがビジネスに集中できる基盤を提供する ○ 横串でノウハウ・サービスを展開する ●ホストベース時代とコンテナ時代の構造の違いを認識 ○ どちらにもマッチするチームは難しい ○ (気持ちは) チームの柵を越えていく ●インフラの階層ごとに頭を切り替える ○ インフラ領域も確実に抽象化層が増えた ○ 帽子をかぶりわけるように ○ どの階層の話なのか? をはっきり 28 移行期のインフラエンジニアとして ホストベース時代からコンテナ時代へ
  • 29. 29 29 ⓘ Start presenting to display the poll results on this slide. よろしければ教えて下さい皆様の担当領域は?
  • 30. 30
  • 31. 31 Q1. Docker クイズ (The PID1 Problem) 資料 参考リンク ● "Docker/Kubernetes で PID 1 問題を回避する" https://text.superbrothers.dev/200328-how-to-avoid-pid-1- problem-in-kubernetes/ ● "PID1 は、カーネルから特別扱いされてるって本当ですか?" https://speakerdeck.com/superbrothers/pid1-ha- kanerukara-te-bie-xi-isareterututeben-dang-desuka ● "Docker and Node.js Best Practices" > Node.js was not designed to run as PID 1 which leads to unexpected behaviour … https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernel-signals ● Google Cloud "PID 1、シグナル処理、ゾンビプロセスの適切な処理" https://cloud.google.com/solutions/best- practices-for-building-containers?hl=ja#signal-handling ● docker アプリが適切な signal handling をしていない場合に、アプリの適切な終了処理ができなかったり、実行環境・ア プリによっては fork したプロセスが回収されずゾンビ大量発生などの問題を招く ● 現実的には nodejs や LL の簡易サーバ、crond などで遭遇しがち ● 自分のアプリが適切に handling できているかについては、クイズのように docker run してみて Ctrl+C や docker stop / docker kill --signal="TERM" のようにしてみると簡単に確認できる ● 対応については、alpine ベースであれば apk で tini (軽量 init プロセス) を入れてしまうのが便利 $ docker run --rm busybox sleep 10000
  • 32. 32 Q2. Kubernetes クイズ (dnsPolicy ClusterFirst の設定) 資 料 参考リンク ● "RESOLV.CONF(5)" https://linuxjm.osdn.jp/html/LDP_man-pages/man5/resolv.conf.5.html ● "Kubernetes Documentation >..> DNS for Services and Pods" https://kubernetes.io/docs/concepts/services- networking/dns-pod-service/#srv-records ● GitHub "update docker's resolv.conf file with options ndots:5" https://github.com/kubernetes/kubernetes/pull/10266 ● GREE Engineer's blog "スマホゲームの API サーバにおける EKS の運用事例 > DNS の名前解決に失敗する" https://labs.gree.jp/blog/2020/01/20271/#anker612 ● "Amazon EKS での DNS 障害のトラブルシューティング" https://aws.amazon.com/jp/premiumsupport/knowledge- center/eks-dns-failure/ ● まずは resolv.conf(5) man の options ndots 項を参照のこと ● Kubernetes 固有の問題。ふつうの(?) Linux 環境であれば ndots: 5 が入っていることはそうそう無いので、 curl https://greetech.example.com/ で何も問題ない ● Kubernetes では、SRV レコードによるサービスディスカバリの利便性のためにこういう設定になっている (下記 github の kubernetes/kubernetes リンクも参照) ● クイズで問題のある例として挙げた方法では、IPv6 が有効な場合 AAAA レコードにも問い合わせを行い、1つの名前解決 だけで 10 以上のクエリが発生する場合がある # 標準的な resolv.conf (EKS) nameserver 10.100.0.10 search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal options ndots:5 search リスト、ndots: 5 が特徴 → 名前に含まれるドットが5より少なければ search リストを順番にためすよ、の意