Kubernetes

DevOpsコンテナKubernetesオーケストレーションマイクロサービスクラウドネイティブCNCF

DevOpsツール

Kubernetes

概要

Kubernetesは、コンテナオーケストレーションの業界標準として、大規模なコンテナ化アプリケーションの自動デプロイ、スケーリング、管理を行うオープンソースプラットフォームです。

詳細

Kubernetes(クーバネティス、K8sとも略記)は、2014年にGoogleが開発・オープンソース化したコンテナオーケストレーションプラットフォームです。GoogleのBorgシステムで培われた15年以上のコンテナ運用ノウハウを基盤とし、現在はCloud Native Computing Foundation(CNCF)のもとで開発されています。宣言的設定により望ましい状態を定義し、システムがその状態を自動維持。Pod、Service、Deployment、Namespace等の抽象化レイヤーにより、複雑なマイクロサービスアーキテクチャを効率的に管理します。自動スケーリング、ローリングアップデート、セルフヒーリング、サービスディスカバリ、ロードバランシング等の高度な機能を内蔵。AWS EKS、Google GKE、Azure AKS等のマネージドサービスが広く利用され、Netflix、Spotify、Airbnb、The New York Times等の大手企業で本格運用。現在では事実上のコンテナオーケストレーション標準として、クラウドネイティブアプリケーション開発の中核技術となっています。

メリット・デメリット

メリット

  • 自動スケーリング: HPA、VPAによる需要に応じた自動拡縮
  • 高可用性: セルフヒーリングと自動復旧機能
  • 宣言的管理: YAMLによる望ましい状態の定義と自動維持
  • ポータビリティ: マルチクラウド・ハイブリッドクラウド対応
  • 豊富なエコシステム: CNNCFプロジェクトとの連携
  • 標準化: 業界標準としての地位とスキル転用性
  • マイクロサービス対応: 複雑な分散システムの効率的管理
  • 開発・運用の分離: 開発者とオペレーターの責任分離

デメリット

  • 複雑性: 学習コストと運用の複雑さ
  • リソース消費: クラスター自体のオーバーヘッド
  • ネットワーク設定: CNI、Ingress、Service Meshの複雑さ
  • ストレージ管理: 永続ボリュームとStatefulSetの設計課題
  • セキュリティ: RBAC、Pod Security Standards等の設定複雑性
  • 監視・ログ: 分散システム特有の可観測性の課題
  • バージョン管理: 頻繁なアップデートと互換性の考慮
  • 小規模環境でのオーバーエンジニアリング: 単純なアプリには過剰

主要リンク

書き方の例

Hello World Pod

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-pod
  labels:
    app: hello
spec:
  containers:
  - name: hello-container
    image: nginx:alpine
    ports:
    - containerPort: 80
# デプロイと確認
kubectl apply -f pod.yaml
kubectl get pods
kubectl port-forward hello-pod 8080:80

Deployment(レプリカ管理)

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.24
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

Service(ネットワーク公開)

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

ConfigMapとSecret

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database.host: "db.example.com"
  database.port: "5432"
  app.properties: |
    debug=true
    log.level=info

---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  username: dXNlcm5hbWU=  # base64 encoded 'username'
  password: cGFzc3dvcmQ=  # base64 encoded 'password'

Horizontal Pod Autoscaler

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

Ingress(外部公開)

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

kubectl 基本操作

# クラスター情報
kubectl cluster-info
kubectl get nodes
kubectl get namespaces

# リソース管理
kubectl get pods --all-namespaces
kubectl get deployments
kubectl get services
kubectl get ingress

# アプリケーション管理
kubectl apply -f .                    # ディレクトリ内全YAML適用
kubectl delete -f deployment.yaml     # リソース削除
kubectl scale deployment web-deployment --replicas=5

# デバッグ・トラブルシューティング
kubectl describe pod <pod-name>       # 詳細情報
kubectl logs <pod-name>              # ログ確認
kubectl exec -it <pod-name> -- /bin/sh # コンテナ内アクセス
kubectl port-forward service/web-service 8080:80

# 監視・メトリクス
kubectl top nodes                     # ノードリソース使用量
kubectl top pods                      # Podリソース使用量
kubectl get events --sort-by='.lastTimestamp'