【2019年3月版】MiniKube で Piping-server

# コンテナの、深いとこからログバック
Docker on DockerしてたりKubernetesで遊んでたりすると、コンテナの深いところの狭いターミナルでちまちまログをつついたり設定ファイルをいじっているのをホスト側に持ってきてdiffとって2ペインでスクロール連動しながら見比べたいとかやっぱりサクラエディタでブロック範囲のカット＆ペーストしたいとかいろいろあるわけです。
頑張ってAlpineで小さなコンテナ作ってもなんかうまくいかない、shで入ってみたけど viなんか入れてないのよ、Alpineだし。でも curlはあるよね？なんて時に **Piping Server**の時間ですよ!!

こちらの記事でご紹介されてます。

- [ネットワーク越しでパイプしたり、あらゆるデバイス間でデータ転送したい！](https://qiita.com/nwtgck/items/78309fc529da7776cba0)

はい、私もしたいです！ということで、さくっとMinikubeで立ててみたいと思います。

## Minikube起動

これはWindows10 Proで Hyper-V の Minikubeを使っております。"管理者として実行"のターミナルを開きます。
とりあえず、minikubeをスタート。

```shell
> minikube start
```
minikube の起動が若干、遅いのでその間に以下のようなK8s用のyamlファイルを作成しておきます。

## YMALファイルの準備
今回は通常のpiping-serverではなく、**bytenode-piping-server**の方を使ってみます。

```yaml
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: piping-server
  labels:
    app: piping-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: piping-server
  template:
    metadata:
      labels:
        app: piping-server
    spec:
      containers:
        - name: piping-server
          image: nwtgck/bytenode-piping-server
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: "0.3"
              memory: "300Mi"
          ports:
            - name: http-8080
              hostPort: 8080
              containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: piping-server-svc
spec:
  ports:
    - name: http-8080
      port: 8080
      nodePort: 30080
  selector:
    app: piping-server
  type: NodePort
```
CPUが0.3のメモリ300Miはなんとなくです。もっと少なくてもいいかもしれません。
またMinikubeなのでNodeIp:30080でexposeするように指定してあります。
yaml一本でdeplomentとserviceを書けるのはいいですね〜！

## YAMLをapply
さて、Minikubeが立ち上がったところで設定ファイルを```apply```します。

```shell
>kubectl apply -f piping-server.yml
deployment.extensions "piping-server" created
service "piping-server-svc" created
```
deplomentとserviceがちゃんと作られました。
podはどうなったでしょうか？

```
>kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
piping-server-648f9f4b9d-xsg2d   1/1       Running   0          1m
```
お、無事に動いているようです！
続いてもうちょっと詳しく状態を伺ってみます。

```shell
>kubectl describe pod piping-server-648f9f4b9d-xsg2d
Name:               piping-server-648f9f4b9d-xsg2d
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/192.168.1.140
Start Time:         Tue, 05 Mar 2019 14:24:05 +0900
Labels:             app=piping-server
                    pod-template-hash=648f9f4b9d
Annotations:        <none>
Status:             Running
IP:                 172.17.0.5
Controlled By:      ReplicaSet/piping-server-648f9f4b9d
Containers:
  piping-server:
    Container ID:   docker://734527d2e31a49a8bf893ae172c0edaa80336b1238d0cba326c66ae2afb1d08e
    Image:          nwtgck/bytenode-piping-server
    Image ID:       docker-pullable://nwtgck/bytenode-piping-server@sha256:82afcb913d1bf37f6fbebdd6a3d45f4bc1da4424a2905cf6f85290125b2a932a
    Port:           8080/TCP
    Host Port:      8080/TCP
    State:          Running
      Started:      Tue, 05 Mar 2019 14:24:06 +0900
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     300m
      memory:  300Mi
    Requests:
      cpu:        300m
      memory:     300Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pq2lq (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-pq2lq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pq2lq
    Optional:    false
QoS Class:       Guaranteed
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  1m    default-scheduler  Successfully assigned default/piping-server-648f9f4b9d-xsg2d to minikube
  Normal  Pulled     1m    kubelet, minikube  Container image "nwtgck/bytenode-piping-server" already present on machine
  Normal  Created    1m    kubelet, minikube  Created container
  Normal  Started    1m    kubelet, minikube  Started container
```
Docker imageが無事にpullされてpodがminikubeノード上で無事に割り当てられたのが確認できました。
さっそくminikubeのコマンドからpiping-server-svcのexposeをブラウザで確認いたします。

```shell
>minikube service piping-server-svc
-   Opening kubernetes service default/piping-server-svc in default browser...
```
はい、ブラウザ、開きますっ！
・・・といってもまぁブラウザはおまけみたいなものなので早速、コンテナの奥地からいじりたい設定ファイルを取り出してみます。
# ファイルの送信
とりあえず受け取る方から```/yaml```と適当なパスを指定して接続を待ち受けておきます。

```shell
$ curl http://192.168.1.140:30080/yaml > cli.yaml
```
続いて送り側から上記で待ち受けた```/yaml```に対して、取り出したいファイルをパイプで投げつけます。

```shell
$ cat docker-compose-cli.yaml | curl -T - http://192.168.1.140:30080/yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3379    0   124    0  3255   1137  29862 --:--:-- --:--:-- --:--:-- 31000[INFO] Waiting for 1 receiver(s)...
[INFO] 1 receiver(s) has/have been connected.
Start sending!
[INFO] Sending Successful!

```
サクッと送信完了！
そして受信側でも、

```shell
$ curl http://192.168.1.140:30080/yaml > cli.yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3243    0  3243    0     0     39      0 --:--:--  0:01:21 --:--:--   819
```
到着！！

無事に設定ファイルが取り出せました！！

# フォルダをtar.gzで圧縮して送信

つづいてWindowsのフォルダ共有がいちいち面倒な時にサクッとフォルダごと送信です。

```shell:受け側
$ curl http://192.168.1.140:30080/somebigfolder| tar zxv
```

```shell:送る方
$ tar zfcp - ./somebigfolder | curl -T - http://192.168.1.140:30080/somebigfolder
```

こんな感じでサクッと送れてしまいます。

# Docker Image のサーバー間コピー

```shell:受け側
$ curl http://192.168.1.140:30080/dockerim | gzip -d | sudo docker load
```

```shell:送り側
$ sudo docker save <image tag> | gzip -c | curl -T - http://192.168.1.140:30080/dockerim
```

引き続き**piping-server**でいろいろやってみたいと思います。
あると便利！