VScode の Kubernetes 拡張機能

## 概要
VSCode の Kubernetes 拡張機能について下記を記載する
1. VSCode インストール
2. VSCode へ Kubernetes Extension インストール
3. Kubernetes Extension の Kubeconfig 設定
4. VSCode から kubectl apply の実行例

## 1. VSCode インストール
OS 別に VSCode のインストール方法を記載する。(Windows は手元にいい環境がなかったため省略)
すでにインストール済みであればこの項目は実施不要。

### Linux
参照先 [Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux)

#### Ubuntu / Debian 系

下記実行でパッケージ設定からインストールまで完了する。(詳細 [Debian and Ubuntu based distributions](https://code.visualstudio.com/docs/setup/linux#_debian-and-ubuntu-based-distributions))

```
sudo apt install -y curl
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt -y install apt-transport-https
sudo apt -y update
sudo apt -y install code
```
#### RHEL/Fedora/CentOS 系

下記実行でパッケージ設定からインストールまで完了する。
(CentOS7はyum, CentOS8ではdnfなので注意) (詳細 [RHEL, Fedora, and CentOS based distributions](https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions))

```
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
#CentOS8 or Fedora
sudo dnf check-update
sudo dnf install -y code
#CentOS7
sudo yum check-update
sudo yum install -y code
```

#### 共通
インストール後はShellにて下記で起動可能。

```
$ code
```

### MacOS
[ダウンロードサイト](https://code.visualstudio.com/)から他ソフト同様ダウンロードしてインストールする。
<img width="975" alt="スクリーンショット 2020-01-12 14.55.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/06857e1a-f229-7656-3f17-88e991e2fe4d.png">

ダウンロードが終わるとダウンロードフォルダに「VSCode-darwin-stable.zip」が保存されているので開く。
(Safariの場合は展開済みの場合がある(.zipではなくVisualStuioCodeそのものがある場合は下記は不要))
<img width="777" alt="スクリーンショット 2020-01-12 15.02.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/2ac7a8ae-9fe9-f2d8-92ad-6a78b54ee092.png">

アーカイブマネージャで展開され、アプリケーション「Visual Studio Code」が
ダウンロードフォルダに配置されるので実行する。
<img width="657" alt="スクリーンショット 2020-01-12 15.14.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/a9ecd315-93f0-c384-4097-4c4eda6861a2.png">

実行時に下記が表示される場合は、「開く」を選択する。
<img width="474" alt="スクリーンショット 2020-01-12 15.16.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/e9811485-954e-8b2f-9474-e07eb295a5d7.png">

アプリケーションとして登録する場合は、「Visual Studio Code」を「アプリケーション」へドラッグアンドドロップしておくことで配置できる。
<img width="625" alt="スクリーンショット 2020-01-12 15.20.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/e507cd11-606e-9503-7407-79f4e8f8b2ab.png">

## 2. VSCode Kubernetes Extension インストール
VSCodeを起動し下記の手順で [Kuberntes用のExtention](https://marketplace.visualstudio.com/items?itemName=ms-kubernetes-tools.vscode-kubernetes-tools) をインストールする。
1. Extensionを選択
2. Search で「kubernetes」を入力
3. Kubernetes (Microsoft) を Install
![スクリーンショット 2020-01-10 0.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/4c4f8c78-41bf-1bfc-5fd7-0f36f3e16861.png)

VSCodeを再起動すると横に Kubernetes のExtension のメニュー(Kubernetesのマーク)が増えている。
<img width="671" alt="スクリーンショット 2020-01-12 15.28.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/edc1db1a-3973-47e5-6706-3e6679b3296d.png">

kubectl等が見つからない場合は、依存性のパッケージインストール要求が出てくるので、
「**Install dependencies**」をクリックしてインストールする。
※この際に解決されダウンロードされたものはデフォルトでは「~/.vs-kubernetes/tools/」のパス配下へ保存されます
<img width="1392" alt="スクリーンショット 2020-01-12 15.39.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/df72b0fb-a95d-49cf-4d99-0ab613c9ec20.png">

## 3. Kubernetes Extension Kubeconfig 設定
kubeconfigを設定しVSCodeからkubernetesクラスタへアクセスできるように設定する。
設定方法は複数パターンがあるので、下記3パターンで記載する。
1. デフォルト参照パスへの配置
2. デフォルトパス以外のkubeconfigの参照
3. 複数のkubeconfigの設定・切替

### 1. デフォルト参照パスへの配置
デフォルトでは「**~/.kube/config**」が参照される。
すでにkubectl等でVSCodeを入れたホストに配置されている場合は、
上記が参照された状態でVSCodeが立ち上がる。
※ 1クラスタのみを対象にする場合はこれだけで十分だと思います

### 2. デフォルトパス以外のkubeconfigの参照
kubeconfig ファイルを指定することも可能。

VSCodeのホストにkubeconfigがない場合は、既存で使用しているkubeconfigをダウンロードか別途用意する。
kubesprayでインストールしている場合は、マスターノードにある /root/.kube/config を取得(コピーなど)するとそのまま使える。
[kubesprayでのkuberntesクラスタ構築例](https://qiita.com/suzuyui/items/e7531fe5e1e84c061b23)

<img width="542" alt="スクリーンショット 2020-01-12 16.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/c4b1608c-ac17-36fa-2073-29557db73d2c.png">

用意したkubeconfigは 「CLUSTERS」 の「…」を開いて「Set Kubeconfig」を選択し、
「+Add new kubeconfig」を選択(クリック)する。

<img width="516" alt="スクリーンショット 2020-01-12 15.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/ad8d76d1-7c38-889a-706e-cd89be24154f.png">
<img width="636" alt="スクリーンショット 2020-01-12 15.50.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/aba1ce30-1fea-c0b1-da47-f37b46641e72.png">

ファイル選択から指定したい kubeconfig(/root/.kube/configを持ってきた場合はそのファイル) を指定し開く。
<img width="811" alt="スクリーンショット 2020-01-12 16.10.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/347e3ec2-0c43-f934-2844-af838dd0e289.png">

kubeconfigの設定が完了し、kubernetesクラスタへアクセスができると、
kubernetesのリソース情報を VSCode 上から確認できるようになる。
<img width="757" alt="スクリーンショット 2020-01-12 16.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/01fee1b7-07e1-93b0-96e3-1a33bd6ef59f.png">

### 3. 複数のkubeconfigの設定・切替
VSCodeの設定(setting.json)を編集することで複数のkubeconfigを設定しておくことも可能。
※2.の方法で追加していくことも可能です。複数の場合はjsonでの管理を意識した方が後々管理しやすいと思います

1. 左下の⚙(歯車)をクリック
2. 設定(Setting)をクリック
3. 拡張機能(Extension)をクリックして広げる
4. Kubernetes config...をクリック
5. setting.jsonで編集(Edit setting.json)をクリック
<img width="932" alt="スクリーンショット 2020-01-13 13.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/20ba3ae0-e80b-c8ef-9812-10765503c0ca.png">

setting.jsonの「vs-kubernetes」の設定を編集する。
- "vs-kubernetes.knownKubeconfigs" : 配列で複数のkubeconfigを指定できる
- "vs-kubernetes.kubeconfig": 使用するkubeconfigを指定できる
<img width="938" alt="スクリーンショット 2020-01-13 13.04.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/6b16662a-1487-a23c-3091-fc6e89d09791.png">

切替方法はCLUSTERSのSet Kubeconfigを開いて、使用したい方のkubeconfigをクリックすることで切り替えができる。
<img width="516" alt="スクリーンショット 2020-01-12 15.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/ad8d76d1-7c38-889a-706e-cd89be24154f.png">
<img width="767" alt="スクリーンショット 2020-01-13 13.09.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/475f6613-4ce2-f912-1e63-d4270a4703f6.png">

## 4. VSCode から kubectl apply の実行例
VSCodeからの操作の一例として下記記載する。
1. マニフェストからのPodのcreate
2. マニフェスト編集でのPodのapply

### 1. マニフェストからのPodのcreate
下記は例で作成するnginxのPodを構築するマニフェスト。
(VSCodeでは**resource.limitsを書かないと自動で警告を出してくれる**ので、limitsを適当に書いている)
<img width="1053" alt="スクリーンショット 2020-01-13 13.57.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/845e8386-0a7d-c634-a48b-7691d46cc862.png">

コマンドパレットから「**Kubernetes: Apply**」を選択する(kube applyなど打てば下に出てくるので選択する)
(コマンドパレットはCtrl + Shift + p もしくは 表示(View)からコマンドパレット(Command Pallet...)で表示可能)
<img width="1050" alt="スクリーンショット 2020-01-13 13.59.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/cb5087c0-7ca3-2230-2ea3-16268d9ba496.png">

右下に「Create」するかが聞かれるので「**Create**」をクリックする。

<img width="1051" alt="スクリーンショット 2020-01-13 13.57.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/cf0adbb9-a7a3-8405-fb57-e7ca2270e61f.png">



### 2. マニフェスト編集でのPodのapply
1.で作成したPodのimageを1.12から1.13へ変更する例として下記のように1.のマニフェストを編集する。
<img width="1052" alt="スクリーンショット 2020-01-13 13.46.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/7cd58ea1-5d24-d3d4-ebf7-4d6bfa30002a.png">

1.と同様に「Kubernetes: Apply」をコマンドパレットから使用する。
<img width="1051" alt="スクリーンショット 2020-01-13 13.47.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/79c3768c-7574-c1ba-39c9-a7add1b6fd76.png">

1.(create時)とは異なり、既存リソースにあるため、差分表示がされ、「Apply」するかが問われるので、
差分が問題ないことを確認してから「**Apply**」をクリックして適応できる。
<img width="1051" alt="スクリーンショット 2020-01-13 13.48.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/b771533c-381d-2c0c-ec9d-df7a5de2f2f0.png">

## おわりに
VSCode で Kubernetes 拡張機能について概要を記載した。
Apply 時に差分を確認してから Apply ができたり、yaml で resources.limits を書かないと警告をしてくれたり、便利そうなことが見えてきた。
ただ、実際の運用ではCI/CDツールを整備などするため、手動でapplyするのは稀かもしれない。
利用はこれからなので、いろいろ探っていきたい。