| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「MicroK8s」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の14版が非表示)
4行目: 4行目:
  
 
*https://microk8s.io/
 
*https://microk8s.io/
 +
*https://kubernetes.io/
 +
*https://kubernetes.io/docs/tutorials/kubernetes-basics/
  
 
==基本操作==
 
==基本操作==
 +
===Document===
 +
*[https://kubernetes.io/docs/tutorials/ チュートリアル]
 +
*[https://kubernetes.io/docs/reference/glossary/?fundamental=true 標準用語集]
 +
 
===インストール===
 
===インストール===
 
====[[Mac]]にインストール====
 
====[[Mac]]にインストール====
135行目: 141行目:
 
*https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md
 
*https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md
 
[https://www.typea.info/blog/index.php/2020/11/17/mac_microk8s_dashboard_etc/ ダッシュボード接続手順、トラブルシュート]
 
[https://www.typea.info/blog/index.php/2020/11/17/mac_microk8s_dashboard_etc/ ダッシュボード接続手順、トラブルシュート]
 +
<pre>
 +
$ microk8s enable dashboard dns
 +
$ microk8s dashboard-proxy
 +
</pre>
  
 
===[[Kubectl]]===
 
===[[Kubectl]]===
170行目: 180行目:
 
</pre>
 
</pre>
  
 +
==[https://github.com/kubernetes/examples Kubernetesサンプル]==
 +
==Up and Deploy==
 +
{{amazon|4873118409}}
 +
*https://github.com/kubernetes-up-and-running/kuard
 
===クラスタ===
 
===クラスタ===
 +
----
 
*https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
 
*https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
 
*Kubernetesクラスターは以下の2種類のリソースで構成
 
*Kubernetesクラスターは以下の2種類のリソースで構成
185行目: 200行目:
 
</pre>
 
</pre>
  
==[https://github.com/kubernetes/examples Kubernetesサンプル]==
 
==Up and Deploy==
 
{{amazon|4873118409}}
 
*https://github.com/kubernetes-up-and-running/kuard
 
 
===Pod===
 
===Pod===
 
====作成====
 
====作成====
291行目: 302行目:
 
</pre>
 
</pre>
 
====execでコマンド実行====
 
====execでコマンド実行====
*-it で対話実行
+
*[[kubectl]] -it で対話実行
 
<pre>
 
<pre>
 
$ kubectl exec -it pod/nginx-pod -- /bin/sh
 
$ kubectl exec -it pod/nginx-pod -- /bin/sh
 
#  
 
#  
 
</pre>
 
</pre>
 +
 
====コンテナローカル間でファイルコピー====
 
====コンテナローカル間でファイルコピー====
 
*ローカル のファイルを、Podにコピー
 
*ローカル のファイルを、Podにコピー
469行目: 481行目:
 
*ストレージを管理することはインスタンスを管理することとは全くの別物
 
*ストレージを管理することはインスタンスを管理することとは全くの別物
 
*PersistentVolumeサブシステムは、ストレージが何から提供されているか、どのように消費されているかをユーザーと管理者から抽象化するAPIを提供
 
*PersistentVolumeサブシステムは、ストレージが何から提供されているか、どのように消費されているかをユーザーと管理者から抽象化するAPIを提供
 
+
*Podは、PersistentVolumeClaimを通して「こういうspecのVolumeが欲しい」と要求を出すと、その要求に一番近いPersistentVolumeがmountされるという仕組み
 +
*metadata.name、metadata.labelsと、spec.selector.matchLabels、spec.selector.matchExpressionsの値を合わせることで、PersistentVolumeとPersistentVolumeClaimのマッチングをより明示的に、期待したとおりにできる
 +
*https://thinkit.co.jp/article/14195
 
===PersistentVolume (PV)===
 
===PersistentVolume (PV)===
 
*ストレージクラスを使って管理者もしくは動的にプロビジョニングされるクラスターのストレージの一部
 
*ストレージクラスを使って管理者もしくは動的にプロビジョニングされるクラスターのストレージの一部
725行目: 739行目:
 
===[[Ubuntu NFS構成|NFS]]の構成===
 
===[[Ubuntu NFS構成|NFS]]の構成===
 
*[[Ubuntu NFS構成]]
 
*[[Ubuntu NFS構成]]
 +
*[https://www.server-world.info/en/note?os=Ubuntu_20.04&p=microk8s&f=5 microk8s storage class]
 +
*[https://qiita.com/Esfahan/items/7ad7695ea78c7630239a 外部ストレージをマウント]
 +
*[https://qiita.com/Esfahan/items/68e2d97545091cb6d0ac NFS storage class]
 +
 
*https://thinkit.co.jp/article/14195
 
*https://thinkit.co.jp/article/14195
 
*https://kubernetes.io/docs/concepts/storage/volumes/
 
*https://kubernetes.io/docs/concepts/storage/volumes/
 
*https://github.com/kubernetes/examples/tree/master/staging/volumes/nfs
 
*https://github.com/kubernetes/examples/tree/master/staging/volumes/nfs
  
*[https://www.server-world.info/en/note?os=Ubuntu_20.04&p=microk8s&f=5 microk8s storage class]
 
 
[https://baremetal.jp/blog/2018/04/17/541/ NFS]
 
[https://baremetal.jp/blog/2018/04/17/541/ NFS]
  

2021年2月16日 (火) 11:28時点における最新版

| Kubernetes | Kubectl | Minikube | Docker | Multipass | Ubuntu |

目次

MicroK8s

基本操作

Document

インストール

Macにインストール

  1. $ brew install ubuntu/microk8s/microk8s
  1. $ microk8s install

Ubuntuにインストール

  1. $ sudo snap install microk8s --classic
  • アンインストール
  1. $ sudo snap remove microk8s

ステータスの確認

  • microk8s status でステータスの確認
  • インストール中などは、--wait-ready で状況確認できる
  1. $ microk8s status --wait-ready
  2. microk8s is running
  3. high-availability: no
  4. datastore master nodes: 127.0.0.1:19001
  5. datastore standby nodes: none
  6. addons:
  7. enabled:
  8. ha-cluster # Configure high availability on the current node
  9. disabled:
  10. ambassador # Ambassador API Gateway and Ingress
  11. cilium # SDN, fast with full network policy
  12. :
  13. storage # Storage class; allocates storage from host directory

開始と終了

  • MicroK8sは、停止するまで実行し続ける。停止と開始は、以下のコマンド。
  1. $ microk8s stop
  2. $microk8s start

アドオンの使用

  • MicroK8s は最低限のコンポーネントを使用するが、豊富な機能が "add-ons" とタイプすることで利用できる
  • サービス間の連携を容易にするDNS管理、 アプリケーションがストレージが必要な場合、'storage' アドオンはホストに直接領域を提供する。これらは簡単にセットアップできる

アドオンの一覧

サービスの有効化/無効化

  • 組み込みで有効化可能なアドオンサービスの確認
  • サービスを無効化する場合は、disable
  1. $ microk8s enable --help
  • サービスを有効化する
  • status でどのアドオンが有効/無効かを確認できる
  1. $ microk8s enable dashboard dns registry istio

コマンド

https://microk8s.io/docs/commands

コマンド 内容
microk8s add-node クラスタへの接続文字列を生成
microk8s config
microk8s ctr
microk8s dbctl
microk8s disable
microk8s enable
microk8s inspect
microk8s join
microk8s kubectl
microk8s leave
microk8s refresh-certs
microk8s remove-node
microk8s reset ノードを初期状態にリセット
microk8s start 停止されたノードを開始
microk8s status ステータス情報を表示
microk8s stop カレントノードの停止

マニフェスト

ダッシュボード

ダッシュボード接続手順、トラブルシュート

  1. $ microk8s enable dashboard dns
  2. $ microk8s dashboard-proxy

Kubectl

  • MicroK8s は専用のバージョンのkubectlをバンドルしている。
  • コマンドを監視と制御のために実行することができる。
  1. $ microk8s kubectl get all --all-namespaces
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. kube-system pod/calico-node-m9j8n 1/1 Running 0 90m
  4. kube-system pod/metrics-server-8bbfb4bdb-679mc 1/1 Running 0 7m38s
  5. :
  • MicroK8s は、すでにインストール済みのkubectlとの衝突を防ぐためにネームスペースを指定したkubectlコマンドを使用する
  • もしインストール済みの物がないのであれば、簡単にエイリアスを指定できる
  • ~/.bash_aliases に以下を記載
  1. alias kubectl='microk8s kubectl'
  • ~/.bash_profile に以下を追記
  1. if [ -f ~/.bash_aliases ]; then
  2. . ~/.bash_aliases
  3. fi

Kubeconfig

  1. $ cd ~/
  2. $ mkdir .kube
  3. $ cd .kube
  4. $ microk8s config > config

Kubernetesサンプル

Up and Deploy

クラスタ


  • https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
  • Kubernetesクラスターは以下の2種類のリソースで構成
    • マスターがクラスターを管理する、マスターはクラスターの管理を担当
    • ノードがアプリケーションを動かすワーカーとなる、ノードは、Kubernetesクラスターのワーカーマシンとして機能するVMまたは物理マシン
  1. $ kubectl cluster-info
  2. Kubernetes master is running at https://127.0.0.1:16443
  3.  
  4. $ kubectl get nodes
  5. NAME STATUS ROLES AGE VERSION
  6. microk8s-vm Ready <none> 47h v1.19.3-34+a56971609ff35a

Pod

作成

  • 一番シンプルな方法は kubectl run
  1. $ kubectl run nginx --image=nginx
  2. pod/nginx created

マニフェスト

準備
  • kubectl で -f したときのルートが、/home/ubuntu なので、ローカルの作業フォルダfiles をマウントする
  1. multipass mount `pwd`/files microk8s-vm:/home/ubuntu/files
適用
  • pod-nginx.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx-pod
  5. spec:
  6. containers:
  7. - name: nginx-container
  8. image: nginx:latest
  9. ports:
  10. - containerPort: 8080
  11. name: http
  12. protocol: TCP
  • 適用
  1. $ kubectl apply -f files/pod/pod-nginx.yaml
  2. pod/nginx-pod created

確認

簡易
  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-pod 0/1 Unknown 3 91m
詳細

以下の内容が表示される

  1. 基本情報
  2. Pod内で動いているコンテナ情報
  3. Podに関するイベント情報
  1. $ kubectl describe pod nginx-pod
  2. Name: nginx-pod
  3. Namespace: default
  4. Priority: 0
  5. Node: microk8s-vm/192.168.64.2
  6. Start Time: Wed, 18 Nov 2020 22:43:16 +0900
  7. Labels: <none>
  8. Annotations: cni.projectcalico.org/podIP: 10.1.254.126/32
  9. cni.projectcalico.org/podIPs: 10.1.254.126/32
  10. Status: Running
  11. :

ポートフォワード

  1. $ kubectl port-forward pod/nginx-pod 80 80
  2. Forwarding from 127.0.0.1:80 -> 80
  3. Forwarding from [::1]:80 -> 80
  4. Unable to listen on port 80: Listeners failed to create with the following errors: [unable to create listener: Error listen tcp4 127.0.0.1:80: bind: address already in use unable to create listener: Error listen tcp6 [::1]:80: bind: address already in use]
  • macの場合vmに入れば、、、
  1. ubuntu@microk8s-vm:~$ curl http://localhost:80
  2. Handling connection for 80
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <title>Welcome to nginx!</title>
  7. <style>
  8. body {
  9. width: 35em;
  10. margin: 0 auto;
  11. font-family: Tahoma, Verdana, Arial, sans-serif;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <h1>Welcome to nginx!</h1>
  17. <p>If you see this page, the nginx web server is successfully installed and
  18. working. Further configuration is required.</p>
  19.  
  20. <p>For online documentation and support please refer to
  21. <a href="http://nginx.org/">nginx.org</a>.<br/>
  22. Commercial support is available at
  23. <a href="http://nginx.com/">nginx.com</a>.</p>
  24.  
  25. <p><em>Thank you for using nginx.</em></p>
  26. </body>
  27. </html>

ログの確認

  1. $ kubectl logs nginx-pod

execでコマンド実行

  1. $ kubectl exec -it pod/nginx-pod -- /bin/sh
  2. #

コンテナローカル間でファイルコピー

  • ローカル のファイルを、Podにコピー
  1. $ kubectl cp files/etc/aaa.html nginx-pod:/usr/share/nginx/html/aaa.html
  • Podのファイルをローカルにコピー
  1. $ kubectl cp nginx-pod:/usr/share/nginx/html/index.html files/etc/index.html

Service

クラスター内のアプリケーションにアクセスするために外部IPアドレスを公開

5つのPodで起動しているアプリケーションへのServiceの作成

  1. $ kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml
  2. deployment.apps/hello-world created
  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. hello-world-6df5659cb7-6flwb 0/1 ContainerCreating 0 45s
  4. hello-world-6df5659cb7-lzmnx 0/1 ContainerCreating 0 45s
  5. hello-world-6df5659cb7-ghbfs 0/1 ContainerCreating 0 45s
  6. hello-world-6df5659cb7-jbz9t 0/1 ContainerCreating 0 45s
  7. hello-world-6df5659cb7-fqv2z 0/1 ContainerCreating 0 45s
  1. $ kubectl get deployment hello-world
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. hello-world 5/5 5 5 3m19s
  1. $ kubectl get replicaset
  2. NAME DESIRED CURRENT READY AGE
  3. hello-world-6df5659cb7 5 5 5 5m26s

Deploymentを公開するサービスの生成

  • LoadBlancerの有効化
  1. $ microk8s enable metallb
  • Deploymentの生成
  1. $ kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
  2. service/my-service exposed
  • サービスの確認
  1. $ kubectl get service my-service
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. my-service LoadBalancer 10.152.183.120 192.168.0.120 8080:32132/TCP 20m
  • 実行
  1. $ curl http://192.168.0.120:8080
  2. Hello Kubernetes!
  • クリーンアップ
  1. $ kubectl delete service my-service
  2. service "my-service" deleted
  3. $ kubectl delete deployment hello-world
  4. deployment.apps "hello-world" deleted

PHPアプリサンプル

データストア(Radis )の作成

Radis Master Deployment

  • ゲストブックアプリケーションは、データストアに、Radis を使用する
  1. $ kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml

Radis Master Service

  • ゲストブックアプリケーションは、データストアと通信する必要がある
  1. $ kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml

Radis Slave Deployment

  • Radis Slave として、レプリカを2つ作成
  1. $ kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-deployment.yaml
  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. redis-master-f46ff57fd-lh4lh 1/1 Running 1 19m
  4. redis-slave-bbc7f655d-5vjpb 0/1 ContainerCreating 0 13s
  5. redis-slave-bbc7f655d-954c5 0/1 ContainerCreating 0 13s

Radis Slave Service

  1. $ kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-service.yaml
  1. $ kubectl get services
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 33h
  4. redis-master ClusterIP 10.152.183.90 <none> 6379/TCP 11m
  5. redis-slave ClusterIP 10.152.183.62 <none> 6379/TCP 18s

ゲストブックのセットアップと公開

Frontend Development

  1. $ kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml

Frontend Service

  • 上記で作成した、Radis サービスは、コンテナ内部からのみアクセス可能。
  • デフォルトのサービスは、ClusterIPで、ClusterIPはPodの1つのIPを差す(このIPはクラスタ内殻のみ参照可能)
  • もし、ゲストをゲストブックにアクセスさせたい場合、Frontend サービスを外部に見えるようにする必要がある。
  • クライアントがコンテナクラスターの外部からサービスにリクエストするためには、NodePortサービスを公開することで可能となる
LoadBalancer経由で参照する
  • type を LoadBalancerに変更して、apply
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: frontend
  5. labels:
  6. app: guestbook
  7. tier: frontend
  8. spec:
  9. # comment or delete the following line if you want to use a LoadBalancer
  10. #type: NodePort
  11. # if your cluster supports it, uncomment the following to automatically create
  12. # an external load-balanced IP for the frontend service.
  13. type: LoadBalancer
  14. ports:
  15. - port: 80
  16. selector:
  17. app: guestbook
  18. tier: frontend
  1. $ kubectl apply -f ./files/php_guest_book/frontend-service.yaml
  1. $ kubectl get services
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 36h
  4. redis-master ClusterIP 10.152.183.90 <none> 6379/TCP 3h1m
  5. redis-slave ClusterIP 10.152.183.62 <none> 6379/TCP 169m
  6. frontend LoadBalancer 10.152.183.187 192.168.0.120 80:30334/TCP 3m10s

Microk8s php guestbook.png

  • ダッシュボード

Microk8s php guestbook dashboard.png

クリーンアップ

  1. $ kubectl delete deployment -l app=redis
  2. $ kubectl delete service -l app=redis
  3. $ kubectl delete deployment -l app=guestbook
  4. $ kubectl delete service -l app=guestbook

永続ボリューム

  • https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/
  • ストレージを管理することはインスタンスを管理することとは全くの別物
  • PersistentVolumeサブシステムは、ストレージが何から提供されているか、どのように消費されているかをユーザーと管理者から抽象化するAPIを提供
  • Podは、PersistentVolumeClaimを通して「こういうspecのVolumeが欲しい」と要求を出すと、その要求に一番近いPersistentVolumeがmountされるという仕組み
  • metadata.name、metadata.labelsと、spec.selector.matchLabels、spec.selector.matchExpressionsの値を合わせることで、PersistentVolumeとPersistentVolumeClaimのマッチングをより明示的に、期待したとおりにできる
  • https://thinkit.co.jp/article/14195

PersistentVolume (PV)

  • ストレージクラスを使って管理者もしくは動的にプロビジョニングされるクラスターのストレージの一部
  • Nodeと同じようにクラスターリソースの一部
  • PVはVolumeのようなボリュームプラグインですが、PVを使う個別のPodとは独立したライフサイクルを持っています
  • このAPIオブジェクトはNFS、iSCSIやクラウドプロバイダー固有のストレージシステムの実装の詳細を捕捉します。

PersistentVolumeClaim (PVC)

  • ユーザーによって要求されるストレージで、これはPodと似ています
  • PodはNodeリソースを消費し、PVCはPVリソースを消費します
  • Podは特定レベルのCPUとメモリーリソースを要求することができます。クレームは特定のサイズやアクセスモード(例えば、ReadWriteOnce、ReadOnlyMany、ReadWriteManyにマウントできます
  • PersistentVolumeClaimはユーザーに抽象化されたストレージリソースの消費を許可する一方、ユーザーは色々な問題に対処するためにパフォーマンスといった様々なプロパティを持ったPersistentVolumeを必要とすることは一般的なことです。
  • クラスター管理者はユーザーに様々なボリュームがどのように実装されているかを表に出すことなく、サイズやアクセスモードだけではない色々な点で異なった、様々なPersistentVolumeを提供できる必要があります。これらのニーズに応えるために StorageClass リソースがあります。

チュートリアル

  • クラスター管理者の場合、PersistentVolumeを物理ストレージに作成し、VolumeをPodに関連づける必要はない
  • 開発者、クラスタユーザーの場合、PersistentVolumeChlaimを作成すると、自動的に適したPersistentVolumeに結び付けられる
  • Podを生成し、PersistentVolumeClaimを利用することで、ストレージを利用できる

index.htmlをNodeの作成する

  1. $ multipass sh microk8s-vm
  2. ubuntu@microk8s-vm:~$ sudo mkdir /mnt/data
  3. ubuntu@microk8s-vm:~$ sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"

PersistentVolume生成

  • hostPath PersistentVolume を作成する。KubernetesはhostPathをシングルノードクラスタの開発/テストでサポートする
  • hostPath PersistentVolume は、ネットワークアタッチドストレージをエミュレートしたものとしてNodeのファイル、もしくはディレクトリを使用する
  • 製品版のクラスタでは、hostPathを使わない方が良い。クラスター管理者は、その代わりにネットワークリソース、Google Compute Engine 永続ディスクや、NFS 共有、Amazon Elastic Block Store Volumeを準備する
  • クラスター管理者は動的プロビジョニングのために、StorageClassを利用する
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: task-pv-volume
  5. labels:
  6. type: local
  7. spec:
  8. storageClassName: manual
  9. capacity:
  10. storage: 10Gi
  11. accessModes:
  12. - ReadWriteOnce
  13. hostPath:
  14. path: "/mnt/data"
  1. $ kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml
  2. persistentvolume/task-pv-volume created
  1. $ kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. task-pv-volume 10Gi RWO Retain Available manual 41s

PersistentVolumeClaimの生成

  • PodはPersistentVolumeClaimを物理ストレージの要求に使用する
  1. $ kubectl apply -f https://k8s.io/examples/pods/storage/pv-claim.yaml
  2. persistentvolumeclaim/task-pv-claim created
  1. $ kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim manual 44m
  4. $ kubectl get pvc
  5. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  6. task-pv-claim Bound task-pv-volume 10Gi RWO manual 77s

Podの生成

  • PersistentVolumeClaimをVolumeとして利用するPodの作成
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: task-pv-pod
  5. spec:
  6. volumes:
  7. - name: task-pv-storage
  8. persistentVolumeClaim:
  9. claimName: task-pv-claim
  10. containers:
  11. - name: task-pv-container
  12. image: nginx
  13. ports:
  14. - containerPort: 80
  15. name: "http-server"
  16. volumeMounts:
  17. - mountPath: "/usr/share/nginx/html"
  18. name: task-pv-storage
  1. $ kubectl apply -f https://k8s.io/examples/pods/storage/pv-pod.yaml
  2. pod/task-pv-pod created
  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. task-pv-pod 1/1 Running 0 2m5s
  • マウントしたVolume情報を確認
  1. kubectl exec -it pod/task-pv-pod -- /bin/sh
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. # cat /usr/share/nginx/html/index.html
  4. Hello from Kubernetes storage


  1. # apt update
  2. # apt install curl
  3. # curl http://localhost
  4. Hello from Kubernetes storage

クリーンアップ

  1. $ kubectl delete pod task-pv-pod
  2. $ kubectl delete pvc task-pv-claim
  3. $ kubectl delete pv task-pv-volume

StatefulSet

事前準備

StatefulSet作成

  1. $ kubectl apply -f ./files/statefulset-basic/web.yaml
  2. service/nginx created
  3. statefulset.apps/web created
  1. $ kubectl get services nginx
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. nginx ClusterIP None <none> 80/TCP 4m18s
  4. $ kubectl get statefulset
  5. NAME READY AGE
  6. web 0/2 4m22s

PersistentVolumeClaimsエラーの対応

  1. $ kubectl describe pods
  2. Name: web-0
  3. :
  4. Events:
  5. Type Reason Age From Message
  6. ---- ------ ---- ---- -------
  7. Warning FailedScheduling 40s (x8 over 9m33s) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.
  1. $ multipass sh microk8s-vm
  2. ubuntu@microk8s-vm:~$ sudo mkdir /mnt/data
  • accessModes
    • ReadWriteOnce –ボリュームは単一のNodeで読み取り/書き込みとしてマウントできます
    • ReadOnlyMany –ボリュームは多数のNodeで読み取り専用としてマウントできます
    • ReadWriteMany –ボリュームは多数のNodeで読み取り/書き込みとしてマウントできます

HostPath は、ReadWriteOnce しか選択できない

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: web-pv
  5. labels:
  6. type: local
  7. spec:
  8. capacity:
  9. storage: 5Gi
  10. accessModes:
  11. - ReadWriteOnce
  12. hostPath:
  13. path: "/mnt/data"
  1. $ microk8s apply -f ./files/statefulset-basic/pv.yaml
  2. persistentvolume/web-pv created

順序付けられた Pod 生成

  • StatefulSet n レプリカのために、Pod がデプロイされるときシーケンシャルに生成され順序づけられる(0...n-1)
  1. $ kubectl get pods -w -l app=nginx
  2. NAME READY STATUS RESTARTS AGE
  3. web-0 0/1 Pending 0 7m32s
  4. web-0 0/1 Pending 0 20m
  5. web-0 0/1 ContainerCreating 0 20m
  6. web-0 0/1 ContainerCreating 0 20m
  7. web-0 1/1 Running 0 20m
  8. web-1 0/1 Pending 0 0s
  9. web-1 0/1 Pending 0 0s

StatefulSetのpod

  • StatefulSetに含まれるPodは、一意な順序と安定したネットワークIDを持つ
  • StetefulSetのPod は一意のIDを持つ
  • このIDは、一意の順序付けられたインデックス、それぞれのpodがStatefulSetコントローラに結び付けられている
  • Pod の名前は、<statefulset名>-<順序づけれれたindex> となる。
  1. $ kubectl get pods -l app=nginx
  2. NAME READY STATUS RESTARTS AGE
  3. web-1 0/1 Pending 0 22h
  4. web-0 0/1 Unknown 0 23h

Stable ネットワークIDを使用する

  • それぞれのPod は順序付けられたインデックスに基づく安定したホスト名を持つ
  • kubectl exec でそれぞれのpodにhostname コマンドを実行する
  1. $ for i in 0 1; do kubectl exec pod/web-$i hostname; done
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. web-0
  4. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  5. Error from server (BadRequest): pod web-1 does not have a host assigned
  6. An error occurred when trying to execute 'sudo microk8s.kubectl exec pod/web-1 hostname' with 'multipass': returned exit code 1.

永続化Volumeが、hostPath指定の場合、1つのPodからしか接続できないため立ち上がらない。

  1. $ kubectl describe pods web-1
  2. :
  3. Type Reason Age From Message
  4. ---- ------ ---- ---- -------
  5. Warning FailedScheduling 22h (x14 over 23h) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.

NFSの構成

NFS

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: web-pv
  5. labels:
  6. type: local
  7. spec:
  8. capacity:
  9. storage: 5Gi
  10. accessModes:
  11. - ReadWriteMany
  12. storageClassName: slow
  13. nfs:
  14. server: 192.168.0.47
  15. path: "/var/nfs/general"


  1. $ kubectl describe pv
  2. Name: web-pv
  3. Labels: type=local
  4. Annotations: <none>
  5. Finalizers: [kubernetes.io/pv-protection]
  6. StorageClass: slow
  7. Status: Available
  8. Claim:
  9. Reclaim Policy: Retain
  10. Access Modes: RWX
  11. VolumeMode: Filesystem
  12. Capacity: 5Gi
  13. Node Affinity: <none>
  14. Message:
  15. Source:
  16. Type: NFS (an NFS mount that lasts the lifetime of a pod)
  17. Server: 192.168.0.47
  18. Path: /var/nfs/general
  19. ReadOnly: false
  20. Events: <none>


https://qiita.com/silverbirder/items/d3522237b28703a9adb6

  1. Type Reason Age From Message
  2. ---- ------ ---- ---- -------
  3. Warning FailedScheduling 2s (x6 over 5m58s) default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.

デプロイ

Kubernetesにアプリケーションをデプロイするときは、

  1. マスターにアプリケーションコンテナを起動するように指示
  2. マスターはコンテナがクラスターのノードで実行されるようにスケジュール
  3. ノードは、マスターが公開しているKubernetes APIを使用してマスターと通信
    1. エンドユーザーは、Kubernetes APIを直接使用して対話することもできます

コンテナ化アプリケーションをデプロイ

  1. KubernetesのDeployment の設定を作成
  2. DeploymentはKubernetesにアプリケーションのインスタンスを作成し、更新する方法を指示
  3. Deploymentを作成すると、KubernetesマスターはDeployment内に含まれるアプリケーションインスタンスをクラスター内の個々のノードで実行するようにスケジュール
  4. アプリケーションインスタンスが作成されると、Kubernetes Deploymentコントローラーは、それらのインスタンスを継続的に監視
  5. インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラーはそのインスタンスをクラスター内の別のノード上のインスタンスと置き換え,マシンの故障やメンテナンスに対処するためのセルフヒーリングの仕組みを提供

リソースの作成

  • Macの場合、multipassの中で動いているので、ローカルファイルをkubectlに渡す場合、mountする必要がある。
  1. $ multipass mount `pwd` microk8s-vm:/home/ubuntu/files
  • マニフェスト

sample-pod.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: sample-pod
  5. spec:
  6. containers:
  7. - name: nginx-container
  8. image: nginx:latest
  • 生成
  1. $ kubectl create -f ./files/pod/sample-pod.yaml
  2. pod/sample-pod created
  • 確認
  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. sample-pod 1/1 Running 0 76s

Memo

NginxをPodとしてインストール

  • Kubernetes は、appやserviceをデプロイするためにあるので、kubecltでそれらをKubernetesに対して行うことができる
  • デモアプリをインストールしてみる
  1. $ kubectl enable dns metallb
  2. $ kubectl create deployment nginx --image=nginx
  3. deployment.apps/nginx created
  • 確認
  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-6799fc88d8-c69r9 1/1 Running 0 17m

サービスとして公開

  • Deploymentを確認
  1. $ kubectl get deployment
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. nginx 1/1 1 1 108m
  1. $ kubectl expose deployment nginx --type=LoadBalancer --name=nginx-service --port=8080
  2. service/nginx-service exposed
  • サービスを確認(EXTERNAL-IP/PORT)
  1. $ kubectl get services
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 47h
  4. nginx-service LoadBalancer 10.152.183.63 192.168.64.100 8080:31344/TCP 33s

ポートフォワード

  • 手順を確認
  1. $ kubeclt port-forward -h
  2. kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]
  1. $ kubectl port-forward nginx-6799fc88d8-c69r9 8090:80
  2. Forwarding from 127.0.0.1:8090 -> 80
  3. Forwarding from [::1]:8090 -> 80

クラスタリング

クラスタを作成する(Virtual Boxを使用)

サービスメッシュ

Istio

Tips

Macネットワークトラブルシュート