【GKE】kubernetesの本番用コンテナとイメージ(サイドカーパターン)
目標としては、デプロイの手間を減らしつつ、スケーリングを簡単に運用する手段を模索します。
課題としては、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リポジトリからもデータが取得できていれば完了。