minikubeでNFSのPVとPVCを作ってprivate registryを起動する

## 環境

* minikube: v1.3.1
* kubernetes: 1.15
* macOS: 10.14.4

## ホストOS側でNFSサーバを起動する

ディレクトリ作成。

```
sudo mkdir /share
sudo chmod 777 /share

sudo bash -c "echo '/share -mapall=nobody:wheel -network 192.168.99.0 -mask 255.255.255.0' >> /etc/exports"
```

NFSデーモンの起動

```
sudo nfsd start
sudo nfsd update  
```

### 確認

```
sudo showmount -e  
```

出力

```
Exports list on localhost:
/share                              192.168.99.0
```

## minikube側に`/share`ディレクトリを作成

```
minikube ssh mkdir /share
``

### マウント確認

```
minikube ssh
sudo mkdir /share
sudo mount -t nfs 192.168.99.1:/share /share
```

`df`コマンドなどでマウントができていることを確認してアンマウント。

```
sudo umount /share
```

## PersistentVolumeと、PersistentVolumeClaimの定義

```yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
  nfs:
    path: /share
    server: 192.168.99.1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: slow
```

適当なファイル名で保存し、`kubectl apply -f ファイル名` します。

## private registryの起動

nodePortで`30500`に固定しています。ホスト側からpushする場合は、nodePortの30500に接続するように設定します。

```yml
kind: Service
apiVersion: v1
metadata:
  name: registry-service
spec:
  selector:
    app: registry-service
  type: NodePort
  ports:
  - protocol: TCP
    port: 5000
    targetPort: 5000
    nodePort: 30500
    name: registry-http
---
kind: Pod
apiVersion: v1
metadata:
  name: registry
  labels:
    app: registry
spec:
  containers:
    - name: registry
      image: registry:2
      volumeMounts:
      - mountPath: "/var/lib/registry"
        name: pvc
      ports:
      - containerPort: 5000
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: nfs-pvc1
```

適当なファイル名で保存し、`kubectl apply -f ファイル名` します。

## private registryのウェブUI

private registryに入っている内容をウェブUIで閲覧できるようにするには[konradkleine/docker-registry-frontend:v2](https://hub.docker.com/r/konradkleine/docker-registry-frontend)イメージを使います。

```yml
kind: Service
apiVersion: v1
metadata:
  name: registry-frontend-service
spec:
  selector:
    app: registry-frontend-service
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: registry-http-frontend
---
kind: Pod
apiVersion: v1
metadata:
  name: registry-frontend
  labels:
    app: registry-frontend
spec:
  containers:
    - name: registry-frontend
      image: konradkleine/docker-registry-frontend:v2
      ports:
      - containerPort: 80
      env:
      - name: ENV_DOCKER_REGISTRY_HOST
        value: registry-service
      - name: ENV_DOCKER_REGISTRY_PORT
        value: "5000"
```

適当なファイル名で保存し、`kubectl apply -f ファイル名` します。

`minikube service registry-frontend-service` と実行するとブラウザで閲覧できます。


## 参照

* [Kubernetes: PersistentVolume概要とminikubeでの検証 - Qiita](https://qiita.com/ysakashita/items/924786aa24ef3bb864ef)
* [Docker Private Registryの構築 on Kubernetes - Qiita](https://qiita.com/khk-h/items/c4bf26d771f5a4a78ae6)
* [konradkleine/docker-registry-frontend - Docker Hub](https://hub.docker.com/r/konradkleine/docker-registry-frontend)