訳しながら理解していくKubernetes_ Namespaces編

# はじめに
Kubernetesのドキュメントって英語だし、英検3級レベルで英語力のない私にはつらい・・・
そして、一回(google翻訳を使って)訳しながら読んでまた忘れてまた(google翻訳を使って)訳すを繰り返すのをやめたい。
調べるときは全文を見ずに、必要な部分だけを見てたりするので、公式ドキュメントを訳しながら全体を理解していこうと思う。

英語読むのめんどくせーーーとなっている人の助けになればと思い公開した

今回は [Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)


## 注意事項
* 基本的にGoogle翻訳のまんまです。
* 一応、意味が分かるようには訳してるつもりですが、ちょいちょい意味分からない部分もあります。  
誤訳がある可能性があるので、最後はちゃんと公式ドキュメントを読みましょう
* 私の知りたい部分からやるので、訳す部分はバラバラになります。
* 公式ドキュメントに記載されていない部分(自分で調べた部分とか)は_italic_で記載しています。
* V1.11でのドキュメントを記載

## Namespaces
Kubernetesは、同じ物理クラスタでの複数の仮想クラスタをサポートしています。これらの仮想クラスタは名前空間(Namespaces)と呼ばれます。

## When to Use Multiple Namespaces
名前空間は、複数のチームやプロジェクトにまたがっている多数のユーザーがいる環境での使用を想定しています。数人から数十人のユーザーを持つクラスタでは、名前空間を作成したり考えたりする必要はありません。名前空間は、提供する機能が必要なときに使用します。

名前空間は名前のスコープを提供します。リソースの名前は、名前空間内で一意である必要がありますが、名前空間間では一意である必要はありません。

ネームスペースは、複数のユーザー間でクラスタリソースを分割する方法です[resource quota](https://kubernetes.io/docs/concepts/policy/resource-quotas/)。

Kubernetesの将来のバージョンでは、同じ名前空間内のオブジェクトは、デフォルトで同じアクセス制御ポリシーを持ちます。

同じソフトウェアの異なるバージョンなど、わずかに異なるリソースを分離するために複数の名前空間を使用する必要はありません。[ラベル(labels)](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/)を使用して同じ名前空間内のリソースを区別します。

## Working with Namespaces
ネームスペースの作成と削除については、[ネームスペースの管理ガイドのドキュメント](https://kubernetes.io/docs/tasks/administer-cluster/namespaces/)を参照してください。

### Viewing namespaces
以下を使用して、クラスタ内の現在のネームスペースを一覧表示できます。

```shell
$ kubectl get namespaces
NAME          STATUS    AGE
default       Active    1d
kube-system   Active    1d
kube-public   Active    1d
```

Kubernetesは3つの初期名前空間から始まります：

* `default` 他の名前空間を持たないオブジェクトのデフォルト名前空間
* `kube-system` Kubernetesシステムによって作成されたオブジェクトの名前空間
* `kube-public` この名前空間は自動的に作成され、すべてのユーザ（認証されていないユーザも含む）が読むことができます。この名前空間は、ほとんどの場合、クラスタ全体で一部のリソースを公開して表示する必要がある場合に備えて、クラスタの使用のために予約されています。この名前空間のパブリック・アスペクトは、慣習にすぎず、要件ではありません。

### Setting the namespace for a request
要求の名前空間を一時的に設定するには、 `--namespace`フラグを使用します。

例：

```shell
$ kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx
$ kubectl --namespace=<insert-namespace-name-here> get pods
```

### Setting the namespace preference
そのコンテキスト内の後続のすべてのkubectlコマンドの名前空間を永続的に保存することができます。

```shell
$ kubectl config set-context $(kubectl config current-context) --namespace=<insert-namespace-name-here>
# Validate it
$ kubectl config view | grep namespace:
```

## Namespaces and DNS
[Service](https://kubernetes.io/docs/concepts/services-networking/service/)を作成すると、対応する[DNSエントリ](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/)が作成されます。このエントリの形式は `<service-name>。<namespace-name> .svc.cluster.local`です。つまり、コンテナが単に`<service-name>`を使用する場合、名前空間にローカルなサービスに解決されます。これは、開発、ステージング、プロダクションなどの複数の名前空間で同じ構成を使用する場合に便利です。ネームスペースをまたぐ場合は、完全修飾ドメイン名（FQDN）を使用する必要があります。

## Not All Objects are in a Namespace
ほとんどのKubernetesリソース（たとえば、ポッド、サービス、レプリケーションコントローラなど）はいくつかの名前空間にあります。しかし、名前空間リソースは名前空間にはありません。また、[ノード](https://kubernetes.io/docs/concepts/architecture/nodes/)やpersistentVolumeなどの低レベルのリソースは、名前空間にはありません。

Kubernetesのリソースがネームスペースにあるかどうかを調べるには：

```shell
# In a namespace
$ kubectl api-resources --namespaced=true

# Not in a namespace
$ kubectl api-resources --namespaced=false
```