Docusaurus Web サイトを K8s にデプロイする方法


まず、背景を少し説明させてください.

私の会社では、内部ドキュメントを作成し、git および Markdown ベースのドキュメント サービスで共有する方法を探しています.

これらの選択の背後にある理由は、(1) Markdown は使いやすく、すべての開発者がその使い方を知っているためです. (2) git ベースのサービスは、ドキュメントの変更を追跡し、変更をマージする前にプル リクエストと「ドキュメント レビュー」を使用して改善に同意するのに役立ちます.

いろいろ調べた結果、Facebook が作成した静的ドキュメント サイト ジェネレーター Docusaurus を使用することにしました.

これは React Native に基づいており、セットアップが完了すると、新しいドキュメント ページを送信したり、変更を加えたりするのが非常に簡単になるため、とても気に入っています.

しかし、最初に使い始めたとき、展開の問題に直面しました.私たちはドキュメンテーションを非公開に保ち、docusuarus チームが提案するサービス (Netlify、GitHub Pages など) を使用したくありませんでした.代わりに、プロキシと VPN 経由でアクセスできるように、独自の「dev」Kubernetes クラスターでホストすることにしました.

オンラインでこれを行う方法に関する情報が見つからなかったので、同じ問題に遭遇した場合に備えて、私が従った手順を次に示します.

導入手順


  • yarn, yarn build, yarn serve (または npm に相当するもの) を使用してローカルで実行できる docusuarus Web サイトが既にあると仮定します.
  • 後は、docker イメージをビルドするだけです.

  • FROM node:12.19.0-alpine
    
    WORKDIR /app
    
    COPY . /app
    
    RUN yarn
    
    RUN yarn build
    
    ENTRYPOINT ["yarn", "run", "serve"]
    


  • 新しいイメージを好みの Docker レジストリーにプッシュします
  • 最後に、k8s デプロイメントをクラスターに適用します.以下の yaml を保存して調整し、単純に kubectl apply -f deployment.yaml を実行します.

  • apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ms-docs
    spec:
      selector:
        matchLabels:
          app: ms-docs
      template:
        metadata:
          labels:
            app: ms-docs
        spec:
          containers:
          - name: ms-docs
            envFrom:
            - configMapRef:
                name: ms-docs
            image: my-registry/ms-docs:stable
            imagePullPolicy: Always
            livenessProbe:
              failureThreshold: 15
              httpGet:
                path: /
                port: 3000
              initialDelaySeconds: 20
              periodSeconds: 15
              timeoutSeconds: 5
            ports:
            - containerPort: 80
              name: http
              protocol: TCP
            readinessProbe:
              failureThreshold: 15
              httpGet:
                path: /
                port: 3000
              initialDelaySeconds: 20
              periodSeconds: 15
              timeoutSeconds: 5
            resources:
              limits:
                cpu: "500m"
                memory: 384Mi
              requests:
                cpu: "500m"
                memory: 384Mi
    --------
    apiVersion: v1
    kind: Service
    metadata:
      name: ms-docs
    spec:
      ports:
      - name: http
        port: 3000
        protocol: TCP
        targetPort: 3000
      selector:
        app: ms-docs
      type: ClusterIP