Upgrade to Pro — share decks privately, control downloads, hide ads and more …

自宅サーバへのKubernetes導入

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Takaaki Baba Takaaki Baba
January 18, 2020
1k

 自宅サーバへのKubernetes導入

Avatar for Takaaki Baba

Takaaki Baba

January 18, 2020
Tweet

Transcript

  1. 自宅サーバの構成 - 物理マシン: 3台 - 仮想化: KVM(OpenStackは、コストに対してメリットが低すぎた) - DNSサーバ: BIND

    - ストレージ: Ceph(3 vm) - データベース: MariaDB Galera Cluster(3 vm) - デプロイ自動化: Chef(Chefサーバが別node上にChefサーバをデプロイ) - 冗長化、ロードバランシング: Pacemaker, Corosync, HAProxy
  2. Kubernetesとは - コンテナ環境の オーケストレーションツール - アプリケーションのデプロイ - オートヒール - スケーリング

    - 各種設定はyamlで定義 - 読み書きしやすい - クラスタ内のサーバがダウンしても、 Kubernetesが別のサーバで代わりのコンテナを作るので、 サービスを継続しやすい 引用元: https://ja.wikipedia.org/wiki/Kubernetes
  3. Kubernetes(k8s)の導入 - k8sのインストールは、ドキュメントが豊富なので簡単 - kubeadmでひとまずインストールできる - アプリはhelm chartで簡単にデプロイ - 公式chart集があり、必要なものを持ってくると自作不要

    - https://github.com/helm/charts/tree/master/stable - value(yaml)に必要な設定だけを書けば良い - 簡単に設定できる - デフォルト値からの変更点がわかる - 自宅サーバでは、LAMPをk8s上に移行中
  4. $ 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
  5. $ 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に不足がありそう
  6. $ 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はできてそう
  7. $ 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 <pending> 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
  8. - 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はできてそう
  9. $ 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 <pending> 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 <none> <none> $ curl 10.0.80.5 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> => アクセスできない
  10. $ 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 <none> <none> $ curl 10.0.80.8 Fri Jan 17 23:43:57 UTC 2020 => アクセスできた
  11. 課題 - 自宅外からの疎通性 - nginx ingress controllerなどを利用する - リソース可視化 -

    grahana, prometheusなどを使うと良さそう - 公式chart集にある - Kubernetesのデプロイの自動化 - Chef