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

初心者による初心者のためのKubernetesハンズオン

 初心者による初心者のためのKubernetesハンズオン

研究室内で行ったKubernetesハンズオン資料です。
対象者はKubernetesに触り始めたばかりの人の資料なので、永続化などは範囲外となっています。
また、概念などについてはあまり詳しく触れていないので、他の記事やKubernetes公式のドキュメント等を参考にしてください。

Kota Nonaka

March 02, 2018
Tweet

More Decks by Kota Nonaka

Other Decks in Technology

Transcript

  1. 設定できたか確認 • 実際に研究室のクラスタに接続できるか確認してみる
 (内部ネットワークに接続していることを確認!) 8 $ kubectl get node •

    Clusterに接続されているNode(マシン)が表示されれば成功 NAME STATUS ROLES AGE VERSION
 kube-01 Ready <none> 280d v1.5.2
 kube-03 Ready <none> 1d v1.5.2
 kube-04 Ready <none> 280d v1.5.2 3台のNodeがClusterに接続されていることがわかる
  2. namespaceの作成 • k8sでは「namespace」という概念で環境を分割する • 本日のハンズオンは自分のユーザー名のnamespace上で作業します 9 $ kubectl create namespace

    <ユーザー名>
 namespace "<ユーザー名>" created • Contextがデフォルトで使うnamespaceを変更 $ kubectl config set-context t-lab --namespace=<ユーザー名>
  3. YMLの文法確認 • k8sではYMLやJSONで書かれたマニフェストを
 用いて操作を行うのが一般的 11 apiVersion: v1 kind: Pod metadata:

    name: nginx spec: containers: - name: nginx image: nginx:latest key: value 字下げでインデントを表す(tab使用不可) 「-」 で配列を表す
  4. 操作の流れ • k8sはYML形式で書かれたマニフェスト(リソースの構成を記したファイル) をkubectlコマンドを用いて送信することで各種操作を行う • 送信に用いるコマンドは 15 $ kubectl create

    -f hoge.yml オブジェクトを作成するときはcreateですが、
 他にもreplace(既存のリソースの置き換え)などもあります。 • 送信される前にバリデーションが入るので気軽に試していきましょう!
  5. MySQLを立てる(Deployment) • MySQLを含むDeploymentを作成する 16 apiVersion: extensions/v1beta1 kind: Deployment metadata: name:

    mysql 使用するAPIのバージョンを指定する。
 これがあることで、k8sのバージョンが上がっても
 互換性を維持する事ができる。詳しくはAPI Doc 作成するリソースを指定。大文字から始まる。 リソースに付与する情報(メタデータ)を指定 nameは必須。他にもlabels(後述)なども指定できる。 ここまでは各リソースで共通の部分なので覚えておきましょう!
  6. 17 spec: replicas: 1 template: metadata: name: mysql labels: app:

    wordpress role: database spec: containers: - image: mysql name: mysql env: - name: MYSQL_ROOT_PASSWORD value: dempagumi (前スライドの続き) specの中にリソースの構造を宣言していく replicasにはPodの数を指定する • Podは1つ以上のコンテナから成る k8s上の最小単位 • replicasはそのPodの複製を何個
 作るかを指定する • 複数作って負荷を分散したりできる • 今回は永続化してない都合上1個で 作成する(詳しく知りたい人は終了後にでも)
  7. 18 spec: replicas: 1 template: metadata: name: mysql labels: app:

    wordpress role: database spec: containers: - image: mysql name: mysql env: - name: MYSQL_ROOT_PASSWORD value: dempagumi (前スライドの続き) templete以下にPodの構成を宣言する Podのマニフェストと同じ書き方 metadata以下にはPodのmetadataを宣言 labelsには好きなkey/valueを設定できる これはあとで使うのでとりあえずこれで。 spec.containersにはPodに含むDockerImageを指定。 imageはmysqlを指定。
 DockerHub以外からPullするときはフルパスで書く。 env以下にはコンテナの環境変数を指定する。 MYSQL_ROOT_PASSWORDにdempagumiと指定。
 (皆様もお好きな値にしてみてね⚡)
  8. MySQLを立てる(Deployment) • 作ったYMLを適当な名前(e.g. mysql-deployment.yml)で保存 19 $ kubectl create -f mysql-deployment.yml

    • 実際にdeployment・podができたか確認してみる $ kubectl get deployment
 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
 mysql 1 1 1 1 1h $ kubectl get pod
 NAME READY STATUS RESTARTS AGE
 mysql-cd8fd7c4f-gxxwh 1/1 Running 0 58m
  9. 21 apiVersion: v1 kind: Service metadata: name: mysql spec: ports:

    - port: 3306 targetPort: 3306 selector: app: wordpress role: database 今回はv1なので要注意 外部から見えるポート番号(port)と
 Pod内のポート番号(targetPort)を指定。 portsなので複数も可。 今回はMySQLの標準のポートだけ。 ここが大事! どのPodを対象とするかをlabelを使って指定する。 appがwordpressでroleがdatabaseのPodが対象になる。 (さっき作ったMySQLのPodのmetadataを見直してみよう。)
  10. MySQLを立てる(Service) • 再び適当な名前(e.g. mysql-service.yml)で保存して、
 リソースを作成してみる(Hint: createを使う) 23 • サービスができているか確認してみる(Hint: getを使う)

    $ kubectl create -f mysql-servece.yml $ kubectl get service 何らかの情報を取ってきたいときは
 だいたいgetなので覚えておくと楽。 (pod/service/deployment/namespace/etc...)
  11. 26 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: wordpress spec: replicas:

    1 template: metadata: labels: app: wordpress role: web spec: containers: - image: wordpress name: wordpress env: - name: WORDPRESS_DB_HOST value: mysql - name: WORDPRESS_DB_PASSWORD value: dempagumi appはwordpressで、role(役割)はwebと指定してみた。 Docker Imageは公式のwordpressのものを使用 DB_HOSTにはMySQLのService名を指定 DB_PASSWORDはDeploymentを作った時に
 envで指定したものを選択
  12. WordPress本体を立てる • 作ったYMLを適当な名前(e.g. wordpress-deployment.yml)で保存 27 $ kubectl create -f wordpress-deployment.yml

    • 実際にdeployment・podができたか確認してみる $ kubectl get deployment
 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
 mysql 1 1 1 1 1h
 wordpress 1 1 1 1 1h $ kubectl get pod
 NAME READY STATUS RESTARTS AGE
 mysql-cd8fd7c4f-gxxwh 1/1 Running 0 58m
 wordpress-c8d645865-ps9hm 1/1 Running 0 1h 増えてる
  13. 28 apiVersion: v1 kind: Service metadata: name: wordpress spec: ports:

    - port: 80 targetPort: 80 selector: app: wordpress role: web Webサーバーは80番で立っているのでtargetPort: 80 selectorを使って先ほどのPodを指定
  14. 実際にWordPressに接続してみる • Pod一覧からWordPress本体が動いているPodの名前をコピーしておく • port-forwardを使って接続してみる 31 $ kubectl port-forward wordpress-c8d645865-ps9hm

    8080:80 • Podの80番ポート(HTTP)を手元の8080番からアクセスできるように
 ポートフォワードしてくれる • 手元のブラウザでhttp://localhost:8080/にアクセスしてみる
  15. 32

  16. 36 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: wordpress spec: rules:

    - host: uutarou.k8s.internal.t-lab.cs.teu.ac.jp http: paths: - backend: serviceName: wordpress servicePort: 80 host名を指定 wordpressという名前のServiceの80番を割り当てる
  17. 特定のhostでアクセスできるようにする • 適当な名前(e.g. ingress.yml)で保存して、kubectl createコマンドを
 使ってリソースを作成する 37 $ kubectl create

    -f ingress.yml • 先ほどマニフェストの中で指定したhostにブラウザからアクセスしてみる • 表示されたかな?
  18. 39

  19. minikube • 自分でClusterを用意するにはGKE(Google Kubernetes Engine)等の
 クラウドサービスを用いるかローカル環境に構築する方法がある • 自分でVMを立てるなどしても可だが、minikubeというツールが存在する • KVM

    or VirtualBox上にVMを作成、Cluster構築を手軽に行える • Core m3のMacBook上でも動いたので割と軽量? • 単一Nodeで構成される為複数のNodeが使いたい場合は別の方法を用いる必要が ある • 複数NodeのClusterを構築してくれるツールも存在(e.g. kubespray)する 43
  20. 今日作ったものの消し方 • kubectl deleteで消せる 48 $ kubectl delete ingress wordpress

    #名前を指定して消す
 $ kubectl delete service -l app=wordpress #lオプションでラベルで絞る
 $ kubectl delete deployment -l app=wordpress
  21. 参考資料 • Kubernetes | Production-Grade Container Orchestration
 https://kubernetes.io/ • WEB+DB

    PRESS Vol.99 特集3 • Software Design 2018年3月号 第2特集 50