2025/06/14

Kubernetes(クバネティス、K8s)

> [公式ドキュメント](https://kubernetes.io/ja/docs/home/)

# インストール
> [ツールのインストール](https://kubernetes.io/ja/docs/tasks/tools/)

- kubectl 
  > KubernetesクラスターにアクセスするためのCLI

- kind
  > ローカルのコンピューター上でKubernetesを実行することができるツール

# アーキテクチャ
> [Kubernetesクラスターを構成するコンポーネント](https://kubernetes.io/ja/docs/concepts/overview/components/)
- コントロールプレーンコンポーネント
  - kube-apiserver
    > Kubernetesコントロールプレーンのフロントエンド

  - etcd
    > キーバリューストアで、Kubernetesの全てのクラスター情報の保存場所

  - kube-scheduler
    > Podをノードに割り当てる役割

  - kube-controller-manager
    > 複数のコントローラープロセスを実行

  - cloud-controller-manager
    > クラウド特有の制御ロジックを組み込む

- ノードコンポーネント
  - kubelet
    > クラスター内の各ノードで実行されるエージェント

  - kube-proxy
    > クラスター内の各nodeで動作しているネットワークプロキシで、KubernetesのServiceコンセプトの一部を実装

  - コンテナランタイム
    > コンテナの実行を担当するソフトウェア。次の複数のコンテナランタイムをサポート。 Docker、containerd、CRI-O、 および全ての Kubernetes CRI (Container Runtime Interface) 実装

```
kubectl get pod --namespace kube-system
```

## クラスターのアーキテクチャ
> [Kubernetesクラスターのアーキテクチャ](https://kubernetes.io/ja/docs/concepts/architecture/)

---
# マニフェスト
## Kubernetesオブジェクト
> [Kubernetesオブジェクトを記述する](https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B)

## 主なKubernetesオブジェクトの種類
- [**Pod**](https://kubernetes.io/ja/docs/concepts/workloads/pods/)
  > Podは、Kubernetes内で作成・管理できるコンピューティングの最小のデプロイ可能なユニットです。

- [**Replicaset**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/)
  > ReplicaSetはどんな時でも指定された数のPodのレプリカが稼働することを保証します。

- [**Deployment**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/)
  > Deployment はPodとReplicaSetの宣言的なアップデート機能を提供します。
  - 更新戦略
    - StrategyType
      - Recreate
      - RollingUpdate
    - RollingUpdateStrategy
      - maxUnavailable
        更新処理において利用不可となる最大のPod数
      - maxSurge
        理想状態のPod数を超えて作成できる最大のPod数
      - **maxUnavailableは切り下げ、maxSurgeは切り上げ**

- [**Service**](https://kubernetes.io/ja/docs/concepts/services-networking/service/)
  > KubernetesにおけるServiceとは、 クラスター内で1つ以上のPodとして実行されているネットワークアプリケーションを公開する方法です。
  - Type
    - ClusterIP(デフォルト)
    - NodePort
    - LoadBalancer
    - ExternalName

- [**ConfigMap**](https://kubernetes.io/ja/docs/concepts/configuration/configmap/)
  > ConfigMapは、 機密性のないデータをキーと値のペアで保存するために使用されるAPIオブジェクトです。

- [**Secret**](https://kubernetes.io/ja/docs/concepts/configuration/secret/)
  > Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクトのことです。

- [**Job**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/job/)
  > Jobは一つ以上のPodを作成し、指定された数のPodが正常に終了するまで、Podの実行を再試行し続けます。

- [**CronJob**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/cron-jobs/)
  > CronJob は繰り返しのスケジュールによってJobを作成します。

## ヘルスチェック
- Readiness probe
  > コンテナがトラフィックを受け入れられる状態であるかを認識します。

- Liveness probe
  > Liveness Probeを使用して、コンテナをいつ再起動するかを認識します。 

- Startup probe
  > コンテナアプリケーションの起動が完了したかを認識します。

> [Liveness Probe、Readiness ProbeおよびStartup Probeを使用する](https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)


## PodのQuality of Service(QoS)Classes
> [PodにQuality of Serviceを設定する](https://kubernetes.io/ja/docs/tasks/configure-pod-container/quality-service-pod/)
- Guaranteed
- Burstable
- BestEffort

## 複数NodeでのPodのスケジューリング制御
> [ノード上へのPodのスケジューリング](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/)
- Node selector
- Affinity/Anti-affinity
  - Node affinity
  - Pod affinity
  - Pod anti-affinity

> [Podトポロジー分散制約](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/topology-spread-constraints/)
- Pod Topology Spread Constraints

> [TaintとToleration](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/taint-and-toleration/)
- Taint
- Toleration

> [Podの優先度とプリエンプション](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/pod-priority-preemption/)
- pod Priority
- Preemption

> [Horizontal Pod Autoscalerウォークスルー](https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)
- Horizontal Pod Autoscaler(HPA)
- Vertical Pod Autoscaler

> [アプリケーションにDisruption Budget指定する](https://kubernetes.io/ja/docs/tasks/run-application/configure-pdb/)
- minAvailable 
- maxUnavailable

---
# コマンド
> [kubectlチートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/)

## マニフェストをKubernetesクラスターに適用する(kubectl apply)
```
Usage:  kubectl apply --filename <ファイル名>
Example:
$ kubectl apply myapp.yaml --namespace default
```

## リソースを取得する(kubectl get)
```
Usage:  kubectl get <リソース名>
Example:
$ kubectl get nodes --namespace default
$ kubectl get nodes --output wide
$ kubectl get pod --namespace default
$ kubectl get pod --all-namespaces
$ kubectl get pod myapp --output wide --namespace default
$ kubectl get pod myapp --output yaml --namespace default
$ kubectl get pod --selector app=myapp
$ kubectl get pod,replicaset,deployment
# モニタリング
$ kubectl get pod --watch
```

### --output(-o)でjsonpathでフィールドを指定して取得する
```
Example:
$ kubectl get pod myapp --output jsonpath='{@}'
$ kubectl get pod myapp --output jsonpath='{.spec.containsers[].image}'
```
### --vでkubectlの出力結果のログレベルを変更する
```
Example:
$ kubectl get pod myapp --v=7
$ kubectl get pod --v=7 --namespace kube-system
```

## リソースの詳細を取得する(kubectl describe)
```
Usage:  kubectl describe <リソース名>
Example:
$ kubectl describe pod <Pod名> --namespace default
```

## コンテナのログを取得する(kubectl logs)
```
Usage:  kubectl logs <リソース名>
# Print the logs for a container in a pod or specified resource. If the pod has only one container,
the container name is optional.
Example:
$ kubectl logs myapp
$ kubectl logs myapp --container myserver
$ kubectl logs deploy/<Deployment名>
$ kubectl logs --selector app=myapp
```

## デバッグ用のサイドカーコンテナを立ち上げる(kubectl debug)
```
Usage:  kubectl debug --stdin --tty <デバッグ対象Pod名> --image=<デバッグ用コンテナのimage> --target=<デバッグ対象のコンテナ名>
Example:
$ kubectl debug --stdin --tty myapp --image=curlimages/curl:latest --target=myserver --namespace default --sh
```

## コンテナを即座に実行する(kubectl run)
```
Usage:  kubectl run <Pod名> --image=<イメージ名>
Example:
$ kubectl --namespace default run busybox --image=busybox:latest --rm --stdin --tty --restart=Never --command -- nslookup example.com
```

## コンテナにログインする(kubectl exec)
```
Usage:  kubectl exec --stdin --tty <Pod名> -- <コマンド>
Example:
$ kubectl exec --stdin --tty myapp -- /bin/sh
```

## ポートフォワーディング(kubectl port-forward)
```
Usage:  kubectl port-forward <リソース名> <転送先ポート番号>:<転送元ポート番号>
# Use resource type/name such as deployment/mydeployment to select a pod. Resource type defaults to 'pod' if omitted.
Example:
$ kubectl port-forward myapp 5555:8080 --namespace default
$ kubectl port-forward deployment/hello-server 5555:8080 --namespace default
```

## マニフェストを編集する(kubectl edit)
```
Usage:  kubectl edit <リソース名>
Example:
$ kubectl edit pod myapp --namespace default
```

## リソースを削除する(kubectl delete)
```
Usage:  kubectl delete <リソース名>
Example:
$ kubectl delete pod myapp --namespace default
$ kubectl delete replicaset httpserver --namespace default
```

## Deploymentを利用したリソースを再起動する(kubectl rollout)
```
Usage:  kubectl rollout restart <リソース名>
Example:
$ kubectl rollout restart deployment/abc
```

## トラブルシューティング
### 1. Pod内からアプリケーションの接続確認を行う
```
Example:
$ kubectl --namespace default debug --stdin --tty <Pod名> --image=curlimages/curl --container=debug-container -- sh
```

### 2. クラスタ内かつ別Podから接続確認を行う
```
Example:
$ kubectl --namespace default run curl --image curlimages/curl --rm --stdin --tty --restart=Never --command -- curl <PodのIP>:8080
```

### 3. クラスタ内かつ別PodからService経由で接続確認を行う
```
Example:
$ kubectl --namespace default run curl --image curlimages/curl --rm --stdin --tty --restart=Never --command -- curl <ServiceのIP>:8080
```

# カスタマイズ
- [オートコンプリート](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-linux/#%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E8%A3%9C%E5%AE%8C%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
- エイリアス
- SHORTNAMES
```
$ kubectl api-resources
```
- [ログ出力(stern)](https://github.com/stern/stern)
- [コンテキストとNamespaceの切り替え(kubectx/kubens)](https://github.com/ahmetb/kubectx)

0 件のコメント:

コメントを投稿

人気の投稿