SlideShare a Scribd company logo
2019/2/22最近よく聞く Kubernetes を体験してみた 1/30
最近よく聞く Kubernetes を体験してみた
橋本 修太 武山 文信
日本 openSUSE ユーザ会
2019/2/22最近よく聞く Kubernetes を体験してみた 2/30
本日の内容
●
少しだけ openSUSE の紹介
●
Kubernetes クラスタ構築してみた
●
Kubernetes で自作のアプリを動かしてみる
2019/2/22最近よく聞く Kubernetes を体験してみた 3/30
みなさん
って何かご存知ですか?
2019/2/22最近よく聞く Kubernetes を体験してみた 4/30
正しいのはどれ?
●
1. サーバールームでモフモフできるカメレオン型ガジェット
●
2. Ruby で簡単に Web アプリを作れるフレームワーク
●
3. 1996年にドイツで生まれた Linux ディストリビューション
2019/2/22最近よく聞く Kubernetes を体験してみた 5/30
正しいのはどれ?
●
1. サーバールームでモフモフできるカメレオン型ガジェット
●
2. Ruby で簡単に Web アプリを作れるフレームワーク
●
3. 1996年にドイツで生まれた Linux ディストリビューション
2019/2/22最近よく聞く Kubernetes を体験してみた 6/30
正解: 3
●
3. 20年以上前にドイツで生まれた Linux ディストリビューション
– 1996 年: S.u.S.E Linux 4.2 リリース
●
これ以前は Slackware + 設定ツールでした
●
Q: RedHat 系ですか? Debian 系ですか?
A: どちらでもありません! Slackware系でもありません
●
Q: OpenSUSE ですか?openSUSE ですか?
A: o は小文字です。IPhone ではなく、iPhone なのと同じです
2019/2/22最近よく聞く Kubernetes を体験してみた 7/30
2つの openSUSE
Tumbleweed
常に最新 安定
新しいカーネルやライブラリを使いたい人
アプリケーションのテスト環境
有償サポートが不要な人
普段遣いのデスクトップやサーバーに
2019/2/22最近よく聞く Kubernetes を体験してみた 8/30
openSUSE Leap 15.0 1/2
●
SUSE Linux Enterprise 15 ベースの安定志向
ディストリビューション
●
エンタープライズ版に openSUSE 独自のパッケージを追加
– CentOS + Fedora のような感じ
– デスクトップ環境:
Plasma 5.12, GNOME 3.26, XFCE 4.12, MATE, LXQt, etc.
2019/2/22最近よく聞く Kubernetes を体験してみた 9/30
openSUSE Leap 15.0 2/2
●
年に1回のマイナーアップデート(サービスパック)
– 15.1, 15.2, 15.3, …
– 15.1 は 2019年5月リリース予定
– 3年に1度程度のメジャーアップデート
●
1つ前のバージョンは 42.3 でした
– 15.0 のほうが新しいので注意!
– 42.3 は2019年6月末までサポート
2019/2/22最近よく聞く Kubernetes を体験してみた 10/30
2019/2/22最近よく聞く Kubernetes を体験してみた 11/30
スナップショット
新機能: トランザクショナルアップデート
●
Btrfs を活用した機能がいろいろ
●
トランザクショナルアップデート:
スナップショットを使って、複数のパッケージを同時にアップデート
– パッケージの不整合防止のダウンタイムを再起動の時間だけに
– 詳しくは OSC 2018 Tokyo/Fall のスライドで
ストレージ上の
データ
/ libB.so libC.so/usr/bin/A
実行中
/usr/bin/A libB.so libC.so
Updated Updated
古いファイル
2019/2/22最近よく聞く Kubernetes を体験してみた 12/30
同人誌も書いています
●
コミックマーケットC95で頒布
●
内容
– openSUSE で Google Drive を使う
– Kubic でお手軽 Kubernetes クラス
タ構築
– いまさらだけど… Let’s Encrypt で
HTTPS を使えるようにする
– openSUSE Leap 15.0 でハチプロ
を鳴らしてみよう
●
お買い求めはブースで!
2019/2/22最近よく聞く Kubernetes を体験してみた 13/30
前半 : 構築編
2019/2/22最近よく聞く Kubernetes を体験してみた 14/30
自作の Web アプリケーションを
Kubernetes クラスタにデプロイしてみた
武山 文信
日本 openSUSE ユーザ会
2019/2/22最近よく聞く Kubernetes を体験してみた 15/30
よくあるイメージ
Kubernetes って大規模システムでしか
役に立たないのかな?
1 ノード構成でも使えるところがあるのでは?
2019/2/22最近よく聞く Kubernetes を体験してみた 16/30
docker-compose + 便利機能?
●
リモート端末から直接コンテナを管理できる
– クラスタ側に SSH ログインできるようにする必要なし
●
豊富な REST API を通したアプリ連携
– GitLab から CI で連携したり…
●
パフォーマンス、可用性…
Kubernetes クラスタ
今回は対象外です
コンテナコンテナ
コンテナ
コンテナ
$ kubectl
2019/2/22最近よく聞く Kubernetes を体験してみた 17/30
開発環境
●
openSUSE Kubic をノート PC の KVM 上にインストール
●
Master Node と Worker Node を1つにまとめる細工
– VM を何個も動かしたくない
– Master node への配置制限の解除
●
クラウドで提供されている K8s のほうが色々楽
– Google Cloud Platform、Azure、IBM Cloud、…
– オンプレでもクラウドでも使えるのが K8s 利点
$ kubectl taint nodes ノード名 node-role.kubernetes.io/master:NoSchedule-
2019/2/22最近よく聞く Kubernetes を体験してみた 18/30
題材: 自作 Web アプリ Radish
●
Ruby on Rails で実装した
Connpass っぽいイベント参加登録アプリ(作りかけ)
– 本当に作りかけなので
まだ使い物になりません
●
作業の流れ
1. アプリをコンテナ化する
2. K8s クラスタへのデプロイ
Dockerfile, イメージ、
ここで紹介する K8s の各種定義、ソースコード
https://gitlab.com/ftake/radish
2019/2/22最近よく聞く Kubernetes を体験してみた 19/30
1. アプリのコンテナ対応
●
コンテナを立ち上げたら、すぐ動くようにする
●
Stateless にする
– コンテナを作り直したときにデータが失われないよう、
データをアプリコンテナ外のデータベース(PostgreSQL)へ
●
データベースのデータは永続化するように設定(後述)
●
コンテナイメージをレジストリに配置する
– ローカルでビルドし、
K8s クラスタがアクセスできるレジストリに push が必要
– GitLab のレジストリを使用
●
別の方法: ローカルレジストリを作成する
https://blog.geeko.jp/ftake/1749
ローカルDockerとの違い
コンテナをいつでも
再生成できるように
2019/2/22最近よく聞く Kubernetes を体験してみた 20/30
2. K8s クラスタへのデプロイ
●
コンテナ(K8s 用語では Pod)の構成
– radish-server: Rails アプリのコンテナ
– postgresql: PostgreSQL のコンテナ
●
保存しておくべきデータはここに
radish-server
コンテナ (Pod)
Postgresql
コンテナ (Pod)
ブラウザ
直接は通信できない(後述)
2019/2/22最近よく聞く Kubernetes を体験してみた 21/30
まずは PostgreSQL を動かす
●
必要なものは主に3つ
– Service
クラスタ内から参照できる名前 + ポートで
コンテナがサービスを提供することを宣言する
●
tcp://postgresql:5432
– Deployment
どのようなコンテナ(Pod)を
何個立ち上げるか
●
postgresql:10 イメージのコンテナを 1個
– PersistentVolume(永続ボリューム)
データを永続的に保存しておく領域
postgres
Service
postgres
コンテナ (Pod)
postgres-pv
PersistentVolume
他の Pod
2019/2/22最近よく聞く Kubernetes を体験してみた 22/30
YAML ファイル
●
docker-compose のように
コンテナの定義を YAML で書く
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: radish
name: postgresql
spec:
<< …中略… >>
strategy:
type: Recreate
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgresql
image: postgres:10
env:
- <<…後述…>>
<< 続く >>
apiVersion: v1
kind: Service
metadata:
namespace: radish
name: postgresql
spec:
selector:
app: postgresql
type: ClusterIP
clusterIP: None
ports:
- port: 5432
Service
tcp://postgresql:5432
提供されるサービスがある
Deployment:
postgres:10 イメージ
でコンテナを1つ起動
app: postgresql を持つ
コンテナがサービスを提供
2019/2/22最近よく聞く Kubernetes を体験してみた 23/30
PostgreSQL の保存先を作る
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: radish
name: radish-db-pv
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
storageClassName: standard
hostPath:
path: /var/lib/radish/db
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: radish
name: radish-db-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
<<postgresqlのDeploymentの続き>>
containers:
- name: postgresql
image: postgres:10
Env: <<略>>
volumeMounts:
- name: data-dir
mountPath: /var/lib/postgresql/data
volumes:
- name: data-dir
persistentVolumeClaim:
claimName: radish-db-pvc
DBのデータディレクトリを
永続ボリュームに
Claimを満たすVolumeを
k8sが割り当て
Nodeの/var/lib/radish/db
に領域を確保
2019/2/22最近よく聞く Kubernetes を体験してみた 24/30
Apply でリソースを作成
●
定義ファイルを書いたら kubectl apply でリソースを作成する
– 修正したら再度 kubectl apply して OK
●
何個もリソースが作り直されることはない(一種のべき等性)
$ kubectl apply -f kube/postgresql.yml
$ kubectl apply -f kube/radish-db.yml
$ kubectl apply -f kube
$ kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
postgresql-7dd686946c-jdw8m   1/1       Running   1          12s
$ kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
postgresql   ClusterIP   None             <none>        5432/TCP         12s
ディレクトリ指定も可
コンテナとサービス状態取得
2019/2/22最近よく聞く Kubernetes を体験してみた 25/30
便利機能1: Name space
●
Radishで使用する k8s のリソース(Pod, Service)をまとめる
– アクセス制御にも使えるが…今回はスキップ
$ docker ps
CONTAINER ID IMAGE ...
852e3e9d0756 radish:master ...
e03bc13bf859 postgres:10
92ad9078be0e busybox
1215054fd637 registry
ac74b987a567 portus
3ef7fb2aa6ce jenkins
13f540dad13f redmine
$ kubectl -n radish get pods
NAME READY ...
postgresql-c9cc48968-k8wfn 1/1 ...
radish-d7554c44b-lb9rr 1/1
色々なコンテナが
たくさん出てくる
radish 関連のコンテナのみ
2019/2/22最近よく聞く Kubernetes を体験してみた 26/30
便利機能2: ConfigMap と Secret
●
設定っぽいものをまとめておける
– ConfigMap: 一般用
– Secret: API キーとか
●
Deployment で環境変数値を
設定するときに参照できる
kind: ConfigMap
metadata:
name: radish-config
namespace: radish
data:
db.user: postgres
db.name: radish
kind: Secret
metadata:
name: radish-secret
namespace: radish
data: {}
stringData:
db.password: pAS$w0rd
rails.secret_key_base: 3447ef705b…
<< Deployment の一部 >>
env:
- name: RADISH_DB_USER
valueFrom:
configMapKeyRef:
name: radish-config
key: db.user
- name: RADISH_DB_PASSWORD
valueFrom:
secretKeyRef:
name: radish-secret
key: db.password
2019/2/22最近よく聞く Kubernetes を体験してみた 27/30
アプリを動かす
●
同じように
Deployment と
Service を書く
●
$ kubectl apply
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: radish
name: radish
spec:
selector:
matchLabels:
app: radish
template:
metadata:
labels:
app: radish
spec:
containers:
- name: radish-server
image: registry.gitlab.com/ftake/radish:master
imagePullPolicy: Always
command: ["bundle", "exec", "rails", "s"]
env:
<< 長いので省略 >>
ports:
- containerPort: 3000
apiVersion: v1
kind: Service
metadata:
namespace: radish
name: radish
spec:
selector:
app: radish
type: NodePort
ports:
- port: 3000
nodePort: 30080
2019/2/22最近よく聞く Kubernetes を体験してみた 28/30
データベースの初期化
●
コンテナ内のコマンドを実行したい
●
kubectl exec で実行できる
– 引数は Docker と同じ
– コンテナがどこのノードで動いているか気にしなくて良い!
●
●
●
Job という方法もあるらしい
# コンテナ(pod)の名前を調べる
$ kubectl get pods -n radish
NAME READY STATUS RESTARTS AGE
postgresql-7dd686946c-jdw8m 1/1 Running 0 2d
radish-d7554c44b-lb9rr 1/1 Running 0 3d
$ kubectl exec -ti radish-d7554c44b-lb9rr /bin/bash
# ここからはコンテナの中
$ DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:reset
2019/2/22最近よく聞く Kubernetes を体験してみた 29/30
外からアクセスする
●
サービスをクラスタの外に公開する
– 方法1: ポートフォワード
サービスを Node のポートにマッピング
– 方法2: Ingress Nginx Controller
URL のパターンで Service に転送
●
どの Worker Node に転送する?
– Load balancer を使う
●
MetalLB: K8s クラスタからルーターのルーティングをコントロール
●
IaaS であれば、提供されているものを使用
– 耐障害性を無視するなら(1ノードなら)決め打ち
http://ノード1のIPアドレス:30080/
●
Node まで届ければ kube-proxy が Service に応じてコンテナへ
apiVersion: v1
kind: Service
metadata:
namespace: radish
name: radish
spec:
selector:
app: radish
type: NodePort
ports:
- port: 3000
nodePort: 30080
ポートフォワード
2019/2/22最近よく聞く Kubernetes を体験してみた 30/30
感想
●
抽象化レイヤー(Service, PersistentVolumeClaim)で
実体の差し替えが容易であるが、記述が冗長
●
各リソースの設定ファイルは書いていればなんとなく分かってくる
– 最初は意味不明
●
外部からのアクセスをどうノードに振り分けるかは
色々考える必要があり大変

More Related Content

PPTX
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
PPTX
コンテナって何?
PDF
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
PPTX
Kubernetes introduction
PDF
CNCF Updates 2019 Winter version and Knative
PPTX
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
PDF
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
PDF
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
コンテナって何?
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
Kubernetes introduction
CNCF Updates 2019 Winter version and Knative
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する

What's hot (20)

PDF
TectonicはKubernetesの構築・管理基盤である -概要の章-/-構築の章-
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
Dockerからcontainerdへの移行
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
PPTX
Kubernetes超入門 with java
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PDF
近頃のDockerネットワーク
PDF
コンテナ導入概要資料2018
PPTX
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
PPTX
CRX: Container Runtime Executive 
PPTX
Rootlessコンテナ
PPTX
Dockerが抱えるネットワークの課題
PDF
クラウドアプリケーションの マルチプロセス・プログラミングモデル を実現する「Data Center Kernel」
PDF
DockerとPodmanの比較
PDF
Dockerの利用事例
PDF
忙しい人の5分で分かるDocker 2017年春Ver
PPTX
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
PDF
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
PDF
OpenStackとDockerの未来像
PDF
コンテナは次世代サービスの主流になるか?
TectonicはKubernetesの構築・管理基盤である -概要の章-/-構築の章-
コンテナ未経験新人が学ぶコンテナ技術入門
Dockerからcontainerdへの移行
Docker入門 - 基礎編 いまから始めるDocker管理
Kubernetes超入門 with java
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
近頃のDockerネットワーク
コンテナ導入概要資料2018
VMwareユーザのためのdocker入門 ~Re:Virtualization Night #1~
CRX: Container Runtime Executive 
Rootlessコンテナ
Dockerが抱えるネットワークの課題
クラウドアプリケーションの マルチプロセス・プログラミングモデル を実現する「Data Center Kernel」
DockerとPodmanの比較
Dockerの利用事例
忙しい人の5分で分かるDocker 2017年春Ver
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
OpenStackとDockerの未来像
コンテナは次世代サービスの主流になるか?
Ad

Similar to 最近良く聞く Kubernetes を体験してみた イントロ + 活用編 (20)

PPTX
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
PDF
Kubernets on Bluemix + DevOpsでコンテナCIやってみた
PDF
kube-system落としてみました
PDF
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
PDF
もっとも簡単なKubernetes構築 on Raspberry pi (July tech festa winter 2021)
PDF
今だからこそ知りたい Docker Compose/Swarm 入門
PDF
Docker ComposeでMastodonが必要なものを梱包する話
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
AlibabaCloudではじめるKubernetes
PDF
これから始めるAzure Kubernetes Service入門
PDF
Docker最新動向2017秋+セキュリティの落とし穴
PDF
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
PDF
最近のKubernetesとDocker Machine/Swarmの話
PDF
普通のRailsアプリをdockerで本番運用する知見
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PPTX
Docker Meetup tpkyo #30 kubecon recap
PPTX
今さら聞けない人のための K8s超入門 Big Sur対応版 CNDO2021 ショートバージョン
PDF
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
PPTX
kubetnetes etc.. & Rancher2.0 Technical Preview -import BLUMIX K8S Clusters-
PPTX
Introduction of skippbox
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernets on Bluemix + DevOpsでコンテナCIやってみた
kube-system落としてみました
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
もっとも簡単なKubernetes構築 on Raspberry pi (July tech festa winter 2021)
今だからこそ知りたい Docker Compose/Swarm 入門
Docker ComposeでMastodonが必要なものを梱包する話
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
AlibabaCloudではじめるKubernetes
これから始めるAzure Kubernetes Service入門
Docker最新動向2017秋+セキュリティの落とし穴
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
最近のKubernetesとDocker Machine/Swarmの話
普通のRailsアプリをdockerで本番運用する知見
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker Meetup tpkyo #30 kubecon recap
今さら聞けない人のための K8s超入門 Big Sur対応版 CNDO2021 ショートバージョン
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
kubetnetes etc.. & Rancher2.0 Technical Preview -import BLUMIX K8S Clusters-
Introduction of skippbox
Ad

More from Fuminobu Takeyama (20)

PDF
Btrfs + Snapper + Samba で作る「以前のバージョン」に戻せるファイルサーバー
PDF
Geeko Magazine: A Technical Magazine on openSUSE, edited on openSUSE―openSUSE...
PDF
SUSE Studio Express を使ってみた
PDF
Geeko Magazine: A Technical Magazine on openSUSE, editied on openSUSE
PDF
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
PDF
ここが違う! OSC Tokyo と台湾の COSCUP
PDF
トランザクショナルアップデート ― Btrfsを活用したパッケージ更新方法
PDF
What is necessary for the next input method framework?
PDF
Leap の初のメジャーアップデート! openSUSE Leap 15.0 リリース
PDF
Portus でプライベート Docker レジストリを構築してみよう(openSUSE の紹介パート)
PDF
Portus でプライベート Docker レジストリを構築してみよう ― 予告編 ―
PDF
Welcome to openSUSE.Asia Summit 2017
PDF
告知LT最終回! openSUSE.Asia Summit 2017 注目セッションのご紹介
PDF
今さら聞けない -Linux コマンドラインツールテクニック その1 rev. 4
PDF
【openSUSEの最新動向のみ】Solrで日本語全文検索システムの構築と応用
PDF
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
PDF
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
PDF
今さら聞けない Linux コマンドラインツールテクニック その1 rev. 2
PDF
20161106 osc-tokyo-lt-asia-summit
PDF
20161106 osc-tokyo-command-line
Btrfs + Snapper + Samba で作る「以前のバージョン」に戻せるファイルサーバー
Geeko Magazine: A Technical Magazine on openSUSE, edited on openSUSE―openSUSE...
SUSE Studio Express を使ってみた
Geeko Magazine: A Technical Magazine on openSUSE, editied on openSUSE
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
ここが違う! OSC Tokyo と台湾の COSCUP
トランザクショナルアップデート ― Btrfsを活用したパッケージ更新方法
What is necessary for the next input method framework?
Leap の初のメジャーアップデート! openSUSE Leap 15.0 リリース
Portus でプライベート Docker レジストリを構築してみよう(openSUSE の紹介パート)
Portus でプライベート Docker レジストリを構築してみよう ― 予告編 ―
Welcome to openSUSE.Asia Summit 2017
告知LT最終回! openSUSE.Asia Summit 2017 注目セッションのご紹介
今さら聞けない -Linux コマンドラインツールテクニック その1 rev. 4
【openSUSEの最新動向のみ】Solrで日本語全文検索システムの構築と応用
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
今さら聞けない Linux コマンドラインツールテクニック その1 rev. 2
20161106 osc-tokyo-lt-asia-summit
20161106 osc-tokyo-command-line

最近良く聞く Kubernetes を体験してみた イントロ + 活用編

  • 1. 2019/2/22最近よく聞く Kubernetes を体験してみた 1/30 最近よく聞く Kubernetes を体験してみた 橋本 修太 武山 文信 日本 openSUSE ユーザ会
  • 2. 2019/2/22最近よく聞く Kubernetes を体験してみた 2/30 本日の内容 ● 少しだけ openSUSE の紹介 ● Kubernetes クラスタ構築してみた ● Kubernetes で自作のアプリを動かしてみる
  • 3. 2019/2/22最近よく聞く Kubernetes を体験してみた 3/30 みなさん って何かご存知ですか?
  • 4. 2019/2/22最近よく聞く Kubernetes を体験してみた 4/30 正しいのはどれ? ● 1. サーバールームでモフモフできるカメレオン型ガジェット ● 2. Ruby で簡単に Web アプリを作れるフレームワーク ● 3. 1996年にドイツで生まれた Linux ディストリビューション
  • 5. 2019/2/22最近よく聞く Kubernetes を体験してみた 5/30 正しいのはどれ? ● 1. サーバールームでモフモフできるカメレオン型ガジェット ● 2. Ruby で簡単に Web アプリを作れるフレームワーク ● 3. 1996年にドイツで生まれた Linux ディストリビューション
  • 6. 2019/2/22最近よく聞く Kubernetes を体験してみた 6/30 正解: 3 ● 3. 20年以上前にドイツで生まれた Linux ディストリビューション – 1996 年: S.u.S.E Linux 4.2 リリース ● これ以前は Slackware + 設定ツールでした ● Q: RedHat 系ですか? Debian 系ですか? A: どちらでもありません! Slackware系でもありません ● Q: OpenSUSE ですか?openSUSE ですか? A: o は小文字です。IPhone ではなく、iPhone なのと同じです
  • 7. 2019/2/22最近よく聞く Kubernetes を体験してみた 7/30 2つの openSUSE Tumbleweed 常に最新 安定 新しいカーネルやライブラリを使いたい人 アプリケーションのテスト環境 有償サポートが不要な人 普段遣いのデスクトップやサーバーに
  • 8. 2019/2/22最近よく聞く Kubernetes を体験してみた 8/30 openSUSE Leap 15.0 1/2 ● SUSE Linux Enterprise 15 ベースの安定志向 ディストリビューション ● エンタープライズ版に openSUSE 独自のパッケージを追加 – CentOS + Fedora のような感じ – デスクトップ環境: Plasma 5.12, GNOME 3.26, XFCE 4.12, MATE, LXQt, etc.
  • 9. 2019/2/22最近よく聞く Kubernetes を体験してみた 9/30 openSUSE Leap 15.0 2/2 ● 年に1回のマイナーアップデート(サービスパック) – 15.1, 15.2, 15.3, … – 15.1 は 2019年5月リリース予定 – 3年に1度程度のメジャーアップデート ● 1つ前のバージョンは 42.3 でした – 15.0 のほうが新しいので注意! – 42.3 は2019年6月末までサポート
  • 11. 2019/2/22最近よく聞く Kubernetes を体験してみた 11/30 スナップショット 新機能: トランザクショナルアップデート ● Btrfs を活用した機能がいろいろ ● トランザクショナルアップデート: スナップショットを使って、複数のパッケージを同時にアップデート – パッケージの不整合防止のダウンタイムを再起動の時間だけに – 詳しくは OSC 2018 Tokyo/Fall のスライドで ストレージ上の データ / libB.so libC.so/usr/bin/A 実行中 /usr/bin/A libB.so libC.so Updated Updated 古いファイル
  • 12. 2019/2/22最近よく聞く Kubernetes を体験してみた 12/30 同人誌も書いています ● コミックマーケットC95で頒布 ● 内容 – openSUSE で Google Drive を使う – Kubic でお手軽 Kubernetes クラス タ構築 – いまさらだけど… Let’s Encrypt で HTTPS を使えるようにする – openSUSE Leap 15.0 でハチプロ を鳴らしてみよう ● お買い求めはブースで!
  • 14. 2019/2/22最近よく聞く Kubernetes を体験してみた 14/30 自作の Web アプリケーションを Kubernetes クラスタにデプロイしてみた 武山 文信 日本 openSUSE ユーザ会
  • 15. 2019/2/22最近よく聞く Kubernetes を体験してみた 15/30 よくあるイメージ Kubernetes って大規模システムでしか 役に立たないのかな? 1 ノード構成でも使えるところがあるのでは?
  • 16. 2019/2/22最近よく聞く Kubernetes を体験してみた 16/30 docker-compose + 便利機能? ● リモート端末から直接コンテナを管理できる – クラスタ側に SSH ログインできるようにする必要なし ● 豊富な REST API を通したアプリ連携 – GitLab から CI で連携したり… ● パフォーマンス、可用性… Kubernetes クラスタ 今回は対象外です コンテナコンテナ コンテナ コンテナ $ kubectl
  • 17. 2019/2/22最近よく聞く Kubernetes を体験してみた 17/30 開発環境 ● openSUSE Kubic をノート PC の KVM 上にインストール ● Master Node と Worker Node を1つにまとめる細工 – VM を何個も動かしたくない – Master node への配置制限の解除 ● クラウドで提供されている K8s のほうが色々楽 – Google Cloud Platform、Azure、IBM Cloud、… – オンプレでもクラウドでも使えるのが K8s 利点 $ kubectl taint nodes ノード名 node-role.kubernetes.io/master:NoSchedule-
  • 18. 2019/2/22最近よく聞く Kubernetes を体験してみた 18/30 題材: 自作 Web アプリ Radish ● Ruby on Rails で実装した Connpass っぽいイベント参加登録アプリ(作りかけ) – 本当に作りかけなので まだ使い物になりません ● 作業の流れ 1. アプリをコンテナ化する 2. K8s クラスタへのデプロイ Dockerfile, イメージ、 ここで紹介する K8s の各種定義、ソースコード https://gitlab.com/ftake/radish
  • 19. 2019/2/22最近よく聞く Kubernetes を体験してみた 19/30 1. アプリのコンテナ対応 ● コンテナを立ち上げたら、すぐ動くようにする ● Stateless にする – コンテナを作り直したときにデータが失われないよう、 データをアプリコンテナ外のデータベース(PostgreSQL)へ ● データベースのデータは永続化するように設定(後述) ● コンテナイメージをレジストリに配置する – ローカルでビルドし、 K8s クラスタがアクセスできるレジストリに push が必要 – GitLab のレジストリを使用 ● 別の方法: ローカルレジストリを作成する https://blog.geeko.jp/ftake/1749 ローカルDockerとの違い コンテナをいつでも 再生成できるように
  • 20. 2019/2/22最近よく聞く Kubernetes を体験してみた 20/30 2. K8s クラスタへのデプロイ ● コンテナ(K8s 用語では Pod)の構成 – radish-server: Rails アプリのコンテナ – postgresql: PostgreSQL のコンテナ ● 保存しておくべきデータはここに radish-server コンテナ (Pod) Postgresql コンテナ (Pod) ブラウザ 直接は通信できない(後述)
  • 21. 2019/2/22最近よく聞く Kubernetes を体験してみた 21/30 まずは PostgreSQL を動かす ● 必要なものは主に3つ – Service クラスタ内から参照できる名前 + ポートで コンテナがサービスを提供することを宣言する ● tcp://postgresql:5432 – Deployment どのようなコンテナ(Pod)を 何個立ち上げるか ● postgresql:10 イメージのコンテナを 1個 – PersistentVolume(永続ボリューム) データを永続的に保存しておく領域 postgres Service postgres コンテナ (Pod) postgres-pv PersistentVolume 他の Pod
  • 22. 2019/2/22最近よく聞く Kubernetes を体験してみた 22/30 YAML ファイル ● docker-compose のように コンテナの定義を YAML で書く apiVersion: apps/v1 kind: Deployment metadata: namespace: radish name: postgresql spec: << …中略… >> strategy: type: Recreate template: metadata: labels: app: postgresql spec: containers: - name: postgresql image: postgres:10 env: - <<…後述…>> << 続く >> apiVersion: v1 kind: Service metadata: namespace: radish name: postgresql spec: selector: app: postgresql type: ClusterIP clusterIP: None ports: - port: 5432 Service tcp://postgresql:5432 提供されるサービスがある Deployment: postgres:10 イメージ でコンテナを1つ起動 app: postgresql を持つ コンテナがサービスを提供
  • 23. 2019/2/22最近よく聞く Kubernetes を体験してみた 23/30 PostgreSQL の保存先を作る apiVersion: v1 kind: PersistentVolume metadata: namespace: radish name: radish-db-pv labels: type: local spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce storageClassName: standard hostPath: path: /var/lib/radish/db apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: radish name: radish-db-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard <<postgresqlのDeploymentの続き>> containers: - name: postgresql image: postgres:10 Env: <<略>> volumeMounts: - name: data-dir mountPath: /var/lib/postgresql/data volumes: - name: data-dir persistentVolumeClaim: claimName: radish-db-pvc DBのデータディレクトリを 永続ボリュームに Claimを満たすVolumeを k8sが割り当て Nodeの/var/lib/radish/db に領域を確保
  • 24. 2019/2/22最近よく聞く Kubernetes を体験してみた 24/30 Apply でリソースを作成 ● 定義ファイルを書いたら kubectl apply でリソースを作成する – 修正したら再度 kubectl apply して OK ● 何個もリソースが作り直されることはない(一種のべき等性) $ kubectl apply -f kube/postgresql.yml $ kubectl apply -f kube/radish-db.yml $ kubectl apply -f kube $ kubectl get pods NAME                          READY     STATUS    RESTARTS   AGE postgresql-7dd686946c-jdw8m   1/1       Running   1          12s $ kubectl get service NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE postgresql   ClusterIP   None             <none>        5432/TCP         12s ディレクトリ指定も可 コンテナとサービス状態取得
  • 25. 2019/2/22最近よく聞く Kubernetes を体験してみた 25/30 便利機能1: Name space ● Radishで使用する k8s のリソース(Pod, Service)をまとめる – アクセス制御にも使えるが…今回はスキップ $ docker ps CONTAINER ID IMAGE ... 852e3e9d0756 radish:master ... e03bc13bf859 postgres:10 92ad9078be0e busybox 1215054fd637 registry ac74b987a567 portus 3ef7fb2aa6ce jenkins 13f540dad13f redmine $ kubectl -n radish get pods NAME READY ... postgresql-c9cc48968-k8wfn 1/1 ... radish-d7554c44b-lb9rr 1/1 色々なコンテナが たくさん出てくる radish 関連のコンテナのみ
  • 26. 2019/2/22最近よく聞く Kubernetes を体験してみた 26/30 便利機能2: ConfigMap と Secret ● 設定っぽいものをまとめておける – ConfigMap: 一般用 – Secret: API キーとか ● Deployment で環境変数値を 設定するときに参照できる kind: ConfigMap metadata: name: radish-config namespace: radish data: db.user: postgres db.name: radish kind: Secret metadata: name: radish-secret namespace: radish data: {} stringData: db.password: pAS$w0rd rails.secret_key_base: 3447ef705b… << Deployment の一部 >> env: - name: RADISH_DB_USER valueFrom: configMapKeyRef: name: radish-config key: db.user - name: RADISH_DB_PASSWORD valueFrom: secretKeyRef: name: radish-secret key: db.password
  • 27. 2019/2/22最近よく聞く Kubernetes を体験してみた 27/30 アプリを動かす ● 同じように Deployment と Service を書く ● $ kubectl apply apiVersion: apps/v1 kind: Deployment metadata: namespace: radish name: radish spec: selector: matchLabels: app: radish template: metadata: labels: app: radish spec: containers: - name: radish-server image: registry.gitlab.com/ftake/radish:master imagePullPolicy: Always command: ["bundle", "exec", "rails", "s"] env: << 長いので省略 >> ports: - containerPort: 3000 apiVersion: v1 kind: Service metadata: namespace: radish name: radish spec: selector: app: radish type: NodePort ports: - port: 3000 nodePort: 30080
  • 28. 2019/2/22最近よく聞く Kubernetes を体験してみた 28/30 データベースの初期化 ● コンテナ内のコマンドを実行したい ● kubectl exec で実行できる – 引数は Docker と同じ – コンテナがどこのノードで動いているか気にしなくて良い! ● ● ● Job という方法もあるらしい # コンテナ(pod)の名前を調べる $ kubectl get pods -n radish NAME READY STATUS RESTARTS AGE postgresql-7dd686946c-jdw8m 1/1 Running 0 2d radish-d7554c44b-lb9rr 1/1 Running 0 3d $ kubectl exec -ti radish-d7554c44b-lb9rr /bin/bash # ここからはコンテナの中 $ DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:reset
  • 29. 2019/2/22最近よく聞く Kubernetes を体験してみた 29/30 外からアクセスする ● サービスをクラスタの外に公開する – 方法1: ポートフォワード サービスを Node のポートにマッピング – 方法2: Ingress Nginx Controller URL のパターンで Service に転送 ● どの Worker Node に転送する? – Load balancer を使う ● MetalLB: K8s クラスタからルーターのルーティングをコントロール ● IaaS であれば、提供されているものを使用 – 耐障害性を無視するなら(1ノードなら)決め打ち http://ノード1のIPアドレス:30080/ ● Node まで届ければ kube-proxy が Service に応じてコンテナへ apiVersion: v1 kind: Service metadata: namespace: radish name: radish spec: selector: app: radish type: NodePort ports: - port: 3000 nodePort: 30080 ポートフォワード
  • 30. 2019/2/22最近よく聞く Kubernetes を体験してみた 30/30 感想 ● 抽象化レイヤー(Service, PersistentVolumeClaim)で 実体の差し替えが容易であるが、記述が冗長 ● 各リソースの設定ファイルは書いていればなんとなく分かってくる – 最初は意味不明 ● 外部からのアクセスをどうノードに振り分けるかは 色々考える必要があり大変