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

自宅サーバへのKubernetes導入

Takaaki Baba
January 18, 2020
810

 自宅サーバへのKubernetes導入

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