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

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
18,202 バイト追加 、 2021年5月20日 (木) 13:59
==| [[Docker]] | [[KubernetesDocker コマンド]]==| [[Dockerネットワーク]] | [[WSL]] | [[MicroK8s]] | [[Multipass]] | ==[https://kubernetes.io/ja/ Kubernetes]==
{{amazon|4873118409}}
{{amazon|B07HFS7TDT}}*https://kubernetes.io/ja/*コンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するプラットフォーム(コンテナオーケストレーションエンジン)
*https://knowledge.sakura.ad.jp/20955/
*信頼性が高くスケーラブルな分散システムを上手に構築してデプロイするために必要なソフトウェアを提供
**Microsoft:Azure Container Ser[[vi]]ce
**Google:Google [[Kubernetes]] Engine
==minikube==*[https://githubkubernetes.comio/ja/docs/kubernetesreference/kubectl/minikube*ローカル開発や学習、テスト用のシンプルな[[Kubernetes]]シュミレータ*シングルノードクラスタで、インストールには、ローカルマシンにハイパーバイザーがインストールされていること*VT-xcheatsheet/AMD-v [[仮想化チートシート]]がBIOSで有効化されていること。===*[https://kubernetes.io/ja/docs/setupreference/learning-environmentkubectl/minikubecheatsheet/ Minikubeを使用してローカル環境でKubernetesを動かすチートシート]===インストールコンポーネント構成===*https://kubernetes.io/docs/tasksconcepts/overview/components/*https://www.slideshare.net/toolsyokawasa/installistio-minikube114360124 から引用[[File:kubernetes_component.png|600px]] ===宣言的なコードによる管理===*[[YAML]]やJSONの宣言的なマニフェストで、コンテナやリソースを管理できる===スケーリング/オートスケーリング===*コンテナクラスタを形成して、複数のKubernetes Nodeを管理できる===スケジューリング===*コンテナを Kubernetes Nodeにデプロイする際に、どのNodeに配置するかを決定するスケジューリングというステップがある*コンテナのワークロードの特徴、Kubernetes Nodeの性能差を意識してスケジューリングを行うことができる===リソース管理===*コンテナ配置に特別指定がない場合、自動スケジューリングが行われるため、管理する必要がない*オートスケール機能により、Kubernetesクラスタの、Kubernetes Nodeの増減も自動で行われる===セルフヒーリング===*標準でコンテナのプロセス管理を行っており、プロセス停止を検知すると、再度コンテナのスケジュールを行うことで自動的にコンテナを再デプロイする*プロセス監視以外にも、HTTP・TCPや、シェルスクリプトによるヘルスチェックも可能===サービスディスカバリーとロードバランシング===*ロードバランシング機能(Service)を持っており、事前に指定した条件に合致するコンテナ群に対してルーティングを行う機能を提供する*コンテナスケール時や、障害時のサービスへの追加、切り離しも自動で行うため、エンドポイント管理をKubernetesに任せることが可能*コンテナを使用したシステム構築では、マイクロサービスアーキテクチャ採用が一般的、マイクロサービスが相互参照するために、サービスディスカバリー機能が有用*マイクロサービスを定義されたマニフェストを元にシステム全体を連携させることが可能===データ管理===*バックエンドのデータ管理にetcdを利用している ==基礎==*Kubernetes は、Kubernetes Master と Kubernetes Node の2種類のノードからから成り立っている*Kubernetes Master は、APIエンドポイントの提供コンテナのスケジューリング、コンテナのスケーリングなどを担う*Kubernetes Node は、Docker ホストに相当し実際にコンテナが稼働するノード*Kubernetes クラスタを操作するには、kubectl と [[YAML]] か JSON 形式のマニフェストファイルを用いて、Kuebrnetes Masterにリソースの登録を行う*kubectlは、マニフェストファイルの情報を元にKubernetes MasterのAPIにリクエストを送り、Kubernetesの操作を行う*Kubernetes の API は一般的な RESTful API として実装されている ==構成=====クラスタ===*Kubernetesクラスターは以下の2種類のリソースで構成**マスターがクラスターを管理する、マスターはクラスターの管理を担当**ノードがアプリケーションを動かすワーカーとなる、ノードは、Kubernetesクラスターのワーカーマシンとして機能するVMまたは物理マシン====Kubelet====*各ノードにはKubeletがあり、これはノードを管理し、Kubernetesマスターと通信するためのエージェント ====デプロイ====Kubernetesにアプリケーションをデプロイするときは、#マスターにアプリケーションコンテナを起動するように指示#マスターはコンテナがクラスターのノードで実行されるようにスケジュール#ノードは、マスターが公開しているKubernetes APIを使用してマスターと通信##エンドユーザーは、Kubernetes APIを直接使用して対話することもできます    ====Kubernetes とリソース====*Kubernetesでは、リソースを登録することで、コンテナの実行やロードバランサの作成が非同期に行われる
==Workloadsリソース==Ubuntu + 仮想環境*クラスタ上にコンテナを起動するために利用する*内部的に利用されているものをのぞき、直接操作するものとしては、以下のリソースがある**Pod**ReplicationController**ReplicaSet**Deployment**DaemonSet**StatefulSet**Job**CronJob===Pod===*Workloadsリソースの最小単位*一つ以上のコンテナから構成され、ネットワーク的に隔離されておらず、IPアドレスを共有する*2つのコンテナが入ったPodを作成した場合、同一IPアドレスを持ち、お互い、localhostで通信できる*[https://www.typea.info/blog/index.php/2020/08/22/ubuntu-kvm-bridge-network/ Ubuntu 仮想環境(KVM)構築]多くの場合は、1つのPodに1つのコンテナを含めるが、補助するサブコンテナを複数含めることもある
==Discovery & LBリソース==入手*コンテナサービスディスカバリやクラスタの外部からもアクセス可能なエンドポイントなどを提供する*利用者が直接利用するものとしては、Service と Ingress があり、Serviceは複数タイプが用意されている*Service{| class="wikitable"|-! scope="col"| Service! 内容|-| ClusterIP| |-| ExternalIP (ClusterIPの一種)| |-| NodePort| |-| LoadBalancer| |-| Headless (None)| |-| ExternalName| |-| None-Selector| |-|}*Ingress===KubernetesクラスタのネットワークとService=======Kubernetesが構成するネットワーク====*Pod内には複数のコンテナを内包できるが、同じPodであれば、同一IPが割り振られている*同一Podコンテナへ通信を行う場合は、localhostあてに通信を行い、Podのコンテナから別Podコンテナへ通信を行う場合には、PodのIPアドレス宛に通信を行う*Kubernetesクラスタは、クラスタを構成するとノードにPodのための内部ネットワークを自動的に構成する*基本的にはノードごとに異なるネットワークセグメントを互いに通信できるよう構成する*このような内部ネットワークが自動構成されるため、PodはServiceを利用しなくてもPod間通信を行うことが可能====Serviceを利用することによるメリット====*Podあてトラフィックのロードバランシング*サービスディスカバリとクラスタ内DNS*これらは、上記のどのService Typeからも利用できる====Pod宛トラフィックのロードバランシング====*Serviceは、複数のPodにロードバランシングを行う*Serviceを利用すると、各PodのIPを毎回調べたり、宛先を設定するなど独自に実現しなくても、自動的に構成することができる*Serviceは、ロードバランシングのエンドポイントも提供する**外部ロードバランサーが払い出す仮想IP(Virtual IPアドレス)、クラスタ内のみで利用可能な仮想IPアドレス(ClusterIP)など ==Config & Storage リソース==*設定や機密データをコンテナに埋め込んだり、永続ボリュームを提供する*Secret と ConfigMap は Key-Value のデータ構造を持ち保存データが機密か一般化によって使い分ける*Secret*ConfigMap*PersistentVolumeClaim ==Cluster リソース==*クラスタ自体の振る舞いを定義*Node*Namespace*PersistentVolume*ResourceQuote*ServiceAccount*Role*ClusterRole*RoleBinding*ClusterRoleBinding*NetworkPolicy ==Metadataリソース==*クラスタ内の他のリソースの動作を制御する*LimitRange*HorizontalPodAutoscaler*PodDisruptionBudget*CustomResourceDefinition==[[Minikube]]==*[[Minikube]] ==[[MicroK8s]]==*[[MicroK8s]]==[[Kubectl]]==*[[Kubectl]] ==[https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/namespaces/ Namespace]==*Kubernetesは、同一の物理クラスター上で複数の仮想クラスターの動作をサポートします。 この仮想クラスターをNamespaceと呼びます*作成:kubectl create namespace <名称>*削除:kubectl delete namespace <名称>
<pre>
$ curl kubectl create namespace samplenamespace/sample created$ kubectl get namespacesNAME STATUS AGEkube-system Active 66dkube-Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikubepublic Active 66dkube-linuxnode-amd64lease Active 66ddefault Active 66d$ sudo +x minkubesample Active 4s
</pre>
==[https://kubernetes.io/ja/docs/concepts/workloads/pods/ Pod]==インストール*https://kubernetes.io/ja/docs/concepts/workloads/pods/*同じ実行環境上で動くアプリケーションコンテナとストレージボリュームの集まりのこと*Kubernetesクラスタ上では、コンテナではなくPodがデプロイの最小単位*1つのPodないのコンテナは全て同じマシン上に配置される*同じPod内のアプリケーションは、ネイティブなプロセス間通信チャネルで通信できるが、異なるPodのアプリケーションからは分離されている===Pod単位で考える===*WordPressとMySQLを同じPodに入れれば良いと考えるのはアンチパターンの1つ*それぞれ別マシンで通信できればよく、WordPressとDBが同じ単位としてスケールする可能性も低い*WordPress自体はステートレスなため、負荷が増大した場合、WordPressのPodを増やしてスケールさせれば良い*通常は、Podを作る際に、コンテナが異なるマシンに配置されても正常に動作するかという点が判断基準 ===設定===*設定を行う箇所は、clusters,contexts,users*[[YAML]] もしくは JSONフォーマット*直接編集するだけでなく、kubectlから変更も可能*https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#pod-v1-core<pre>apiVersion: v1clusters:- cluster: certificate-authority: /home/piroto/.minikube/ca.crt server: https://192.168.39.214:8443 name: minikubecontexts:- context: cluster: minikube user: minikube name: minikubecurrent-context: minikubekind: Configpreferences: {}users:- name: minikube user: client-certificate: /home/piroto/.minikube/profiles/minikube/client.crt client-key: /home/piroto/.minikube/profiles/minikube/client.key</pre>===マニフェストとリソースの作成===*sample-pod.yaml
<pre>
apiVersion: v1kind: Podmetadata: name: sample-podspec: containers: - name: nginx-container image: nginx:1.12</pre>====実行====*apply コマンドを利用すると、存在しなければ生成、更新があれば更新、変更なければ何もしないという挙動<pre>$ sudo install minikube kubectl create -f sample-pod.yaml pod/usrsample-pod created</localpre>*確認<pre>$ kubectl get podNAME READY STATUS RESTARTS AGEsample-pod 1/bin1 Running 0 42s
</pre>
===利用===<pre>====ローカルクラスタの作成====*ローカル仮想マシンを作成*[[Kubernetes]]を設定*kubectlを設定 &gt; minikube start*VirtualBox[[File:0753_minikube$ kubectl apply -f sample-pod.png|400px]]yaml *Ubuntu+KVMpod/sample-pod configured[[File:Minikube_kvm.png|400px]]</pre>
====停止アノテーションとラベル===*各リソースに対してアノテーションとラベルというメタデータを付与することができる{| class="wikitable"!名称!概要|-|アノテーション|システムコンポーネントが使用するメタデータ.アノテーションを元に処理するシステムコンポーネントが存在しない場合は単なるメモ|-|ラベル|リソース管理に利用するメターデータ.リソースを分別するための情報|}*ユーザーがアノテーションを付与せず作成したリソースでも、下記のように様々なアノテーションが付与される<pre> &gt; $ kubectl get deployments -o yaml hello-minikube stop====クラスタを削除====apiVersion: apps/v1kind: Deploymentmetadata: annotations: deployment.kubernetes.io/revision: "1" creationTimestamp: "2020-08-22T08:02:54Z" :</pre>*アノテーションとラベルをマニフェストに追記<pre>apiVersion: v1kind: Podmetadata: name: sample-pod annotations: annotation1: val1 annotation2: val2 labels: label1: lab1 label2: lab2spec: containers: - name: nginx-container image: nginx:1.19 &gt; minikube delete</pre>
==[[Kubernetes]]クライアント==*表示の拡張<pre>$ kubectl get pod --output wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESsample-pod 1/1 Running 2 24h 172.17.0.3 minikube <none> <none>*公式なクライアントは、kubectl</pre>*kubectlを使用してクラスターと対話できるようになりますダッシュボードに表示された*[[KubernetesFile:Kubernetes_label.png|600px]] APIと連携するコマンドラインツール*minikube から利用する場合 &gt; minikube kubectl version
===クラスタのステータス=Podの削除==== &gt;minikube <pre>$ kubectl versiondelete -f sample-pod.yaml Client Version: version.Info{Major:pod "1sample-pod", Minor:"15", [[Git]]Versiondeleted</pre>===2つのコンテナを内包したPod===*マニフェスト sample-2pod.yaml<pre>apiVersion:"v1.15.0", [[Git]]Commitkind:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", [[Git]]TreeStatePodmetadata:"clean", BuildDate name:"2019sample-062podspec: containers: -19T16name:40nginx-container image:16Z", GoVersionnginx:"go11.12.5", Compiler19 - name: radis-container image:"gc", Platformredis:"windows6.0.7</amd64"}pre>*適用<pre> Server Version: version$ kubectl apply -f sample-2pod.Info{Major:"1", Minor:"15", [[Git]]Version:"v1yaml pod/sample-2pod created</pre>*結果確認<pre>$ kubectl get pod --output wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESsample-2pod 2/2 Running 0 7m40s 172.1517.0", [[Git]]Commit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", [[Git]]TreeState:"clean", BuildDate:"2019.6 minikube <none> <none>sample-06-19T16:32:14Z", GoVersion:"go1pod 1/1 Running 2 2d 172.17.120.5", Compiler:"gc", Platform:"linux3 minikube <none> <none></amd64"}pre>
===コンテナへのログインとコマンド実行===*クラスタを構成しているコンポーネントを確認-t 疑似端末(TTY)を生成し、-i 標準入力をコンテナに渡す &gt; minikube kubectl get componentstatuses * /bin/bashコマンドを実行する NAME STATUS MESSAGE E[[R]][[R]]O[[R]]<pre> controller$ kubectl exec sample-pod -i -t --manager Healthy ok/bin/bash scheduler Healthy ok etcdroot@sample-0 Healthy {"health"pod:"true"}/# </pre>
==[https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/ ReplicaSet]==ワーカーノードの表示===*https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/*Podのレプリカを作成するリソース*レプリカ数=3でスケールさせたReplicaSet<pre>apiVersion: apps/v1kind: ReplicaSetmetadata: name: sample-rsspec: replicas: 3 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx-container image: nginx:1.19 ports: - containerPort: 80</pre>*作成<pre>$ kubectl apply -f sample-rs.yaml replicaset.apps/sample-rs created</pre>*確認*kubectl get nodes*Podが3つ起動していることが確認できる<pre> &gt; minikube $ kubectl get nodespods --output wide NAME READY STATUS RESTARTS [[R]]OLES AGE IP NODE NOMINATED NODE VE[[R]]SIONREADINESS GATES sample-2pod 2/2 Running 0 26h 172.17.0.6 minikube [[R]]eady <none> <none>sample-pod 1/1 Running 2 3d2h master 172.17.0.3 minikube 36m <none> <none>sample-rs-9gxzs v11/1 Running 0 3m14s 172.17.0.7 minikube <none> <none>sample-rs-nsn86 1/1 Running 0 3m14s 172.17.0.9 minikube <none> <none>sample-rs-wcjsv 1/1 Running 0 3m14s 172.1517.0.8 minikube <none> <none></pre>*ダッシュボードで確認[[File:kubernetes_replicaset.png|600px]]
==[https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/ Deployment]==ノードの詳細情報====*https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/*複数のReplicaSetを管理することで、ローリングアップデートやロールバックを実現するリソース*Kubernetesで最も推奨されるコンテナの起動方法*1つのコンテナでもDeploymentを使用すべき*Deploymentは新しいバージョンのリリースを管理する仕組み*デプロイされたアプリケーションをバージョンをまたいで表現する**Pod単体では自動で再起動されないし、ReplicaSetでは、ローリングアップデートが利用できない**PodもReplicaSetも変更されないコンテナイメージを取り扱うために作られている*フロー*#新しいReplicaSetを作成*#新しいReplicaSetのPod数を徐々に増やす*#古いReplicaSetのPod数を徐々に減らす*#上記を繰り返す*#古いReplicaSetのレプリカ数を0で保つ<pre>apiVersion: apps/v1kind: Deploymentmetadata: name: sample-deployspec: replicas: 3 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx-container image: nginx:1.19 ports: - containerPort: 80</pre>*作成<pre>$ kubectl describe nodes [ノード名]apply -f sample-deploy.yaml deployment.apps/sample-rs created</pre>
=====基本情報が最初に表示される===== Name: minikube [[R]]oles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=minikube kubernetes.io/os=linux node-role.kubernetes.io/master= Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Mon, 05 Aug 2019 23:17:24 +0900 Taints: &lt;none&gt; Unschedulable: false=====ノード上で動いているオペレーションの情報が表示される=====*それぞれのノードが十分なディスクとメモリを持っているか確認(Pod)*Kubernatesマスターに対して正常であるか<pre> Conditions: Type Status LastHeartbeatTime LastTransitionTime [[R]]eason Message ---- ------ ----------------- ------------------ ------ -----$ kubectl get pod --output wideNAME READY STATUS MemoryPressure RESTARTS False AGE Tue, 13 Aug 2019 01:01:05 +0900 Mon, 05 Aug 2019 23:17:15 +0900 KubeletHasSufficientMemory IP NODE NOMINATED NODE kubelet has sufficient memory availableREADINESS GATES DiskPressure False sample-deploy-5cc5cfccd7-6vq65 Tue, 13 Aug 2019 01:01:05 +0900 Mon, 05 Aug 2019 23:17:15 +0900 KubeletHasNoDiskPressure 1/1 kubelet has no disk pressure PIDPressure False Running Tue, 13 Aug 2019 01:01:05 +0900 0 33s Mon, 05 Aug 2019 23:172.17:15 +0900 KubeletHasSufficientPID kubelet has sufficient PID available [[R]]eady True Tue, 13 Aug 2019 01:01:05 +0900 Mon, 05 Aug 2019 23:17:15 +0900 Kubelet[[R]]eady kubelet is posting ready status Addresses: InternalIP: 10.0.2.15 Hostname: 6 minikube=====マシンのキャパシティ情報の表示===== Capacity: cpu: 2<none> <none> ephemeralsample-deploy-storage: 17784772Ki hugepages5cc5cfccd7-2Mi: 0qjtbx memory: 2038624Ki1/1 Running pods: 110 Allocatable:0 33s cpu: 2 ephemeral-storage: 16390445849 hugepages-2Mi: 172.17.0.7 memory: 1936224Kiminikube pods: 110=====ノード上のソフトウェアバージョンの表示===== System Info:<none> <none> [[Mac]]hine ID: 7ec5a55cfdc14693866eccf4e9a1228f System UUID: 2C88347Dsample-32CCdeploy-4F265cc5cfccd7-9AEE-1FED259A233Cszcx5 1/1 Running Boot ID: 1da81daa-4519-4f04-afe0-64efecedd7e70 33s Kernel Version: 4172.1517.0 OS Image: Buildroot 2018.05.3 Operating System: minikube <none> linux Architecture: amd64<none> Container [[R]]untime Version: docker:<//18.9.6pre> Kubelet Version: v1.15.0 Kube-Proxy Version: v1.15.0=====ノード上で動いているPod情報の表示===== Non-terminated Pods: *確認(9 in totalReplicaSet) Namespace Name CPU [[R]]equests CPU Limits Memory [[R]]equests Memory Limits AGE<pre> --------- ---- ------------ ---------- --------------- ------------- -$ kubectl get replicaset --output wide kube-system coredns-5c98db65d4-j24hp 100m (5%) NAME DESIRED CURRENT READY AGE 0 (0%) 70Mi (3%) CONTAINERS 170Mi (8%) 7d1hIMAGES SELECTOR kubesample-system corednsdeploy-5c98db65d4-phtm8 100m (5%) 0 (0%) 70Mi (5cc5cfccd7 3%) 170Mi (8%) 7d1h kube-system etcd-minikube 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d1h kube-system kube-addon-manager-minikube 3 5m (0%) 3 0 (0%) 50Mi (2%) 0 (0%) 7d1h kube2m34s nginx-system kube-apiserver-minikube 250m (12%) 0 (0%) 0 (0%) 0 (0%) 7d1h kube-system kube-controller-manager-minikube 200m (10%) 0 (0%) 0 (0%) 0 (0%) 7d1h kube-system kube-proxy-wrgp5 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d1h kube-system kube-scheduler-minikube 100m (5%) 0 (0%) 0 (0%) 0 (0%) 7d1h kube-system storage-pro[[vi]]sioner 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d1h Allocated resourcescontainer nginx: (Total limits may be over 100 percent, i.e., overcommitted1.) [[R]]esource [[R]]equests Limits -------- -------- ------ cpu 755m (37%) 19 0 (0%) memory 190Mi (10%) 340Mi (17%) ephemeral-storage 0 (0%) 0 (0%) Events: Type [[R]]eason Age From Message ---- ------ ---- ---- ------- Normal NodeHasSufficientMemory 7d1h (x8 over 7d1h) kubelet, minikube Node minikube status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 7d1h (x8 over 7d1h) kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 7d1h (x7 over 7d1h) kubelet, minikube Node minikube status is now: NodeHasSufficientPID Normal Starting 7d1h kubeapp=sample-proxyapp, minikube Starting kubepod-proxy. Normal Starting 12m kubelet, minikube Starting kubelet. Normal NodeHasSufficientMemory 12m (x8 over 12m) kubelet, minikube Node minikube status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 12m (x8 over 12m) kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 12m (x7 over 12m) kubelet, minikube Node minikube status is now: NodeHasSufficientPID Normal NodeAllocatableEnforced 12m kubelet, minikube Updated Node Allocatable limit across pods Normal Starting 11m kube-proxy, minikube Starting kubetemplate-proxy===クラスタのコンポーネント==hash=5cc5cfccd7*[[Kubernetes]]クラスタを構成する多くのコンポーネントが、[[Kubernetes]]自体を使ってデプロイされる*kube-system Namesspace内で動作====[[Kubernetes]] proxy====*クラスタ内のロードバランスされたSer[[vi]]ceにネットワークトラフィックをルーティング*クラスタ内の各ノードで動いている必要がある*DaemonSetというAPIオブジェクトが多くのクラスタではノードでプロキシを動作させるために利用される</pre>
*ダッシュボード[[File:kubernetes_deployment.png|600px]] ==kubectlコマンド[https://kubernetes.io/ja/docs/concepts/workloads/controllers/daemonset/ DaemonSet]==*https://kubernetes.io/ja/docs/concepts/workloads/controllers/daemonset/*ReplicaSetでは、Podの数が一致するとも確実に配置されるとも保証されない*DaemonSetは、ReplicaSetの特殊な形、各ノードにPodを一つづつ配置するリソース*各ノード上で必ず動作させたいプロセスのために利用することが多い <pre>apiVersion: apps/v1kind: DaemonSetmetadata: name: sample-dsspec: selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx-container image: nginx:1.19</pre>*作成<pre>$ kubectl apply -f sample-ds.yaml daemonset.apps/sample-ds created</pre>*確認<pre>$ kubectl get daemonset --output wideNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTORsample-ds 1 1 1 1 1 <none> 98s nginx-container nginx:1.19 app=sample-app</pre> ==Namespace[https://kubernetes.io/ja/docs/concepts/workloads/controllers/statefulset/ StatefulSet]==*https://kubernetes.io/ja/docs/concepts/workloads/controllers/statefulset/*データベースなどステートフルなワークロードに対応するためのリソース*ReplicaSetの特殊な形**作成されるPodのサフィックスは数字のインデックスが付与**データを永続化する仕組みを持つ**Pod名が変わらない<pre>apiVersion: apps/v1kind: StatefulSetmetadata: name: webspec: selector: matchLabels: app: sample-app serviceName: sample-stateful replicas: 3 template: metadata: labels: app: sample-app spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx:1.19 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: - ReadWriteOnce resources: requests: storage: 1G</pre>*作成<pre>$ kubectl apply -f sample-stateful.yaml statefulset.apps/web created</pre>*確認<pre>$ kubectl get statefulset --output wideNAME READY AGE CONTAINERS IMAGESweb 0/3 2m19s nginx nginx:1.19</pre><q>running "VolumeBinding" filter plugin for pod "web-0": pod has unbound immediate PersistentVolumeClaims</q>*https://qiita.com/silverbirder/items/d3522237b28703a9adb6*PersistentVolumeは、データを永続的に保存しておく場所のリソース。マネージドサービスを利用すると、デフォルトでPresistentVolumeが用意されている*PersistentVolumeClaimsは、「PresistentVolumeを使わせて」というリソース*PresistentVolumeのnameを指定し、applyすることで、初めてマウントができる <pre>$ kubectl get pvNo resources found in default namespace.</pre> ==[https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/ 永続ボリューム(PersistentVolume)]==*https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/*ストレージが何から提供されているか、どのように消費されているかをユーザーと管理者から抽象化するAPIを提供===PersistentVolume(PV)===*ストレージクラスを使って管理者もしくは動的にプロビジョニングされるクラスターのストレージの一部*Nodeと同じようにクラスターリソースの一部*PVを使う個別のPodとは独立したライフサイクルを持っている===PersistentVolumeClaim(PVC)===*ユーザーによって要求されるストレージ*Podと似ています。PodはNodeリソースを消費し、PVCはPVリソースを消費します*クレームは特定のサイズやアクセスモード(例えば、1ノードからのみ読み書きマウントができるモードや、複数ノードから読み込み専用マウントができるモードなどです)を要求することができます===実例===*https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/====index.htmlをノード上に生成====<pre>$ minikube ssh$ sudo mkdir /mnt/data$ sudo sh -c "echo 'Hello from kubernetes storage' > /mnt/data/index.html"$ cat /mnt/data/index.htmlHello from kubernetes storage</pre>====PersistentVolumeの生成====*ホストパスのPersistentVolumeを作成*Kubernetesは単一クラスターで、ホストパスを開発とテストでサポートする*ホストパスPersistentVolumeは、ファイルやディレクトリをネットワークアタッチストレージをエミュレートしたものとして使用する*プロダクションのクラスターでは、ホストパスは使用すべきでなく、クラスタ管理者により、用意されたネットワークリソース(Google Compute Engine persistent disk) などを使用する*クラスタ管理者は、StorageClassesも動的プロビジョニングに使用することができる*クラスタ内のオブジェクトを構造化ホストパスPersistentVolumeの例<pre>apiVersion: v1kind: PersistentVolumemetadata: name: sample-pv labels: type: localspec: storageClassName: manual capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data"</pre>*kubectlはデフォルトではdefaultというNamespaceとやり取り生成<pre>$ kubectl apply -f sample-pv.yaml persistentvolume/sample-pv created</pre>*確認<pre>$ kubectl get pv --namespace で指定できるoutput wideNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODEsample-pv 1Gi RWO Retain Available manual 12s Filesystem</pre>===Context=PersistentVolumeClaimの作成====<pre>apiVersion: v1kind: PersistentVolumeClaimmetadata: name: sample-pvcspec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 1Gi</pre>*デフォルトのNamespaceを恒久的に変更したい場合生成<pre>$ kubectl apply -f sample-pvc.yaml persistentvolumeclaim/sample-pvc created</pre>*確認<pre>$HOMEkubectl get pvc --output wideNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODEsample-pvc Bound sample-pv 1Gi RWO manual 52s Filesystem</pre> ==[[Docker]]==*[[Docker]]*[[Docker コマンド]]*[[Docker ネットワーク]]===Dockerデーモンの再利用によるローカルイメージの使用===*[https://kubernetes.kubeio/ja/docs/config に保存されるsetup/learning-environment/minikube/#docker%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E3%81%AE%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%BF%E7%94%A8 Dockerデーモンの再利用によるローカルイメージの使用]*Mac/LinuxのホストでDockerデーモンを操作できるようにするには、minikube docker-envを実行*MinikubeのVM内のDockerデーモンと通信しているホストのMac/LinuxマシンのコマンドラインでDockerを使用できるようになる<pre>$ minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.39.214:2376"export DOCKER_CERT_PATH="/home/piroto/.minikube/certs"export MINIKUBE_ACTIVE_DOCKERD="minikube" # To point your shell to minikube's docker-daemon, run:# eval $(minikube -p minikube docker-env)</pre> <pre>$ docker psGot permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied</pre>*https://tech.librastudio.co.jp/entry/index.php/2018/07/14/post-1924/<pre>$ sudo groupadd docker$ sudo gpasswd -a `id -un` docker$ sudo chgrp docker /var/run/docker.sock </pre> <pre>$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</pre> https://hub.docker.com/ ==Tips==*[[KubernetesWSL|WSL2でKubernetes/Dockerを動かす]] APIオブジェクトの参照  ===クイックスタート===*https://kubernetes.io/ja/docs/setup/learning-environment/minikube/<pre>piroto@jinmu:~$ kubectl get nodeNAME STATUS ROLES AGE VERSIONminikube Ready master 14m v1.18.3piroto@jinmu:~$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10deployment.apps/hello-minikube createdpiroto@jinmu:~$ kubectl get podNAME READY STATUS RESTARTS AGEhello-minikube-64b64df8c9-42s98 0/1 ContainerCreating 0 11spiroto@jinmu:~$ kubectl expose deployment hello-minikube --type=NodePort --port=8080service/hello-minikube exposedpiroto@jinmu:~$ minikube service hello-minikube --urlhttp://192.168.39.238:30523</pre>*ローカル環境のクラスターについて詳細を確認するには、出力から得たURLをブラウザー上でコピーアンドペースト[[File:Kubernetesquick start 01.png|600px]]上にあるものは、すべてRESTFulリソースであらわされる*Service,Deploymentの削除、クラスター停止、クラスター削除<pre>piroto@jinmu:~$ kubectl delete services hello-minikubeservice "hello-minikube" deletedpiroto@jinmu:~$ kubectl delete deployment hello-minikubedeployment.apps "hello-minikube" deletedpiroto@jinmu:~$ minikube stop ノード "minikube" を停止しています... 1台のノードが停止しました。piroto@jinmu:~$ minikube delete kvm2 の「minikube」を削除しています... クラスタ "minikube" の全てのトレースを削除しました。</pre>===NodeでHello World===*https://kubernetes.io/ja/docs/tutorials/hello-minikube/

案内メニュー