最近の更新 | |
---|---|
ドライランのありがたみを改めて知る
| 2024/04/04 |
伊豆半島
| 2024/03/31 |
お出かけチェックリスト
| 2024/03/29 |
Ruby
| 2024/03/27 |
Kubernetes
| 2024/03/22 |
音楽データをDisplayAudioで聞く
| 2024/03/09 |
Redmine
| 2024/02/05 |
git
| 2024/02/02 |
経済
| 2024/01/08 |
どうする家康
| 2023/12/17 |
MX-Linux
| 2023/11/06 |
國體関連学-休学のご連絡
| 2023/08/13 |
Debian
| 2023/08/02 |
CentOS
| 2023/06/13 |
Dell-XPS13
| 2023/05/23 |
ベルト
| 2023/05/18 |
SourceForge
| 2023/04/17 |
確定申告
| 2023/02/19 |
さらば「まぐまぐ」
| 2023/01/09 |
風猷縄学
| 2022/11/23 |
kubectl kustomize - kustomize ファイルからマニフェストを生成
pod ∋ containers
service ∋ pods
実際のマシン(or vm)
各オブジェクト(pod, node, service, etc.)の設定ファイル *.yaml
wikipedia が分かりやすかった。要はプログラム、かな。
k8s パッケージマネージャ
https://github.com/kubernetes/minikube より
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb && sudo dpkg -i minikube_1.3.1.deb
yes と出たら ok$ egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
$ uname -m
$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
$ sudo adduser `id -un` libvirtd
$ groups ... libvirtd ...
何も出なければ ok$ virsh list --all Id 名前 状態 ----------------------------------------------------
僕のPCでは ハード的には Hyper Threading Tech. は enabled になっている。 linux の boot option で対応する必要があった。/etc/default/grub:$ virt-host-validate ... QEMU: 確認中 if IOMMU is enabled by kernel: 警告 (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
なお、ググると「'on' よりも 'pt' が良い」と言う記述もあったけど、 僕の環境(Hard or OS)では pt では何も変わらなかった。 で、 on にして再度実行しても変わらないorz... GRUB_CMDLINE_LINUX="... intel_iommu=on ..."
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \ && sudo install docker-machine-driver-kvm2 /usr/local/bin/
$ minikube config set vm-driver kvm2
$ minikube start --vm-driver=kvm2
Kubectl の install
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/
状態確認
$ kubectl version $ kubectl cluster-info $ kubectl get po -A
メモリ上限を 2G -> 4G (4G は今の環境ではやや重い? 3G 辺りが良いか?)
$ minikube config set memory 4096
ダッシュボード(ブラウザでダッシュボードが表示される)
$ minikube dashboard &
echoserver なるイメージを 'hello-minikube' と名づけて実行。$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
サービスを外部からアクセス可能とする。$ kubectl expose deployment hello-minikube --type=NodePort
$ minikube service hello-minikube
start second local cluster(注! 激重)
$ minikube start -p cluster2
stop
$ minikube stop
delete
$ minikube delete
Prometheus Demo が、 k8s + prometheus を触るのにちょうど良さげ。
$ git clone https://github.com/bakins/minikube-prometheus-demo.git $ cd minikube-prometheus-demo
設定情報は monitoring-namespace.yaml にある。$ kubectl apply -f monitoring-namespace.yaml
$ kubectl apply -f prometheus-config.yaml
さくっと終わるけど、"deploy" は終わったそうな。 minikube dashboard でネームスペースを 'monotoring' に切り替えると、 デプロイメントとポッドが作成されているのが分かる。$ kubectl apply -f prometheus-deployment.yaml
これもさくっと終わる。 prometheus を web で見るのは以下:$ kubectl apply -f prometheus-service.yaml
$ minikube service --namespace=monitoring prometheus
$ kubectl apply -f grafana-deployment.yaml $ kubectl apply -f grafana-service.yaml
起動に少し時間がかかる模様(数分?)
$ minikube service --namespace=monitoring grafana
URL http://192.168.39.149:31688 にアクセスされる。
(或いは、後述の ingress 経由であれば https://[minikube-IP]/grafana でも ok。 ここで [minikube-IP] は minikube ip で知ることの出来る IP)。
https://github.com/bakins/minikube-prometheus-demo より
name: | 任意(例: MyName) |
type: | Prometheus |
URL: | http://prometheus:9090 |
datasource: | 上で設定した名前 |
式: | sum(container_memory_usage_bytes) by (pod_name) |
単純に以下だと積み上げグラフ:
sum(container_cpu_usage_seconds_total) by (namespace)
https://www.weave.works/blog/aggregating-pod-resource-cpu-memory-usage-arbitrary-labels-prometheus/ より:
sum(rate(container_cpu_usage_seconds_total[5m])) by (namespace)
ノード(サーバ(オンプレ、vm問わず))からのデータ収集 フォーマットさえ合っていれば実装は何でも良い。
全 node (minikube の場合は 1 node)に node exporter をデプロイする:
$ kubectl apply -f node-exporter-daemonset.yml
spec.revisionHistoryLimit: 3 にして apply する。
$ kubectl -n monitoring get deployment,rs,pods
deployment - 変わらず
rs before
NAME DESIRED CURRENT READY AGE replicaset.extensions/prometheus-59b8c86b6 1 1 1 38m replicaset.extensions/prometheus-6bcbdd76d9 0 0 0 26h replicaset.extensions/prometheus-b9c59df75 0 0 0 49m replicaset.extensions/prometheus-d67d7ddd8 0 0 0 59m
after
NAME DESIRED CURRENT READY AGE replicaset.extensions/prometheus-59b8c86b6 0 0 0 40m replicaset.extensions/prometheus-6d4668b58b 1 1 1 114s replicaset.extensions/prometheus-b9c59df75 0 0 0 51m replicaset.extensions/prometheus-d67d7ddd8 0 0 0 61m
一番古い rs が消えている。
pods - 新しい rs で稼働している
grafana にアクセスする際、
$ minikube service -n monitoring grafana
URL は http://192.168.39.149:31688 とかなのだけど、この IP はどこから来るのだろうか?
ちなみに pod に入って IP を表示してみると
$ kubectl -n monitoring exec -it grafana-f7ff858d6-8p6rc bash # ip a ... eth0@if17:mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:07 brd ff:ff:ff:ff:ff:ff inet 172.17.0.7/16 brd 172.17.255.255 scope global eth0
と全然別物。
minikube ホストマシンで ifconfig すると
virbr1 Link encap:イーサネット ハードウェアアドレス fe:f4:e8:d6:55:a3 inetアドレス:192.168.39.1 ブロードキャスト:192.168.39.255 マスク:255.255.255.0 ...
なので、 KVM で動作している仮想環境の模様。
$ kubectl -n monitoring get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana NodePort 10.110.200.1813000:31688/TCP 26h
なので、KVM -> service
詳細は下記
$ kubectl describe -n monitoring services/grafana ... NodePort:31688/TCP
IP は minikube 自身の vm
$ minikube ip 192.168.39.149
なるほど、この IP にアクセスする、ということか。
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/expose/expose-interactive/ が参考になる。"type: NodePort" とはそういうことらしい。
$ kubectl describe deployment -n monitoring
label を知る:
$ kubectl describe deployment -n monitoring ... Labels: name=grafana
label でアクセス:
$ kubectl get pods -n monitoring -l name=grafana NAME READY STATUS RESTARTS AGE grafana-f7ff858d6-8p6rc 1/1 Running 3 41h
https://developers.freee.co.jp/entry/kubernetes-ingress-controller
NodePort LoadBalancer Ingress 比較記事
K8s デフォルト機能。クラスタ内アプリのためのもの。
$ kubectl proxy
pods 一覧
$ kubectl get pods -n monitoring -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' ... grafana-f7ff858d6-8p6rc
API? proxy? 経由で accss
http://localhost:8001/api/v1/namespaces/monitoring/pods/grafana-f7ff858d6-8p6rc/proxy
注: これ の URL は正しくなさ気。
proxy 経由は debug 目的に限定とのこと。
ノードの IP/host名 に依存しているので production には向かない。
k8s 内部で稼働する LoadBalancer。Google 推奨
minikube では下記で可能らしい(https://cstoku.dev/posts/2018/k8sdojo-22/ より)
$ minikube addons enable ingress
ダッシュボード > namespace=="monitoring" > イングレス、にあるエンドポイント にアクセスすることで grafana にアクセスできる。
IP 情報を得る:
$ kubectl get ingress -n monitoring
-l で絞れる模様。chatops を例に:
$ kubectl logs -f -n bizside -l app=chatops-app --max-log-requests 10
$ kubectl logs -f -n bizside --since=0s -l app=chatops-app --max-log-requests 10
$ kubectl desc nodes # all nodes $ kubectl desc nodes ip-172-23-129-135.ap-northeast-1.compute.internal # specific node
Configuration Best Practice によると、関連するグループで1つの yaml にまとめるのが良いとのこと:
Group related objects into a single file whenever it makes sense
pod 名を知り...:
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default hello-minikube-64c7df9db-h4d5q 1/1 Running 0 163m
bash を起動:
$ kubectl exec -it hello-minikube-64c7df9db-h4d5q bash
$ minikube ssh
$ ssh ec2-user@[ノードホスト名]
$ kubectl get pods --all-namespaces ... kube-system nginx-ingress-controller-5d9cf9c69f-bqv8w 1/1 Running 5 3d $ ingress_pod='-n kube-system nginx-ingress-controller-5d9cf9c69f-bqv8w'
$ kubectl exec $ingress_pod cat /etc/nginx/nginx.conf
$ kubectl logs $ingress_pod | lv ------------------------------------------------------------------------------- NGINX Ingress controller Release: 0.25.0 Build: git-1387f7b7e Repository: https://github.com/kubernetes/ingress-nginx ------------------------------------------------------------------------------- ...
$ kubectl get deploy -n monitoring NAME READY UP-TO-DATE AVAILABLE AGE ... prometheus-core 1/1 1 1 7d20h
$ kubectl scale deployment prometheus-core --replicas=0 -n monitoring $ kubectl scale deployment prometheus-core --replicas=1 -n monitoring
ダッシュボード名をクリック > 右中頃に "Import dashboard"
ダッシュボード選択 > "Share" アイコン > Exportタブ > "Save to file"