AKS で Label / Namespace を定義する

今回は YAML 定義ファイルを色々いじってみて、以下2点を実施してみようと思います。
①Labels の定義、編集
②Namespace の定義によるリソースの分離
※前回の記事までの環境が構築されていることが前提としています。

#マニュフェストファイルの操作(前回復習)
前回の記事までには、マニュフェストファイルの適用を `kubectl apply -f XXXXXXX.yaml` で実施し、Web Server にアクセスすることができました。前回のものがそのままかどうかは、`kubectl get pod` で確認することが出来ます。

```
miyasaka@Azure:~/Understanding-K8s/chap04$ kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
photoview-deployment-XXXXXXXXX-2b6h4   1/1     Running   0          10m
photoview-deployment-XXXXXXXXX-6xp4t   1/1     Running   0          10m
photoview-deployment-XXXXXXXXX-b94dh   1/1     Running   0          10m
photoview-deployment-XXXXXXXXX-fc4pv   1/1     Running   0          10m
photoview-deployment-XXXXXXXXX-lwsbj   1/1     Running   0          10m
```

今回はこの マニュフェストファイルで作成した Pod を使用しないので、以下コマンドを実施し、割り振られたリソースを削除しておきます。

```
kubectl delete -f tutorial-development.yaml
kubectl delete -f tutorial-service.yaml
```

正しくリソースの削除ができると、デフォルトで設定されている Namespace 内のリソースがなくなります。

```
miyasaka@Azure:~/Understanding-K8s/chap03$ kubectl get pod
No resources found in default namespace.
```

ここまでで下準備は完了です。

#Label 定義、編集
次の動作では、ラベルを定義したリソースをマニュフェストファイルから作成します。
以下 YAML ファイルを任意のディレクトリに作成しましょう。

```labelsample.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-1
  labels:
    env: test
    app: photo-view
spec:
  containers:
  - image: nginx
    name: photoview-container
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-2
  labels:
    env: test
    app: imagetrain
spec:
  containers:
  - image: nginx
    name: photoview-container
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-3
  labels:
    env: test
    app: prediction
spec:
  containers:
  - image: nginx
    name: photoview-container
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-4
  labels:
    env: stage
    app: photo-view
spec:
  containers:
  - image: nginx
    name: photoview-container
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-5
  labels:
    env: stage
    app: imagetrain
spec:
  containers:
  - image: nginx
    name: photoview-container
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-6
  labels:
    env: prod
    app: photo-view
spec:
  containers:
  - image: nginx
    name: photoview-container
```

このマニュフェストファイルでは、`nginx-pod-1` ~ `nginx-pod-6` というリソースを作成しています。その中で、以下の部分でリソースごとにラベルを定義しています。

```
  labels:
    env: test
    app: photo-view
```

実際にこのマニュフェストファイルを適用してみます。適用するには、`kubectl apply -f labelsample.yaml` を実行します。適用できたら、`kubectl get pod` で状況を確認します。

```
NAME          READY   STATUS    RESTARTS   AGE
nginx-pod-1   1/1     Running   0          12s
nginx-pod-2   1/1     Running   0          12s
nginx-pod-3   1/1     Running   0          12s
nginx-pod-4   1/1     Running   0          12s
nginx-pod-5   1/1     Running   0          12s
nginx-pod-6   1/1     Running   0          11s
```
これだけでは Labels が見れないので、`kubectl get pod --show-labels` というようにオプションを設定して表示させます。

```
NAME          READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod-1   1/1     Running   0          2m58s   app=photo-view,env=test
nginx-pod-2   1/1     Running   0          2m58s   app=imagetrain,env=test
nginx-pod-3   1/1     Running   0          2m58s   app=prediction,env=test
nginx-pod-4   1/1     Running   0          2m58s   app=photo-view,env=stage
nginx-pod-5   1/1     Running   0          2m58s   app=imagetrain,env=stage
nginx-pod-6   1/1     Running   0          2m57s   app=photo-view,env=prod
```

これで Label が定義されたリソースがデプロイされていることが分かります。Labels はあとからリソースを検索したり指定したりする際に便利です。例えば `app=photo-view` と定義されているもののみを検索して表示する際には、`-l` オプションを使います。

```
$ kubectl get pod -l app=photo-view
NAME          READY   STATUS    RESTARTS   AGE
nginx-pod-1   1/1     Running   0          5m29s
nginx-pod-4   1/1     Running   0          5m29s
nginx-pod-6   1/1     Running   0          5m28s
```

このように Label は使用していきます。実用的にどのように使うかは今後の記事で見ていきましょう。

#Namespace の操作
Kubernetes にはリソースを纏めて仮想的に分離する「Namespace」という機能があります。これを使用すると、ひとつの Kubetnetes クラスターを複数のプロジェクトで利用することができます。現在設定されている Namespace は `kubectl get namespace` で情報を取得できます。

```
$ kubectl get namespace
NAME          STATUS   AGE
default       Active   37h
kube-public   Active   37h
kube-system   Active   37h
```

Pod の情報を取得する際、`--namespace` オプションを用いると、どの Namespace に含まれているかが確認することが出来ます。下記の例では、kube-system という Namespace 含まれている Pod を確認しています。

```
$ kubectl get pod -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-XXXXXXXXXX-54np6                1/1     Running   0          37h
coredns-XXXXXXXXXX-qphkn                1/1     Running   0          36h
coredns-autoscaler-XXXXXXXXXX-h2lgp     1/1     Running   0          37h
~ 省略 ~
```

次に実際に Namespace を定義します。Namespace は Pod のリソースと同様に、マニュフェストファイルで指定します。例えば `namespacesample.yaml` というマニュフェストファイルを作成します。

```namespacesample.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: trade-system
```

作成したら、`kubectl apply -f namespace.yaml` を実行して、Namespace を作成します。作成できたら、`kubectl get namespace` を実行してみます。

```
$ kubectl get namespace
NAME           STATUS   AGE
default        Active   37h
kube-public    Active   37h
kube-system    Active   37h
trade-system   Active   39s
```

これで新しい Namespace を作成することが出来ました。Pod を作成する際には、どの Namespace に含まれるかを意識しながら作成する必要があります。
次回の記事では、実際にコンテナーアプリケーションの実行と管理を実行していきたいと思います。

#参考URL
Labels and Selectors
https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

Namespaces
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/