📌

Kubernetes(k8s) マイメモ

2023/11/09に公開

Kubernate用語

node

Kubernateのクラスターは複数のノードから構成される。
・ワーカーノード
・マスターノード→クラスター内のワーカーノードとPodを管理

PVC(PersistentVolumeClaim)

PVを利用するために必要

k8sの主なリソースに関して

Pod(ポッド)

「コンテナ」を管理するリソースで、複数のコンテナを1つのPodに含めることもできる。

ReplicaSet(レプリカセット)

Podの数を管理することが可能!!
(スケールアウトが容易になる。)
マニュフェストで管理する場合、Podオブジェクトに「ラベル」を付与しておき、selectorでラベルが付いたPodをセットしておく。

Deployment

レプリカセットの上位概念
デプロイ戦略を管理することが可能

Service

ClusterIP☛PodからPodへの通信を可能にする

kubectl

kubernetes APIを使用してKubernetesクラスターのコントロールプレーンと通信するためのコマンドラインツール

役割

Kubernetesクラスターを制御

インストール

https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

操作の前に

namespaceで区切られている場合は-nで指定しておく

kubectl -n <namespace名称> .....

Action(操作)

現在のコンテキストを確認
kubectl config current-context
kubectl config get-contexts 

A.名前空間

※namespaceもリソース
※kube-systemはシステムコンポーネント用のnamespace

★名前空間の取得

名前空間の一覧を取得する。
kubectl get namespace
(省略形)名前空間の一覧を取得する
kubectl get ns

★名前空間の作成

名前空間をコマンドから作成する
kubectl create namespace <作成した名前空間>
kubectl create -f <〇〇.yaml>
apiVersion: v1
kind: Namespace
metadata:
  name: test

★名前空間の切り替え

kubens <切り替えたい名前空間>

※-nオプションで毎回namespaceを指定する必要がなくなる。逆に言えばkubectlコマンドで同じことは実現できる。

A.リソースの作成/更新

クラスター内のリソースを作成および更新

あらかじめマニュフェストファイルを作成しておく(yaml)

yamlファイルを元に作成
kubectl apply -f <yamlファイル>

A.リソースの確認

podの確認
kuberctl get pods
より詳細なpodの確認
kubecrtl get pods -o wide
kubectl get pod [pod name] -o yaml
podに関する情報を取得する
kubectl describe pod <podの名称>

A.リソースの削除

podを削除する。
kubectl delete pod <podの名称>

A.起動したPodに入る

kubectl exec -it <podの名称> /bin/sh

kubernetesのマニュフェスト

・「マニフェスト」と呼ばれる形式で各種リソースを定義する(yaml)

・独自のイメージを利用したい場合はdockerfileを作成しておき、

docker build -t (イメージ名):(タグ名)

でイメージを作成しておけば良い。

Pod立ち上げの例(アップロード側のimageを使用)
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:20.04
    imagePullPolicy: IfNotPresent
    command: ["sleep", "infinity"]
    

command: ["sleep", "infinity"]がないと、即時終了してまた再起動を繰り返してしまう。

他のリソースから参照される場合

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  labels:
    app: ubuntuos

他のリソース(service)などから参照される場合はつけておく

GPUを利用する

GPUが利用できるk8sの場合 containersにreesourcesを追加する。

(省略)
spec:
  containers:
  - name: ubuntu
    image: ubuntu:20.04
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        nvidia.com/gpu: 1
    command: ["sleep", "infinity"]

Podの中に入り、「nvidia-smi」で確認すると良い。

イメージ部分

〇ローカル(ワークノード側!)からイメージを探す(imagePullPolicy: Never)

 spec:
      containers:
      - name: ubuntuos
        image: ubuntu
        imagePullPolicy: Never

環境変数の設定

環境変数はenvを使ってname-valueの形で定義できる。

spec:
  containers:
    - name: ubuntu
      image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
      env:
        - name: "discovery.type"
          value: "single-node"
        - name: "network.host"
          value: "0.0.0.0"
        - name: "ES_JAVA_OPTS"
          value: "-Xms512m -Xmx512m"

volumeの利用

〇Pod内のディスクを使用(emptyDir)
→Pod削除時にボリューも削除

〇Node内のディスクを使用(hostPass)
→ 異なるNodeのpodは共有不可

〇PV
→PVC経由で利用

kubeflow

コンテナレポジトリを用意する(Harbor)

K8s上で運用することができるコンテナレポジトリ

Discussion