Contenu connexe Similaire à Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説 (20) Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説1. Google Container Engine (GKE) &
Kubernetes のアーキテクチャ解説
九州インフラ交流勉強会 (Kixs) Vol.005
Proprietary + Confidential
Samir Hammoudi aka サミール
クラウドカスタマエンジニア
SEPTEMBER 2, 2017
3. Copyright 2015 Google Inc
Googleでは10年間に渡り、すべてのサービスをコンテナ
で動かしてきた
毎週20億以上のコンテナを立ち上げている
Images by Connie Zhou
10. Kubernetes (k8s) とは
● “コンテナオーケストレーション”
○ コンテナ中心のインフラ
● Googleの内部システムとコンテナの運用経験に
インスパイアされている
● Runs Anywhere
● 2014年にオープンソース化
● Kubernetes やクラウドネイティブエコシステムを
管理する CNCF に寄贈
14. Master ノードのコンポーネント
API Server
→ kubectl は API Server を REST API で叩くコマンドツール
Scheduler
→ Pod をノードにスケジュールするコンポーネント
Controller
→ クラスタの状態を常に監視しするバックグラウンドプロセス
→ 定義された状態と異なると、それを修正するコンポーネント
etcd
→ 分散 KVS
→ クラスタの全データを格納するデータストア
20. Pod はデプロイ単位
Log Roller
Web Server
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Kubernetes
Master/Scheduler
コンテナ
コンテナ
ポッド
21. Labels & Selectors
● 各 Kubernetes のオブジェクトに紐付けられ
るキーバリューペア
● オブジェクトのフィルタリングに使用
● オブジェクトの作成の際に設定され、いつで
も変更可能
● ラベルは API オブジェクトを繋ぐ重要なのり
○ Deployment → Pods
○ Service → Deployment
apiVersion: v1
kind: Service
metadata:
name: web-svc
labels:
name: web
app: demo
spec:
selector:
name: web
type: LoadBalancer
ports:
- port: 80
targetPort: 5000
protocol: TCP
26. Deployment
● YAML ファイルに設定されたポッドの数が
常に起動しているかを保証する
→ Pod をシャットダウンや起動する
● Deployment を replicas: 1 で作成すると、1
つの Pod が常に起動していることを保証す
る
● デプロイするコンテナイメージと公開する
ポートを指定する
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-deployment
labels:
name: web
app: demo
spec:
replicas: 1
template:
metadata:
labels:
app: demo
spec:
containers:
- name: web
image:
asia.gcr.io/<projectid>/web-python:v1
ports:
- containerPort: 5000
name: http
protocol: TCP
27. Deployment で Pods をスケールする
Master
Docker kubelet
kube proxy
supervisord
fluentd
Web
Pod
1
DB
Pod
Registry
replicas
3
Deployment
definitions (yaml)
Web
Pod
2
Web
Pod
3
replicas
1
編集
28. Services
アプリケーションのエンドポイント
● TCP / UDP をサポート
● kube-proxy 経由で Iptables を操作
Types
● ClusterIP (クラスタ内のみでアクセスできる VIP)
● NodePort (クラスタ外からアクセス可能なサービス)
● LoadBalancer (LB 経由でアクセス可能なサービス)
● ExternalName (クラスタ外のサービスを指定可能)
apiVersion: v1
kind: Service
metadata:
name: web
labels:
name: web
app: demo
spec:
selector:
name: web
type: LoadBalancer
ports:
- port: 80
targetPort: 5000
protocol: TCP
30. エンドポイントを抽象化
id: frontend-service
port: 8080
labels:
role: frontend
stage: production
Type: LoadBalancer
Frontend Service
FE FE FE FE
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Container
Agent
Container
Agent
Container
Agent
Container
Agent
port: 8080
Load-Balancing
Internet
31. エンドポイントを抽象化
id: backend-service
port: 9000
labels:
role: backend
stage: production
Type: ClusterIP
Backend Service
BE BE BE BE
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Machine
Host
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Container
Agent
Container
Agent
FE
port: 9000
Load-Balancing
でも、FEはどうやってBEにアクセスするの?
34. Service Discovery - 環境変数(例)
サービス名: ”redis-master”
ポート: TCP 6379
クラスタ内のIP: 10.0.0.11
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
35. Dev と Prod の差異は環境変数で解決
Dev 環境のクラスタ
サービス名:Web
サービス名:Redis Redis
Web
redis_host = os.environ.get('REDIS_SERVICE_HOST', '')
redis_port = os.environ.get('REDIS_SERVICE_PORT', 6379)
Prod 環境のクラスタ
Redis
Web
redis_host = os.environ.get('REDIS_SERVICE_HOST', '')
redis_port = os.environ.get('REDIS_SERVICE_PORT', 6379)
環境変数
(自動生成)
REDIS_SERVICE_HOST=10.0.0.11
REDIS_SERVICE_PORT=6379
REDIS_PORT=tcp://10.0.0.11:6379
REDIS_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_PORT_6379_TCP_PORT=6379
REDIS_PORT_6379_TCP_ADDR=10.0.0.11
REDIS_SERVICE_HOST=10.0.1.11
REDIS_SERVICE_PORT=6379
REDIS_PORT=tcp://10.0.1.22:6379
REDIS_PORT_6379_TCP=tcp://10.0.1.11:6379
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_PORT_6379_TCP_PORT=6379
REDIS_PORT_6379_TCP_ADDR=10.0.1.11
コード変更不要
38. Secret の環境変数(例)
$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kind: Secret
...
type: Opaque
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
$ echo -n "admin" > ./username.txt
$ echo -n "1f2d1e2e67df" > ./password.txt
$ kubectl create secret generic mysecret
--from-file=./username.txt
--from-file=./password.txt
secret "mysecret" created
Secret の作成
Secret の確認
環境変数経由でSecret の利用
39. Kubernetes での役割のサマリー
Kubernetes Master の役割は以下となる
→ API Server / Scheduler / Replication Controller
各 Node は Pod を実行する役割
Pod は Kubernetes のデプロイ単位で、1か複数のコンテナを含む
Label は Kubernetes のオブジェクト間を紐付ける役割
Selector は Kubernetes のオブジェクトをフィルターする役割
Deployment は Pod の可用性を担保する役割
Service は Pod を内部、又は外部に公開する役割
Service Discovery はサービスを環境変数やDNSで解決する役割
ConfigMap/Secret は設定やパスワードをイメージから切り離す機能
40. Minikube - ローカル環境
サポートされているKubernetes の機能
● DNS
● NodePorts
● ConfigMaps and Secrets
● Dashboards
● Container Runtime: Docker, and rkt
● Enabling CNI (Container Network
Interface)
● Ingress
サポートされているVM Drivers
● virtualbox
● vmwarefusion
● kvm (driver installation)
● xhyve (driver installation)
42. Kubernetes は Google の Borg からインスパイア
Google は Kubernetes の複数の SIG をリードしたり、積極的に開発にも参加して
います。
→ Kubernetes は Google が論文で出した Borg (社内コンテナオーケストレーショ
ンシステム) からインスパイアーされている
GKE は Kubernetes の新しいバージョンや機能をより早くかつ自動的に対応
Private Container Registry
→ Google Container Registry (GCR)
43. One click で k8s クラスタを作成
Kubernetes クラスタを手動で作る必要はない
普通だと、全てを手動でインストールする必要がある
● 例えば、ネットワーク:クラスタ間で Pod はどのように通信するのか? flannel や
weave を使う? → GKE ではフルマネージド
● インストールが必要のバイナリー:
○ マスタ:etcd, kube-apiserver, kube-controller-manager, kube-scheduler
○ 各ノード:docker, kubelet, kube-proxy
● API Server を HTTPS で設定するなら、証明書が必要
● Addonのインストール:DNS, Logging, Dashboard などなど
GKE が全部やってくれます!
44. Master はマネージドサービス
● Master は Google により管理されており、自動的に更新される
→ Node はユーザによってコントロール
→ ノードのマイナー バージョン(x.X.x)がマスターのバージョンより 3 つ以上
古くなると、そのノードは正しく動作しない場合がある
例: マスタが1.3 になると 1.0 が実行しているノードは動作しない場合がある
● クラスタの設定を持つ etcd の自動バックアップ
● Google の SRE が面倒見てくれます!
45. Node もマネージドモデルにオプトイン可能
● Node の自動アップグレード
→ Node を1by1:unschedulable → drain → 古いバージョンのNodeを削除
→ 新しいバージョンのNodeを作成 → schedulable
● Node の自動修復
→ Node が10分ほど応答しない場合、新しいNodeを作成する
● Node の自動スケール
→ Scheduler が Pod を既存の Node にスケジュールできない場合、新しい
Node を作成し、Pod をその Node にスケジュールする(リソース不足の場合)
● 1 クラスタは 5,000 以上の Node をサポート
46. GCP とのネイティブ連携
● Cloud IAM
→ クラスタのアクセス制御、クラスタ内は RBAC で
● Stackdriver Monitoring & Logging
→ One click で Monitoring と Logging を設定
● Network Route , FW & Load Balancers (ingress)
→ HTTP LB, TCP/UDP LB, Route & FW ルールを自動的に作成
● Persistent Disk (PDHDD & PDSSD)
→ Stateful アプリケーションも PDHDD & PDSSD でサポート
→ ReplicaSet でも自動 PD のプロビジョニング
● GCP コンソールに Dashboard インテグレーション
47. GCP の Preemptible VM との連携
● Preempitble VM って何者?
→ 超安いVM!普通の VM の7割以上安い!
● おいしすぎる話なんすけど、デメリットはなに??
→ VM は Max 24 時間起動する。その後、シャットダウンされる。
● GKE と Preemptible VM との相性はなぜ?
→ GKE の自動修復機能で Preemptible VM のシャットダウンを修復する
● 使い分けが重要
48. Container-Optimized OS (COS)
● 高速なブート
→ スケールアウトが早い
● セキュリティ
→ コンテナに必要なコンポーネントだけを持つOS
→ Verified boot
● Open Source
→ https://cloud.google.com/container-optimized-os/