どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

【読んでみた】しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識(その2:動かす)

こちらの本を読み進めてました。

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

今回は、コマンドとか叩きつつ、kubernetesの動作の確認を中心に勉強していきます。

実践

リソースに対するオペレーション

Kubernetesでは、Kubernetesシステムに対しマニフェストファイルを適用・変更・削除することで、Kubernatesクラスタのあるべき姿の定義を変更します。 そして、そのあるべき姿の定義に沿うようにリソースが作成されます。

イメージはこんな感じです。

f:id:nogawanogawa:20190814221035j:plain:w350

適用・変更のときは

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専門の本なので結構細かく書いてありますね。 細かい内容については、ぜひ本を購入して読んでみてください!