はじめに

docker stack コマンドで、既存の docker-compose.yml を使ってk8sにアプリをデプロイできると聞いて調べてみたメモ。

オンプレのクラスタ環境に自前アプリをデプロイする状況を想定。

イメージのビルドとローカルregistryへの登録

docker stack というよりk8sはイメージのビルドをサポートしてないので、事前にビルドして、ローカルに立てたレジストリに登録、みたいなことが必要。

  • docker-compose-registry.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    version: "3"
    services:
      # registry for built images refered from k8s
      registry:
        image: registry:2
        hostname: registry
        restart: always
        ports:
          - 5000:5000
    
  • docker-compose-build.yml

    1
    2
    3
    4
    5
    6
    
    version: "3"
    services:
      name-of-service:
        build:
          context: directory-name
        image: image-name
    

    必要な分だけビルドする

  • イメージの登録

    1
    2
    3
    4
    5
    6
    7
    8
    
    # Build
    docker-compose -f docker-compose-build.yml build
    
    # Regitry
    docker-compose -f docker-compose-registry.yml up -d
    
    docker image tag image-name localhost:5000/image-name
    docker push localhost:5000/image-name
    

    registry は永続化していないので、docker-compose -f docker-compose-registry.yml down で消える。

ビルドしたイメージを参照する

k8sからは localhost:5000 として参照されるよう、ローカルリポジトリを指すようイメージを指定する。

  • docker-compose.yml
    1
    2
    3
    4
    5
    
    version: "3"
    services:
      name-of-service:
        image: localhost:5000/image-name
        ...
    

動かしてみる

デプロイ

1
docker stack deploy --orchestrator=kubernetes -c docker-compose.yml name-of-app

サービスごとにpodが作れられる。

ちなみに、以下のオプションはdocker stackでサポートされていない。

  • build
  • cgroup_parent
  • container_name
  • devices
  • tmpfs
  • external_links
  • links
  • network_mode
  • restart
  • security_opt
  • userns_mode

参考: https://docs.docker.com/compose/compose-file/

Ingress

注意: 結局動いていない。パスでサービスを解決したくなったら調査して追記する。

外部からサービスにアクセスするための口を作る。 参考: https://kubernetes.io/ja/docs/concepts/services-networking/ingress/

ingress-controller

まずingress-controllerを入れる。いろいろあるけど今回はingress-nginxを使う。

  • Bare-metalの場合
    1
    
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml
    

    なんか色々入った。

ingressを適用する

  • ingress.yml

    1
    
    WIP
    
  • 反映する

    1
    2
    
    kubectl apply -f ingress.yml
    kubectl get ingress
    
  • 確認する

    1
    
    kubectl describe ingress name-of-ingress
    

ingressを削除するときは kubectl delete ingress name-of-ingress

ボリュームについて

https://docs.docker.com/compose/compose-file/#volumes-for-services-swarms-and-stack-files

トラブルシュート

1
kubectl describe pod name-of-pod