Kubernetesお勉強その7【環境構築】Istioに入門してみる
kubernetesってやっぱりマイクロサービスで使うことを想定しているわけだからやっぱりサービスメッシュとか大事になってくるわけで。さくっとそのサービスメッシュを管理してくれるIstioを試してみました。といってもサンプルの手順なぞっただけでほとんどコピペですが・・・。
ロギングとか、認証・認可とかコンテナの制御系周りでビジネスに関係ないとこは切り出してPODがビジネスロジックに集中できるような仕組みのようなもんという理解です。(正解かどうかは知らんけど)
PODがマイクロサービスを担うような感じにしたいので、マイクロサービスとして共通のものを一々POD毎に書いてられっかというのが背景にあるのかなと、結局最後はドメイン駆動設計に行き着く感じなんかなぁと思いました。
けどSOAとどこが違うんすっかとモヤモヤとしつつ手を動かしました。手を動かすところはほかの先人のサイトのコピペばかりなのであまり役に立たないかもしれないです。
◆手順
# 1.FireWall設定(FireWallを一旦リセットし内部からの通信のみ許可)
$ sudo ufw reset
$ sudo ufw enable
$ sudo ufw allow from 192.168.0.0/24
$ sudo ufw reload
# 2.Istioctlインストール
$ curl -L https://istio.io/downloadIstio | sh -
$ cd
$ echo 'export PATH="$PATH:/home/youruser/istio-1.13.0/bin"' | tee -a .bashrc
$ source .bashrc
$ istioctl x precheck
# 3.metallb準備(IstioでLoadBarancer使うので事前準備)
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.0/manifests/namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.0/manifests/metallb.yaml
$ cat << EOF > config/metallb-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.0.20-192.168.0.30
EOF
$ kubectl apply -f config/metallb-configmap.yaml
$ kubectl -n metallb-system get all
# 4.デモ環境インストール
$ istioctl manifest apply --set profile=demo
$ sudo chown -R youruser:yourgroup ~/.kube/cache
$ kubectl get all -n istio-system
# 5.サンプルアプリ構築
$ cd istio-1.13.0/
$ kubectl create namespace sample-app
$ kubectl label namespace sample-app istio-injection=enabled
$ kubectl get ns sample-app --show-labels
$ kubectl apply -f ./samples/bookinfo/platform/kube/bookinfo.yaml -n sample-app
$ kubectl apply -f ./samples/bookinfo/networking/bookinfo-gateway.yaml -n sample-app
# 6.動作確認
$ kubectl exec "$(kubectl get pod -n sample-app -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -n sample-app -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
$ kubectl logs -n sample-app "$(kubectl get pod -n sample-app -l app=productpage -o jsonpath={.items..metadata.name})" -c istio-proxy | tail -5
# アプリケーションの外部公開
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ curl -s "http://${INGRESS_HOST}:${INGRESS_PORT}/productpage" | grep -o "<title>.*</title>"
$ echo http://${INGRESS_HOST}:${INGRESS_PORT}/productpage
# 出力されたURLにアクセスする
$ kubectl logs -n sample-app "$(kubectl get pod -n sample-app -l app=productpage -o jsonpath={.items..metadata.name})" -c istio-proxy | tail -3
# アドオン適用
$ kubectl apply -f ./samples/addons
$ kubectl get pod -n istio-system
# アドオン起動
$ istioctl dashboard kiali &
$ istioctl dashboard grafana &
$ istioctl dashboard jaeger &
# アドオンポートフォワード
$ kubectl -n istio-system port-forward svc/kiali 31780:20001 --address 0.0.0.0 &
$ kubectl -n istio-system port-forward svc/grafana 31779:3000 --address 0.0.0.0 &
$ kubectl -n istio-system port-forward svc/prometheus 31778:9090 --address 0.0.0.0 &
$ kubectl -n istio-system port-forward \
$(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 31777:16686 \
--address 0.0.0.0 &
# 7.後片付け
$ killall istioctl
$ cd ~/istio-1.13.0
$ kubectl delete -f ./samples/bookinfo/platform/kube/bookinfo.yaml -n sample-app
$ kubectl -n sample-app get all
$ kubectl delete namespaces sample-app
$ istioctl x uninstall --purge
$ cd
$ kubectl delete -f config/metallb-configmap.yaml
$ kubectl delete -f https://raw.githubusercontent.com/metallb/metallb/v0.12.0/manifests/metallb.yaml
$ kubectl delete -f https://raw.githubusercontent.com/metallb/metallb/v0.12.0/manifests/namespace.yaml
◆参考資料
・Istio
https://ascii.jp/elem/000/004/044/4044285/
https://qiita.com/ishishow/items/401629972bea46c680f6
https://blog.pepese.com/entry/k8s-istio-basics/
https://amateur-engineer-blog.com/getting-started-istio/
https://zenn.dev/tkoyama/articles/c49b35c32e4923
https://qiita.com/prodigy413/items/f7e2f25b094aa31d155a
https://istio.io/latest/docs/examples/microservices-istio/setup-kubernetes-cluster/
https://knowledge.sakura.ad.jp/20489/
https://techstep.hatenablog.com/entry/2020/12/26/112229
・サンプル確認
https://atmarkit.itmedia.co.jp/ait/articles/2111/05/news005.html
https://qiita.com/suzuyui/items/f5142414c63b9af84291
https://zaki-hmkc.hatenablog.com/entry/2020/07/26/184849
https://qiita.com/erb_owl/items/dfb322ceaecdb02952e8
・MetalLB(IstioのIngressでLoadBarancerが使いたかったので使用)
https://zaki-hmkc.hatenablog.com/entry/2020/07/10/235944
https://www.kaitoy.xyz/2020/10/31/metallb/
https://blog.framinal.life/entry/2020/04/16/022042
https://qiita.com/prodigy413/items/3a24ff85819dc5eafe25
・Istioアンインストール
https://kamotora.net/system/container/kubernetes/istio-uninstall/
https://qiita.com/reoring/items/f2da66f3cad95b9342ea
あとはHelmとかあるみたいですが、まぁインフラはもうこんなもんで良くてそろそろバックエンドアプリとかそっちの方を試したほうがいいのではと思ったんですが、kubernetesが必要となるほどの規模のアプリなど個人で書くこともないんじゃないかと、気が向いたらなんかAPI的なものを作ってみてお勉強してみようとか思う次第です。いったんkubernetesはこれでいいかな
コメント