Slide 1

Slide 1 text

自宅サーバへの 導入

Slide 2

Slide 2 text

自己紹介 - 新卒入社してから、エンジニアとして3年目 - サーバ仮想化、コンテナ、オブジェクトストレージ - 会社でインフラ、自宅でフロントを触り、 仕事とプライベートのバランスを保つ - 趣味: キャンプ、登山、Nightcore、Future Bass - Twitter: @xcv600

Slide 3

Slide 3 text

Kubernetes 知ってる方

Slide 4

Slide 4 text

Kubernetes 使ったことある方

Slide 5

Slide 5 text

Kubernetes デプロイしたことある方

Slide 6

Slide 6 text

Kubernetes 興味ある方

Slide 7

Slide 7 text

フロント インフラ Kubernetes

Slide 8

Slide 8 text

フロント フロント インフラ Kubernetes

Slide 9

Slide 9 text

フロント - 会員制サービス - カレンダー - ファイルシステム可視化ツール - 手軽にファイルやフォルダを移動、編集できる

Slide 10

Slide 10 text

カレンダー(予定表示画面) Android PC

Slide 11

Slide 11 text

カレンダー(予定追加画面) Android PC

Slide 12

Slide 12 text

ファイルシステム可視化、操作簡易化

Slide 13

Slide 13 text

ドラッグ&ドロップで移動できる他に、以下が可能 ディレクトリに対する操作 ファイルに対する操作

Slide 14

Slide 14 text

インフラ フロント インフラ Kubernetes

Slide 15

Slide 15 text

自宅サーバの構成 - 物理マシン: 3台 - 仮想化: KVM(OpenStackは、コストに対してメリットが低すぎた) - DNSサーバ: BIND - ストレージ: Ceph(3 vm) - データベース: MariaDB Galera Cluster(3 vm) - デプロイ自動化: Chef(Chefサーバが別node上にChefサーバをデプロイ) - 冗長化、ロードバランシング: Pacemaker, Corosync, HAProxy

Slide 16

Slide 16 text

物理マシン Ceph BIND9 (DNS サーバ) 冗長化

Slide 17

Slide 17 text

正常性監視 - ping、curl、各コンポーネントのヘルスチェック - アラートはFirebase経由でAndroidにpush通知 Android PC

Slide 18

Slide 18 text

Kubernetes フロント インフラ Kubernetes

Slide 19

Slide 19 text

Kubernetesとは - コンテナ環境の オーケストレーションツール - アプリケーションのデプロイ - オートヒール - スケーリング - 各種設定はyamlで定義 - 読み書きしやすい - クラスタ内のサーバがダウンしても、 Kubernetesが別のサーバで代わりのコンテナを作るので、 サービスを継続しやすい 引用元: https://ja.wikipedia.org/wiki/Kubernetes

Slide 20

Slide 20 text

LinuxとKubernetesの比較 Linux  Kubernetes   パッケージ rpm, deb chart 設定 設定ファイル value(yaml) パッケージ管理ツール yum, apt-get helm

Slide 21

Slide 21 text

Kubernetes(k8s)の導入 - k8sのインストールは、ドキュメントが豊富なので簡単 - kubeadmでひとまずインストールできる - アプリはhelm chartで簡単にデプロイ - 公式chart集があり、必要なものを持ってくると自作不要 - https://github.com/helm/charts/tree/master/stable - value(yaml)に必要な設定だけを書けば良い - 簡単に設定できる - デフォルト値からの変更点がわかる - 自宅サーバでは、LAMPをk8s上に移行中

Slide 22

Slide 22 text

物理マシン Ceph BIND9 (DNS サーバ) 現在

Slide 23

Slide 23 text

物理マシン Ceph BIND9 (DNS サーバ) 今後

Slide 24

Slide 24 text

$ helm fetch stable/lamp $ tar xvf lamp-1.1.2.tgz $ cd ~/lamp $ vim values.yaml => どういう設定ができるのかの確認 $ helm install \ --name lamp \ --namespace lamp \ ~/lamp Error: validation failed: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1" - 現在のchartには問題があることをissueで確認 - https://github.com/helm/charts/issues/18875 - https://github.com/helm/charts/issues/18762

Slide 25

Slide 25 text

$ kubectl get deployments.apps nginx -o yaml|less -i [[-- apiVersion: apps/v1 => 今使ってるk8sでは、apiVersionにapps/v1を指定すれば良さそう --]] $ vim ~/lamp/templates/deployment.yaml [[-- - 修正 apiVersion: apps/v1 : --]] - 再度デプロイ $ helm install \ --name lamp \ --namespace lamp \ ~/lamp Error: release lamp failed: Deployment.apps "lamp-lamp" is invalid: [spec.selector: Required value, spec.template.metadata.labels: Invalid value: map[string]string{"app":"lamp", "release":"lamp"}: `selector` does not match template `labels`] => 「spec.selector: Required value」とあるので、chartに不足がありそう

Slide 26

Slide 26 text

$ vim deployment.yaml [[-- selector: matchLabels: app: {{ template "lamp.name" . }} --]] $ helm install \ --name lamp \ --namespace lamp \ ~/lamp NAME: lamp LAST DEPLOYED: Sat Jan 18 08:09:33 2020 NAMESPACE: lamp STATUS: DEPLOYED RESOURCES: ==> v1/ConfigMap NAME AGE lamp-lamp-httpd 0s lamp-lamp-php 0s => helm installはできてそう

Slide 27

Slide 27 text

$ kubectl -n lamp get all NAME READY STATUS RESTARTS AGE pod/lamp-lamp-747cb6479-mp9vb 0/2 Pending 0 2m14s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/lamp-lamp LoadBalancer 10.107.17.117 80:31877/TCP 2m14s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/lamp-lamp 0/1 1 0 2m14s NAME DESIRED CURRENT READY AGE replicaset.apps/lamp-lamp-747cb6479 1 1 0 2m14s => pod/lamp-lamp-747cb6479-mp9vbがPendingなので何が問題なのか確認 $ kubectl -n lamp describe pod/lamp-lamp-747cb6479-mp9vb|less -i : Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 10s (x4 over 2m59s) default-scheduler error while running "VolumeBinding" filter plugin for pod "lamp-lamp-747cb6479-mp9vb": pod has unbound immediate PersistentVolumeClaims

Slide 28

Slide 28 text

- pv用のvalue確認 $ vim ~/lamp/values.yaml [[-- ### STORAGE ### persistence: ## persistence.enabled Enables persistent volume - PV provisioner support necessary enabled: true --]] - 設定 $ vim ~/value/lamp.yaml [[-- persistence: enabled: false --]] $ helm install \ --name lamp \ --namespace lamp \ ~/lamp \ -f ~/value/lamp.yaml => helm installはできてそう

Slide 29

Slide 29 text

$ kubectl -n lamp get all NAME READY STATUS RESTARTS AGE pod/lamp-lamp-8548db8f79-lvpsw 2/2 Running 0 24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/lamp-lamp LoadBalancer 10.100.248.255 80:31105/TCP 24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/lamp-lamp 1/1 1 1 24s NAME DESIRED CURRENT READY AGE replicaset.apps/lamp-lamp-8548db8f79 1 1 1 24s $ kubectl -n lamp get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES lamp-lamp-8548db8f79-lvpsw 2/2 Running 0 50s 10.0.80.5 n01.k8s01 $ curl 10.0.80.5 403 Forbidden => アクセスできない

Slide 30

Slide 30 text

$ kubectl -n lamp exec -it pod/lamp-lamp-8548db8f79-cms57 bash Defaulting container name to httpd. Use 'kubectl describe pod/lamp-lamp-8548db8f79-cms57 -n lamp' to see all of the containers in this pod. bash-5.0# bash-5.0# date > index.html bash-5.0# ls -lah total 4K drwxrwxrwx 2 root root 24 Jan 17 23:43 . drwxr-xr-x 3 root root 18 Jan 17 23:36 .. -rw-r--r-- 1 root root 29 Jan 17 23:43 index.html bash-5.0# chown -R 33:33 /var/www/html $ kubectl -n lamp get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES lamp-lamp-8548db8f79-cms57 2/2 Running 0 8m24s 10.0.80.8 n01.k8s01 $ curl 10.0.80.8 Fri Jan 17 23:43:57 UTC 2020 => アクセスできた

Slide 31

Slide 31 text

課題 - 自宅外からの疎通性 - nginx ingress controllerなどを利用する - リソース可視化 - grahana, prometheusなどを使うと良さそう - 公式chart集にある - Kubernetesのデプロイの自動化 - Chef

Slide 32

Slide 32 text

皆さまのサーバ環境も教えて下さい!