k8sの基礎をcatacodaで学習（初心者向け）- Part1

# kubernetes(k8s)入門
このぺーじでは、[katacoda](https://www.katacoda.com/)と呼ばれる「ブラウザから無料で勉強用のインスタンスを起動できるWebサービス」を利用して[Kubernetes Introduction Get started using Kubernetes](https://www.katacoda.com/courses/kubernetes)を実践します
内容は上記リンクに沿うので、不明点があればそちらへどうぞ

## Launch A Single Node Cluster
ここでは、DNSやKube UIを含むシングルノード[Minikube](https://minikube.sigs.k8s.io/docs/)クラスタの起動方法を学習する
Minikubeは、ローカルでKubernetesを簡単に実行できるツールです。Minikubeは、ラップトップ上のVM内でシングルノードのKubernetesクラスタを実行します。
このシナリオで学習することをさっと確認する場合は**概要**を確認

## <font color="Red">概要</font>
- ローカル環境でk8sのシングルクラスターを構築可能
- クラスタの構築には、```minikube start```を用いる
- k8sクラスタの管理には、kubectlを利用。```kubectl cluster-info```コマンドでクラスタの情報を確認できる
- それぞれのリソースの情報を確認する際は、```kubectl get <resource>```で確認（<resource>には、pods,service,deployment,nodesが当てはまる）
- minikubeには、k8sマルチクラスタ同様アドオン機能が用意されている
    - アドオン機能の操作には```minikube addons <操作内容（list,enable dashboard 等）>```で利用


### Minikubeの開始
本環境では、既に```Minikube```がダウンロード済みで初期設定も終了している
下記コマンドの通り、```minikube version```でダウンロード済みのminikubeの情報を確認した後、```minikube start```でシングルクラスタを展開する
```minikube start```で用いるオプション```--wait```の引数には、```"apiserver,system_pods,default_sa,apps_running,node_ready,kubelet"```があり、指定した要素の検証をクラスタ開始までに済ませるか否かを決めることが可能
デフォルトでは、"apiserver,system_pods"の検証が行われる

```
$ pwd
/root
$ minikube version
minikube version: v1.8.1
commit: cbda04cf6bbe65e987ae52bb393c10099ab62014
$ tree .minikube/
.minikube/
├── addons
├── apiserver.crt
├── apiserver.key
├── cache
│   ├── iso
│   ├── linux
│   │   └── v1.17.3
│   │       ├── kubeadm
│   │       ├── kubectl
│   │       └── kubelet
│   └── preloaded-tarball
│       ├── preloaded-images-k8s-v1-v1.17.3-docker-overlay2.tar.lz4
│       └── preloaded-images-k8s-v1-v1.17.3-docker-overlay2.tar.lz4.checksum
├── ca.crt
├── ca.key
├── certs
│   ├── ca-key.pem
│   ├── ca.pem
│   ├── cert.pem
│   └── key.pem
├── client.crt
├── client.key
├── config
│   └── config.json
├── files
├── logs
├── machines
├── profiles
├── proxy-client-ca.crt
├── proxy-client-ca.key
├── proxy-client.crt
└── proxy-client.key

12 directories, 20 files
$ ls -a
.  ..  .bashrc  .cache  .config  Desktop  .docker  .gnupg  .hushlogin  .minikube  .profile  .ssh  .vnc  .vscode
$ minikube start --wait=false
* minikube v1.8.1 on Ubuntu 18.04
* Using the none driver based on user configuration
* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ...
* OS release is Ubuntu 18.04.4 LTS
* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ...
  - kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Launching Kubernetes ...
* Enabling addons: default-storageclass, storage-provisioner
* Configuring local host environment ...
* Done! kubectl is now configured to use "minikube"
$ 
```

### Cluster情報の確認
k8sクラスタは、[kubectl](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-strong-getting-started-strong-) CLIを使用して管理します。
展開したk8sクラスタの詳細とその状態を確認し、ノードの状態を下記の通り確認

```
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.21:8443
KubeDNS is running at https://172.17.0.21:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   11m   v1.17.3
```

### コンテナの展開
ここでは、起動中のクラスタでコンテナを実行する
コンテナの起動では、podの代わりにdeploymentリソースを利用。
deploymentは、podと異なりバージョン管理やレプリカ数も管理可能。理解のためには、こちらを[参照](https://cstoku.dev/posts/2018/k8sdojo-08/)
現在の状態は下記の通り

```
$ kubectl get deployment
No resources found in default namespace.
$ kubectl get pods
No resources found in default namespace.
$ docker image ls | grep docker-http-server
```

イメージがローカルレジストリに存在しないことも上記コマンドから判明

```
$ kubectl create deployment first-deployment --image=katacoda/docker-http-server
deployment.apps/first-deployment created
$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
first-deployment-666c48b44-szjwz   1/1     Running   0          6s
$ kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
first-deployment   1/1     1            1           17s
$ docker images ls | grep docker-http-server
$ docker image ls | grep docker-http-server
katacoda/docker-http-server                     latest              0d6ee549ae13        4 years ago         7.59MB
```

deploymentを作成することで、podが起動され、内部にイメージがダウンロードされていることも確認できる

コンテナが実行されると、要件に応じて異なるネットワーキングオプションを介して公開することができます。
一つの可能性のある解決策は、コンテナにダイナミックポートを提供する NodePort です。


```
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   17m
$ kubectl expose deployment first-deployment --port=80 --type=NodePort
service/first-deployment exposed
$ kubectl get svc
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
first-deployment   NodePort    10.97.89.102   <none>        80:32550/TCP   9s
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        17m
```

コンテナの接続はこちらから確認できる

```
$ export PORT=$(kubectl get svc first-deployment -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}')
$ echo "Accessing host01:$PORT"
Accessing host01:32550
$ curl host01:$PORT
<h1>This request was processed by host: first-deployment-666c48b44-szjwz</h1>
```

### dashboardの利用
minikube上でダッシュボードを利用するために、dashboard機能をアドオンする

```
$ minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gvisor                      | minikube | disabled     || helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     || istio-provisioner           | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nvidia-driver-installer     | minikube | disabled     || nvidia-gpu-device-plugin    | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   || storage-provisioner-gluster | minikube | disabled     |
|-----------------------------|----------|--------------|
$ minikube addons enable dashboard
* The 'dashboard' addon is enabled$ minikube addons list | grep dashboard
| dashboard                   | minikube | enabled ✅   |
```

以下のYAML定義をデプロイしてKubernetes Dashboardを利用できるようにします。これはKatacoda上でのみ使用する必要があります。

```YAML:kubernetes-dashboard.yaml
apiVersion: v1
kind: Namespace
metadata:
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/minikube-addons: dashboard
  name: kubernetes-dashboard
  selfLink: /api/v1/namespaces/kubernetes-dashboard
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard-katacoda
  namespace: kubernetes-dashboard
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
    nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
```

Kubernetesダッシュボードでは、アプリケーションをUIで表示することができます。今回のデプロイでは、30000番ポートでダッシュボードが利用可能

ダッシュボードを起動し確認するため、下記コマンドを実行

```
$ kubectl apply -f /opt/kubernetes-dashboard.yaml
namespace/kubernetes-dashboard configured
service/kubernetes-dashboard-katacoda created
$ kubectl get svc
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
first-deployment   NodePort    10.97.89.102   <none>        80:32550/TCP   35m
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        52m
$ kubectl get pods -n kubernetes-dashboard -w
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7b64584c5c-6sfk7   1/1     Running   0          6m30s
kubernetes-dashboard-79d9cd965-pf4mv         1/1     Running   0          6m29s
```

ダッシュボードはこちらの[リンク](https://2886795282-30000-elsy06.environments.katacoda.com/)から移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/60f504e0-39c2-6831-bcda-10b59f52d1a6.png)