こちらの本を読み進めてました。
しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
- 作者: 阿佐志保,真壁徹
- 出版社/メーカー: 翔泳社
- 発売日: 2019/01/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
今回は、コマンドとか叩きつつ、kubernetesの動作の確認を中心に勉強していきます。
実践
リソースに対するオペレーション
Kubernetesでは、Kubernetesシステムに対しマニフェストファイルを適用・変更・削除することで、Kubernatesクラスタのあるべき姿の定義を変更します。 そして、そのあるべき姿の定義に沿うようにリソースが作成されます。
イメージはこんな感じです。
適用・変更のときは
kubectl apply -f hoge.yaml
削除のときは
kubectl delete -f hoge.yaml
といった具合で適用していきます。
Pod
k8sのドキュメントとしてはPodはこう説明されています。
Pods are the smallest deployable units of computing that can be created and managed in Kubernetes. PodはKubernetesにおいて構築・管理できるデプロイの最小単位です。
(引用: https://kubernetes.io/docs/concepts/workloads/pods/pod/ )
また、チュートリアルではこんな感じに書いてあります。
Podは、1つ以上のアプリケーションコンテナ(Dockerやrktなど)のグループとそれらのコンテナの共有リソースを表すKubernetesの抽象概念です。 Podには以下のものが含まれます:
- 共有ストレージ(ボリューム)
- ネットワーキング(クラスタに固有のIPアドレス)
- コンテナのイメージバージョンや使用するポートなどの、各コンテナをどう動かすかに関する情報
Podは、Kubernetesプラットフォームの原子単位です。 Kubernetes上にDeploymentを作成すると、そのDeploymentはその中にコンテナを持つPodを作成します(コンテナを直接作成するのではなく)。 各Podは、スケジュールされているNodeに関連付けられており、終了(再起動ポリシーに従って)または削除されるまでそこに残ります。 Nodeに障害が発生した場合、同じPodがクラスタ内の他の使用可能なNodeにスケジュールされます。
(引用:https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/ )
要するに、Kubernetesにおける最小実行単位がPodです。設定はこんな感じのyamlになります。
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busybox:1.28 command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] - name: init-mydb image: busybox:1.28 command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
ReplicaSet
k8sのドキュメントとしてはReplicaSetはこう説明されています。
A ReplicaSet’s purpose is to maintain a stable set of replica Pods running at any given time. As such, it is often used to guarantee the availability of a specified number of identical Pods.
レプリカセットの目的は、与えられた稼働時間中においてPodの複製品を安定稼働させることです。そんなわけで、指定された数のPodの可用性を保証するために用いられます。
(引用:https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/ )
和訳間違ってたらごめんなさい。
上の話を見る限り、ReplicaSetは安定的に稼働させたい数のPodを指定したいときに使います。
例を見てみるとこんな感じに書くそうです。( ReplicaSet - Kubernetes)
apiVersion: apps/v1 kind: ReplicaSet metadata: name: frontend labels: app: guestbook tier: frontend spec: # modify replicas according to your case replicas: 3 selector: matchLabels: tier: frontend template: metadata: labels: tier: frontend spec: containers: - name: php-redis image: gcr.io/google_samples/gb-frontend:v3
ポイントはreplica: 3とあるところです。 これでtemplate以下で定義した構成のPodを常に3つ起動させるように定義しています。
Deployment
A Deployment controller provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment, and the Deployment controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments.
デプロイメントコントローラはPod/ReplicaSetの宣言的更新の機能を提供します。 あるべきデプロイメントを記述すると、デプロイメントコントローラは実際の状態を指定された"あるべき状態"に変更します。 新しいReplicaSetを作成するように定義することもできれば、既存のデプロイメントを削除してすべてのデプロイメントを新しいものと置き換えることもできます。
(引用: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ )
和訳間違ってたらごめんなさい。結構なんちゃって翻訳です。
ReplicaSetやPodをどうやってデプロイするかを指定するのがDeploymentリソースってイメージです。
例を見てみるとこんな感じに書くそうです。(https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
deploymentは前もやりましたが、世代管理ができることを除けば、マニフェストファイルはReplicaSetとさして変わりませんね。
感想
当たり前ですが、Kubernetes専門の本なので結構細かく書いてありますね。 細かい内容については、ぜひ本を購入して読んでみてください!