【GKE】kubernetesの本番用コンテナとイメージ(サイドカーパターン)

GCP kubenertes


目標としては、デプロイの手間を減らしつつ、スケーリングを簡単に運用する手段を模索します。

課題としては、replicasでのスケーリングでpodが複製される事や、永続化ボリュームとimageの作成方法について検討します。

オケースケトリングサービスを使わないEC2での運用との違い

・docker-composeを使った運用ではない
・EC2の様に簡単にローカルにvolumesを作ってマウントできる訳ではない?

dockerの環境で開発する場合、データを永続化する為にvolumesを使って、ファイルを外部からアクセスしながら永続化すると思います。

この環境から本番へデータで移行する場合、2つの方法が考えられます。

1.アプリケーションソースをgithubで連携案

docker環境を作成し、ソースコードはgithubから持ってくる。イメージdockerhubの公式を使う場合は、githubのみで可能。

containerにgithubからpullをしてきた場合、再起動した場合消えてしまう。(永続化でない為)その為に、volumeを使った場合を検討する必要がある。
サイドカーパターン等 volumeを別途用意するコストが必要なります。

参考

https://qiita.com/reireias/items/85bcd0acc7f6982041c4

2.docker imageにアプリケーションソース内包案

アプリケーションソースもimage化してdockerhub等で連携する。
volumesで連携されたソースをcopy等でイメージに入れてビルドする手間がかかる。
デプロイ自体は簡単になりますが、デメリットとして、アプリケーションを作り直しをする度に、イメージを作成する必要があります。

今回はサイドカーパターンで実装

1と2でメリットデメリットを考えましたが、細かい修正等がある場合に2のパターンは合わない事や、コピーの際にローカルと環境が変わる恐れがある為に1を採用したいと思います。

参考

https://qiita.com/apstndb/items/a97014b4c290f6ce131a

git-syncの利用(とりあえずpublicディレクトリ)

サイドカーパターンを実装する為に今回は「git-sync」を使用します。
一個のファイルでpodsとserviceを実装してます。
下記はgitのpublicです。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: git-sync
spec:
  replicas: 1
  selector:
    matchLabels:
      app: git-sync
  template:
    metadata:
      labels:
       app: git-sync
    spec:
    # コンテナの定義
      containers:
    # 1つ目のコンテナ:nginx
      - name: nginx
        image: nginx:alpine
        ports:
          - containerPort: 80
        volumeMounts:
          - name: git-sync-volume
            mountPath: /usr/share/nginx
    # 2つ目のコンテナ:git-sync
      - name: git-sync
        image: k8s.gcr.io/git-sync:v3.1.3
        volumeMounts:
          - name: git-sync-volume
            mountPath: /sync
        env:
          - name: GIT_SYNC_REPO
            # ここの URL は適当なリポジトリのものに変更する
            value: https://github.com/satoshohei/hello_world.git
          - name: GIT_SYNC_BRANCH
            # ブランチ名も適当なものに変更する
            value: master
          - name: GIT_SYNC_ROOT
            value: /sync
          - name: GIT_SYNC_DEST
            value: html
      #共通化ボリューム
      volumes:
        - name: git-sync-volume
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: git-sync
  type: LoadBalancer

上記のyamlファイルを使って作成したnginxに外部からアクセスしてgitから取得したプログラムにアクセスできるか確認

IPアドレスは下記の確認

kubectl get service

gitのプライベートリポジトリにアクセス(SSH通信)

下記の記事を参考に作成しております。yamlのデータ等が一部古くて動かないので下記のyamlなら実行できます。
先ほどと変わった点としては、ssh通信とnamespaceを作成している事が違います。

https://qiita.com/apstndb/items/a97014b4c290f6ce131a

順序としては
1.キーペアの作成
2.公開鍵をgithubに登録
3.ネームスペースを作成。
4.秘密鍵をkubernetesのpodにデプロイ

次のコマンドでキーペアを作成します。

ssh-keygen -t rsa -b 4096 -C "git-sync" -N '' -f ~/.ssh/git-sync

作成すると、.ssh/配下にキーが作成されているのが確認できます。

git-sync.pubが公開鍵なのでダウンロードします。ダウンロードした公開鍵を下記リンクよりgithubに登録します。

https://github.com/settings/ssh

上記の鍵とgitの登録で通信できるかの確認

ssh -T git@github.com

ネームスペースを作成

kubectl create namespace git-sync

次に秘密鍵をkubernetesに登録します。下記コマンドで登録します。

kubectl create secret generic git-sync-creds --from-file=ssh=${HOME}/.ssh/git-sync --namespace git-sync

削除する場合( 一応 )

kubectl delete secrets git-sync-creds --namespace git-sync

もしgcloudにログインしてない場合はログインを求められますので

gcloud auth login

ネームスペースを追加したyamlファイルに変更

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: git-sync
spec:
  replicas: 1
  selector:
    matchLabels:
      app: git-sync
  template:
    metadata:
      labels:
       app: git-sync
    spec:
    # コンテナの定義
      containers:
    # 1つ目のコンテナ:nginx
      - name: nginx
        image: nginx:alpine
        ports:
          - containerPort: 80
        volumeMounts:
          - name: git-sync-volume
            mountPath: /usr/share/nginx
    # 2つ目のコンテナ:git-sync
      - name: git-sync
        image: k8s.gcr.io/git-sync:v3.1.3
        volumeMounts:
          - name: git-sync-volume
            mountPath: /sync
          - name: git-secret
            mountPath: /etc/git-secret
        env:
          - name: GIT_SYNC_REPO
            # ここの URL は適当なリポジトリのものに変更する
            value: git@github.com:satoshohei/hello_world.git
          - name: GIT_SYNC_BRANCH
            # ブランチ名も適当なものに変更する
            value: master
          - name: GIT_SYNC_ROOT
            value: /sync
          - name: GIT_SYNC_DEST
            value: html
          - name: GIT_SYNC_SSH
            value: "yes"
      #共通化ボリューム
      volumes:
        - name: git-sync-volume
          emptyDir: {}
        - name: git-secret
          secret:
            secretName: git-sync-creds
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: git-sync
  type: LoadBalancer

ネームスペースgit-syncのIPアドレスを取得

kubectl get service --namespace git-sync --watch

privateリポジトリからもデータが取得できていれば完了。