Kubernetesとは
Kubernetes完全ガイド
Section titled “Kubernetes完全ガイド”Kubernetesは、コンテナオーケストレーションプラットフォームです。コンテナのデプロイ、スケーリング、管理を自動化します。実務で使える実装例とベストプラクティスを詳しく解説します。
1. Kubernetesとは
Section titled “1. Kubernetesとは”Kubernetesの役割
Section titled “Kubernetesの役割”Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのプラットフォームです。
開発者 ↓コンテナイメージ(Docker) ↓Kubernetesクラスター ├─ Pod(コンテナの実行単位) ├─ Deployment(Podの管理) ├─ Service(ネットワーク) └─ Ingress(外部アクセス)なぜKubernetesが必要か
Section titled “なぜKubernetesが必要か”問題のある構成(Kubernetesなし):
# 問題: 手動でのコンテナ管理# 1. コンテナを手動で起動docker run -d my-app:latest
# 2. トラフィック増加時に手動でスケールdocker run -d my-app:latestdocker run -d my-app:latest
# 3. 障害発生時に手動で復旧docker ps # 停止したコンテナを確認docker start container-id # 手動で再起動
# 問題点:# 1. 手動管理が必要(時間がかかる)# 2. スケーリングが困難(手動でコンテナを追加)# 3. 障害復旧が遅い(手動で対応)# 4. ロードバランシングが困難解決: Kubernetesによる自動化
# 解決: Kubernetesによる自動管理apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: replicas: 3 # 3つのPodを自動的に維持 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:latest ports: - containerPort: 8080 resources: requests: memory: "128Mi" cpu: "100m" limits: memory: "256Mi" cpu: "200m" livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5
# メリット:# 1. 自動管理(Podの起動、停止、再起動)# 2. 自動スケーリング(トラフィックに応じて自動スケール)# 3. 自動障害復旧(Podが停止したら自動で再起動)# 4. ロードバランシング(Serviceが自動で負荷分散)2. 基本概念
Section titled “2. 基本概念”Podは、Kubernetesの最小実行単位です。1つ以上のコンテナを含むことができます。
apiVersion: v1kind: Podmetadata: name: my-podspec: containers: - name: app image: my-app:latest ports: - containerPort: 8080 - name: sidecar image: sidecar:latestDeployment
Section titled “Deployment”Deploymentは、Podのレプリカを管理し、ローリングアップデートやロールバックを提供します。
apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:latest ports: - containerPort: 8080 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0Service
Section titled “Service”Serviceは、Podへのアクセスを提供し、ロードバランシングを行います。
apiVersion: v1kind: Servicemetadata: name: my-app-servicespec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancerNamespace
Section titled “Namespace”Namespaceは、リソースを論理的に分割します。
apiVersion: v1kind: Namespacemetadata: name: production3. 実務でのKubernetes設定
Section titled “3. 実務でのKubernetes設定”ヘルスチェック
Section titled “ヘルスチェック”apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: template: spec: containers: - name: my-app image: my-app:latest # 生存確認(Liveness Probe) livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 # 準備完了確認(Readiness Probe) readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 3リソース制限
Section titled “リソース制限”apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: template: spec: containers: - name: my-app image: my-app:latest resources: requests: memory: "128Mi" cpu: "100m" limits: memory: "256Mi" cpu: "200m"自動スケーリング
Section titled “自動スケーリング”apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: my-app-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 704. Ingress
Section titled “4. Ingress”Ingressとは
Section titled “Ingressとは”Ingressは、クラスター外部からのHTTP/HTTPSトラフィックをServiceにルーティングします。
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-app-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prodspec: tls: - hosts: - example.com secretName: example-com-tls rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 805. ConfigMapとSecret
Section titled “5. ConfigMapとSecret”ConfigMap
Section titled “ConfigMap”apiVersion: v1kind: ConfigMapmetadata: name: my-app-configdata: database_url: "postgresql://localhost:5432/mydb" log_level: "info"Secret
Section titled “Secret”apiVersion: v1kind: Secretmetadata: name: my-app-secrettype: Opaquedata: password: cGFzc3dvcmQxMjM= # base64エンコードapiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: template: spec: containers: - name: my-app image: my-app:latest env: - name: DATABASE_URL valueFrom: configMapKeyRef: name: my-app-config key: database_url - name: PASSWORD valueFrom: secretKeyRef: name: my-app-secret key: password6. よくある問題と解決策
Section titled “6. よくある問題と解決策”問題1: Podが起動しない
Section titled “問題1: Podが起動しない”原因:
- イメージが存在しない
- リソースが不足している
- ヘルスチェックが失敗している
解決策:
# Podの状態を確認kubectl get pods
# Podのログを確認kubectl logs <pod-name>
# Podの詳細を確認kubectl describe pod <pod-name>問題2: サービスに接続できない
Section titled “問題2: サービスに接続できない”原因:
- Serviceのセレクタが間違っている
- Podのラベルが一致していない
解決策:
# Serviceの詳細を確認kubectl describe service <service-name>
# Podのラベルを確認kubectl get pods --show-labelsこれで、Kubernetesの基礎知識と実務での使い方を理解できるようになりました。