Kubernetes



Sitemap | Profile | タグ一覧
最近の更新
ドライランのありがたみを改めて知る
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


[-] 1. TODO

[-] 1.1. kustomize

kubectl kustomize     - kustomize ファイルからマニフェストを生成

[-] 1.2. grafana で service 単位で集計するには?

[-] 2. 用語メモ

[-] 2.1. pod

pod ∋ containers

[-] 2.2. service

service ∋ pods

  1. サービスにはユニークな cluster-ip が割り当てられる。
    • サービスのライフスパン中は普遍

[-] 2.3. volume

  • 永続データの保存

[-] 2.4. node

実際のマシン(or vm)

[-] 2.5. 2次的なもの

[-] 2.5.1. manifest

各オブジェクト(pod, node, service, etc.)の設定ファイル *.yaml

[-] 2.5.2. controller

wikipedia が分かりやすかった。要はプログラム、かな。

[-] 2.6. helm

k8s パッケージマネージャ

[-] 3. Kubernetes on Ubuntu 16.04

[-] 3.1. install

https://github.com/kubernetes/minikube より

  1. minikube
    $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb && sudo dpkg -i minikube_1.3.1.deb
  2. Hypervisor enable H/W?
    $ egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
    yes と出たら ok
  3. ここでは KVM で進める。 KVM タブを選択 > Ubuntu 16.04 を選択
    1. 64bit OS であることを確認
      $ uname -m
    2. KVM をインストール
      $ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
    3. libvirtd グループに追加
      $ sudo adduser `id -un` libvirtd
    4. lougout & login し、libvirtd グループに所属していることを確認:
      $ groups
      ... libvirtd ...
    5. インストールされたことを確認:
      $ virsh list --all
       Id    名前                         状態
      ----------------------------------------------------
      何も出なければ ok
    6. 動作確認
      $ 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)
      僕のPCでは ハード的には Hyper Threading Tech. は enabled になっている。 linux の boot option で対応する必要があった。/etc/default/grub:
      ...
      GRUB_CMDLINE_LINUX="... intel_iommu=on ..."
      なお、ググると「'on' よりも 'pt' が良い」と言う記述もあったけど、 僕の環境(Hard or OS)では pt では何も変わらなかった。 で、 on にして再度実行しても変わらないorz
    7. Driver install
      $ curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 \
          && sudo install docker-machine-driver-kvm2 /usr/local/bin/
    8. config
      $ minikube config set vm-driver kvm2
    9. start
      $ 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 &

[-] 3.2. サンプル

  1. run
    $ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
    echoserver なるイメージを 'hello-minikube' と名づけて実行。
    • dashboard を見ると、それらしい名前の pod が作成されている。
  2. expose
    $ kubectl expose deployment hello-minikube --type=NodePort
    サービスを外部からアクセス可能とする。
  3. access
    $ minikube service hello-minikube

start second local cluster(注! 激重)

$ minikube start -p cluster2

stop

$ minikube stop

delete

$ minikube delete

[-] 4. Prometheus

Prometheus Demo が、 k8s + prometheus を触るのにちょうど良さげ。

  1. git clone
    $ git clone https://github.com/bakins/minikube-prometheus-demo.git
    $ cd minikube-prometheus-demo
  2. 'monitoring' 名前空間を作成
    $ kubectl apply -f monitoring-namespace.yaml
    設定情報は monitoring-namespace.yaml にある。
  3. Prometheus config
    $ kubectl apply -f prometheus-config.yaml
  4. Prometheus Pod の作成
    $ kubectl apply -f prometheus-deployment.yaml
    さくっと終わるけど、"deploy" は終わったそうな。 minikube dashboard でネームスペースを 'monotoring' に切り替えると、 デプロイメントとポッドが作成されているのが分かる。
  5. Service の作成
    $ kubectl apply -f prometheus-service.yaml
    これもさくっと終わる。 prometheus を web で見るのは以下:
    $ minikube service --namespace=monitoring prometheus

[-] 4.1. Grafana

$ 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)。

[-] 4.1.1. 設定

https://github.com/bakins/minikube-prometheus-demo より

  1. user/pass = admin/admin でログイン
  2. 左上アイコン → Data Source → Add data source でデータソース追加。値は:
    name:任意(例: MyName)
    type:Prometheus
    URL:http://prometheus:9090
    prometheus と言うホスト名は, k8s DNS が提供してくれている。
  3. 左上アイコン → Dashboard → New
    datasource:上で設定した名前
    式:sum(container_memory_usage_bytes) by (pod_name)
[-] 4.1.1.1. CPU usage by namespace

単純に以下だと積み上げグラフ:

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)

[-] 4.2. Node Exporter

ノード(サーバ(オンプレ、vm問わず))からのデータ収集 フォーマットさえ合っていれば実装は何でも良い。

全 node (minikube の場合は 1 node)に node exporter をデプロイする:

$ kubectl apply -f node-exporter-daemonset.yml

[-] 5. 実験

[-] 5.1. prometheus-deployment.yaml

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 で稼働している

[-] 5.2. grafana にアクセスする IP の由来

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.181           3000: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

[-] 5.3. label

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

[-] 5.4. Ingres を使う方法

[-] 5.5. proxy

$ 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 目的に限定とのこと。

[-] 5.6. NodePort

ノードの IP/host名 に依存しているので production には向かない。

[-] 5.7. LoadBalancer

[-] 5.7.1. Ingress

k8s 内部で稼働する LoadBalancer。Google 推奨

minikube では下記で可能らしい(https://cstoku.dev/posts/2018/k8sdojo-22/ より)

$ minikube addons enable ingress

ダッシュボード > namespace=="monitoring" > イングレス、にあるエンドポイント にアクセスすることで grafana にアクセスできる。

IP 情報を得る:

$ kubectl get ingress -n monitoring
[-] 5.7.1.1. URL prefix がうまく動かない。

[-] 6. Tips

[-] 6.1. logs -f

[-] 6.1.1. 複数pod に対する kubectl logs

-l で絞れる模様。chatops を例に:

$ kubectl logs -f -n bizside -l app=chatops-app --max-log-requests 10

[-] 6.1.2. 古いのはスキップして今から

$ kubectl logs -f -n bizside --since=0s -l app=chatops-app --max-log-requests 10

[-] 6.2. desc node に namespace は無い

$ kubectl desc nodes                                                    # all nodes
$ kubectl desc nodes ip-172-23-129-135.ap-northeast-1.compute.internal  # specific node

[-] 6.3. yaml はグループ単位で1つに集約する

Configuration Best Practice によると、関連するグループで1つの yaml にまとめるのが良いとのこと:

Group related objects into a single file whenever it makes sense

[-] 6.4. コンテナに入る

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

[-] 6.5. ノードに入る

[-] 6.5.1. minikube

$ minikube ssh

[-] 6.5.2. EKS

$ ssh ec2-user@[ノードホスト名]

[-] 6.6. nginx-ingress の 設定情報を見る

  1. nginx-ingress の pod 名を名前空間を知り、変数 ingress_pod にセット
    $ 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'
  2. kubectl exec でファイルにアクセス
    $ kubectl exec $ingress_pod cat /etc/nginx/nginx.conf
  3. ingress のバージョンを知る
    $ kubectl logs $ingress_pod | lv
    -------------------------------------------------------------------------------
    NGINX Ingress controller
      Release:    0.25.0
      Build:      git-1387f7b7e
      Repository: https://github.com/kubernetes/ingress-nginx
    -------------------------------------------------------------------------------
    ...

[-] 6.7. サービス再起動

  • 'monitoring' 名前空間内の prometheus-core deployment を再起動
    1. 名前を確認
      $  kubectl get deploy -n monitoring
      NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
      ...
      prometheus-core      1/1     1            1           7d20h
    2. 再起動!
      $ kubectl scale deployment prometheus-core --replicas=0 -n monitoring
      $ kubectl scale deployment prometheus-core --replicas=1 -n monitoring

[-] 6.8. Grafana Tips

[-] 6.8.1. Import & Export

[-] 6.8.1.1. Import

ダッシュボード名をクリック > 右中頃に "Import dashboard"

[-] 6.8.1.2. Export

ダッシュボード選択 > "Share" アイコン > Exportタブ > "Save to file"

[-] 7. 参考






Generated by juli 2.3.2