## ローカルでk8s
ちょっと試してみたいときとかに、ローカルでk8sを動かしたくて。以前だとMinikubeとかDockerについてくるk8sとかを使ったことがあるけど、今だとまた何か出てるかな?と思ってたらこういうスレッドを見つけた。
K3s, minikube or microk8s? : kubernetes
- Minikube
- Microk8s
- K3s
- Kind
- Desktop Docker
- K3d
- Kubeadm
が紹介されてた。へー。と思って、なんとなくk3dが面白そうかなと思ったので試してみた。
## k3d
https://github.com/rancher/k3d
紹介されている一覧の中にあるk3sをDockerで動かしてくれるのがk3dということみたい。Dockerを動かすプラットフォームをDockerの中で動か・・・す?こんがらがる。
僕はUbuntu使ってるんだけど、Dockerで動くならWindowsでもMacでも動きそうで良さそうね。
READMEに書いてある通りにインストールして(brewも対応してるみたい)
$ curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash
READMEに書いてある通りにクラスターを生成してからConfigを設定したら
$ k3d create $ export KUBECONFIG=$(k3d get-kubeconfig)
へー。ほんとに動いてる。
$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system local-path-provisioner-58fb86bdfd-kvmdh 1/1 Running 0 3m40s kube-system coredns-57d8bbb86-grbbr 1/1 Running 0 3m40s kube-system helm-install-traefik-4qr7t 0/1 Completed 0 3m40s kube-system svclb-traefik-j8c49 3/3 Running 0 3m5s kube-system traefik-65bccdc4bd-vtk9r 1/1 Running 0 3m5s $ kubectl get svc -A NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 5m57s kube-system kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 5m56s kube-system traefik LoadBalancer 10.43.80.235 192.168.48.2 80:30107/TCP,443:31822/TCP,8080:31373/TCP 5m5s
traefikをLoadBalancerサービスとして使ってるってことなのかな。ふむふむ。
## Istio?
ふと。k3dでIstio動くんかな?と思って見てみたら
どうやらこの人はtraefikとIstioのポートがぶつかってたからtraefikを使わないようにしたらIstioが動いたっぽい。へー。
やってみるか。
### traefik抜きでk3dクラスターを生成
# さっきのクラスターを削除して $ k3d delete # traefik抜きのクラスターを作成 $ k3d create --server-arg --no-deploy --server-arg traefik # 設定を生成して $ export KUBECONFIG=$(k3d get-kubeconfig) # チェック $ kubectl get pod,svc -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system pod/local-path-provisioner-58fb86bdfd-h6npn 1/1 Running 0 13m kube-system pod/coredns-57d8bbb86-zkjkq 1/1 Running 0 13m NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 13m kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 13m
これでIstio入れてみるかな。
### Istioのインストール
・・・ってもうバージョン1.4か。こ、今月出たばっかりだし、1.3使っとこうかな。なんとなく。
https://github.com/istio/istio/releases/tag/1.3.5
からダウンロードしてきて、このページを見ながらインストールする。helm template
を使う方で入れる。Helmは既に入れてある。
https://istio.io/docs/setup/install/helm/
# Istio用のネームスペース作って $ kubectl create namespace istio-system # CRD入れて $ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f - # CRDの生成が終わるのを待つ $ kubectl -n istio-system wait --for=condition=complete job --all
あw。これまではwcコマンドつかって23個になるのを待ってたのに、wait使うようになってる。良い。で、Istioのインストール。
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
ありゃ。さくっと入ったっぽい。
kubectl get svc,pod -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-galley ClusterIP 10.43.10.191 <none> 443/TCP,15014/TCP,9901/TCP 2m21s service/istio-policy ClusterIP 10.43.86.131 <none> 9091/TCP,15004/TCP,15014/TCP 2m21s service/istio-telemetry ClusterIP 10.43.11.107 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 2m21s service/istio-pilot ClusterIP 10.43.126.19 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 2m21s service/prometheus ClusterIP 10.43.41.148 <none> 9090/TCP 2m21s service/istio-citadel ClusterIP 10.43.91.217 <none> 8060/TCP,15014/TCP 2m21s service/istio-sidecar-injector ClusterIP 10.43.117.133 <none> 443/TCP,15014/TCP 2m21s service/istio-ingressgateway LoadBalancer 10.43.69.0 192.168.96.2 15020:30845/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31842/TCP,15030:32247/TCP,15031:32685/TCP,15032:31093/TCP,15443:30499/TCP 2m21s NAME READY STATUS RESTARTS AGE pod/istio-init-crd-10-1.3.5-28hj7 0/1 Completed 0 5m40s pod/istio-init-crd-11-1.3.5-vmwmw 0/1 Completed 0 5m40s pod/istio-init-crd-12-1.3.5-84q77 0/1 Completed 0 5m40s pod/istio-security-post-install-1.3.5-jb66j 0/1 Completed 0 2m21s pod/svclb-istio-ingressgateway-ww22d 9/9 Running 0 2m21s pod/istio-citadel-5c67db5cb-hmhvb 1/1 Running 0 2m20s pod/prometheus-6f74d6f76d-tpjpc 1/1 Running 0 2m20s pod/istio-policy-66d87c756b-hf4wx 2/2 Running 3 2m21s pod/istio-galley-56b9fb859d-7jmsq 1/1 Running 0 2m21s pod/istio-sidecar-injector-5d65cfcd79-lhh6k 1/1 Running 0 2m20s pod/istio-pilot-64478c6886-9xm7b 2/2 Running 0 2m20s pod/istio-telemetry-5d4c4bfbbf-g4ccz 2/2 Running 4 2m20s pod/istio-ingressgateway-7b766b6685-5vwg5 1/1 Running 0 2m21s
こんなにスムーズに進むなんて・・・(疑い
サンプルアプリ動かしてみるか。
### bookinfoサンプルアプリをデプロイ
動作確認のために、Istioについてくるbookinfoサンプルアプリをデプロイしてみる。
https://istio.io/docs/examples/bookinfo/
# サイドカーの自動インジェクションを有効にして $ kubectl label namespace default istio-injection=enabled # デプロイして $ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml # watchでもしながらしばらく待つ $ kubectl get pods -w NAME READY STATUS RESTARTS AGE details-v1-78d78fbddf-5db8b 0/2 PodInitializing 0 37s reviews-v1-7bb8ffd9b6-rdgjc 0/2 PodInitializing 0 37s ratings-v1-6c9dbf6b45-p7567 0/2 PodInitializing 0 36s productpage-v1-596598f447-nj6wx 0/2 PodInitializing 0 36s reviews-v3-68964bc4c8-qrhc4 0/2 PodInitializing 0 37s reviews-v2-d7d75fff8-65f4q 0/2 PodInitializing 0 37s # bookinfo用のIngressGatewayを作成 $ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
LoadBalanerサービスのExternal IPを確認して
$ kubectl get svc -n istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 192.168.96.2
それをブラウザで開いたら・・・ありゃ。動いた。
http://{そのIPアドレス}/productpage
メモリ使用量はbookinfoをデプロイしただけだと2GiBくらい。
$ docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 598bd6d07c85 k3d-k3s-default-server 52.24% 1.909GiB / 15.4GiB 12.40% 819MB / 21.7MB 1.41MB / 818MB 899
何か起こったときの問題解決は難しそうだけど、ローカルでちょこっとためすのにはお手軽で良さそう。