Proxy環境でUbuntu18.04上にminikubeとlstioを構築してみた

# はじめに
今回は、サービスメッシュを提供する `Istio` の構築をHTTP Proxy環境で行ってみました。
CentOS8 + minikubeでは上手くいかなかったのでUbuntu18.04 + minikubeにしています。

.curlrcを編集することで多少コマンドを短くできますがあえて編集せずに進めています。
2/10週に加筆予定。

# 環境概要
- OS
    - Ubuntu 18.04.4 LTS
- kubernetes
    - v1.17.2
- minikube
    - v1.7.1 
- crictl
    - 1.17.0
- docker
    - 18.09.7
- Istio
    - v1.3.7

# 仮想マシンの構築
## VirtualBox上に仮想マシンを作成
- vCPU 4コア　※2コア以上必須 (minikube仕様)
- メモリ 24GB ※16GBあれば大丈夫だと思う
- HDD 160GB (可変)
- ネットワーク
    - アダプター 1: Intel PRO/1000 MT Desktop (NAT)
    - アダプター 2: Intel PRO/1000 MT Desktop (ホストオンリーアダプタ)

## 仮想マシン上にUbuntu18.04をインストール
- HTTP Proxyの設定を行う
- OpenSSH Serverパッケージを導入する

# パッケージのインストール 
```
$ sudo -i
# apt update
# apt upgrade
# apt dist-upgrade
# apt install -y docker.io
# export Proxy=http://<HTTP Proxy Host>:<PORT>/
# curl -x $Proxy -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s -x $Proxy https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && cp kubectl /usr/local/bin/ &&  rm kubectl
# curl -x $Proxy -Lo minikube https://github.com/kubernetes/minikube/releases/download/v1.7.1/minikube-linux-amd64 && chmod +x minikube* &&   sudo cp minikube /usr/local/bin/ &&  rm minikube
# curl -OL -x $Proxy https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.17.0/crictl-v1.17.0-linux-amd64.tar.gz | tar zxv /usr/local/bin
```

# minikube構築
```
# cd /etc/systemd/system/
# mkdir docker.service.d
# vi docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=<HTTP Proxy Host>:<PORT>" "HTTPS_PROXY=<HTTP Proxy Host>:<PORT>"
# systemctl daemon-reload
# systemctl show --property=Environment docker
# systemctl restart docker
# cd ~
# export HTTP_PROXY=$Proxy
# HTTPS_PROXYの設定値のURIスキーマはhttps://ではなくhttp://にすること
# export HTTPS_PROXY=$Proxy
# export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,10.0.2.15
# minikube start --vm-driver=none --kubernetes-version=v1.17.2 --docker-env HTTP_PROXY=$HTTP_PROXY --docker-env HTTPS_PROXY=$HTTPS_PROXY  --docker-env NO_PROXY=$NO_PROXY
```

# Istio構築
```
# curl -x http://$Proxy -L https://git.io/getLatestIstio | ISTIO_VERSION=1.3.7 sh -
# cd istio-1.3.7/
# for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
# kubectl apply -f install/kubernetes/istio-demo.yaml
# ※istio-ingressgateway のexternal-ipはpendingのままになる。
# kubectl get svc -n istio-system
# kubectl get pods -n istio-system
```

# サンプルアプリケーションのデプロイ
```
# kubectl label namespace default istio-injection=enabled
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# kubectl get svc
# kubectl get pods
# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# kubectl create -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
# export GATEWAY_URL=$(minikube ip):$(kubectl get svc istio-ingressgateway -n istio-system -o 'jsonpath={.spec.ports[1].nodePort}')
# echo $GATEWAY_URL
10.0.2.15:31380
# lsof -i:31380
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kube-prox 3038 root   18u  IPv6 329642      0t0  TCP *:31380 (LISTEN)
```

# Webブラウザから以下にアクセスしてみる
VirtualBoxが動作しているホストマシンのWebブラウザで「http://<仮想マシンのIPアドレス>:<ポート>/productpage」にアクセス。

## 注意点)
- <仮想マシンのIPアドレス>は10.0.2.15 (NAT用のvNIC) のIPアドレスではなく192.168.225.4のような (ホストオンリーネットワーク用のvNIC)のIPアドレス
    - lsofの結果を見ればわかるが* (0.0.0.0) で待ち受けている
- <ポート>は31380とは限らないのでecho $GATEWAY_URLの値を確認すること
- ホストマシンのWebブラウザの設定でHTTP Proxyを外すか、NoProxyの設定 (イメージ: 192.168.225.0/24を除外) を行う必要がある。