blog.mizukmb.net powered by CloudNative
(自己紹介はじめ)
普段は名古屋オフィスで働いてます。たまにリモートワークで自宅から働くことがあります (自己紹介おわり)
今回はこのブログサイトを CloudNative 化して最強のインフラにする
* mizukmb.icon の試行錯誤の様子を記録しているだけなので、ベストプラクティス的な内容ではないことをご留意ください
/icons/hr.icon
https://gyazo.com/c0a23c419f4baaba2fb76d085b3de44f
1. CONTAINERLIZATION
アプリケーションをコンテナ化しましょう、という事
できた
hugo を実行して nginx で待ちうける感じの Dockerfile を書いた
慎重に運用するなら hugo のバージョンを固定するのが良いやり方だと思うが、まあ個人運用のサイトなので hugo のバージョンアップで豪快に壊れるとかは許容できる
code:Dockerfile
FROM alpine:latest as hugo
WORKDIR /var/hugo
RUN apk update && \
apk add hugo
COPY . .
FROM nginx:latest
RUN mkdir -p /var/www/blog
COPY --from=hugo /var/hugo/public /var/www/blog
RUN rm /etc/nginx/conf.d/default.conf
COPY config/nginx/conf.d/blog.conf /etc/nginx/conf.d/blog.conf
COPY config/nginx/nginx.conf /etc/nginx/nginx.conf
RUN mkdir -p /etc/nginx/ssl
2. CI/CD
コンテナベースで CI/CD を組みましょう、という事
CIだけできた
単に docker build が成功するかだけを見る簡易なCI
気をつけなければならないのは、Hugoのテーマを git submodule で管理している場合で、 actions/checkout@v1 では以下のような設定をしなければ submodule で管理されているレポジトリの clone がされない
code:yaml
uses: actions/checkout@v1
with:
submodules: true
git submodule 初心者だからなんで git clone で一緒に取ってきてくれなんだろうと悩んでた
https://gyazo.com/89de1af09fbe04750c2072f13dd8da82
CDは ORCHESTRATION の時(要はkubernetesで動かすとき)に一緒にやるのがよさそう そもそもデプロイ先が無い
一旦スキップ
3. ORCHESTRATION
https://gyazo.com/27c613e31ac7417a0c0f21735fe2bc62
こういう構成で外部からのアクセスでブログを表示できるようにした
図が質素なのは許してほしい。苦手なので
1サーバでMaster, Nodeを用意してくれるのでこういう時便利
2 core CPU な VPSプランを選択する必要がある。ConoHaだったら1000円/月ぐらいで借りれる
--vm-driver=none で VPS 上の Docker に kubernetes を構築する
Pod
最初にコンテナ化したアプリケーションを動かすやつ
code:pod.yml
apiVersion: v1
kind: Pod
metadata:
name: blog
labels:
app: blog
spec:
containers:
- name: blog
image: docker.pkg.github.com/mizukmb/xxx/yyy:latest # GitHub Package Registry で登録した image URL
ports:
- containerPort: 80
imagePullSecrets:
- name: github
Podに登録するコンテナがprivateなので kubectl create secret でsecretを登録する
code:shell
$ sudo kubectl create secret docker-registry github --docker-server=https://docker.pkg.github.com --docker-username=mizukmb --docker-password=XXXXXX docker-registry: secretの種類みたいなの
github: 任意の名前なので何でも良い
--docker-server=https://docker.pkg.github.com: レジストリURL
--docker-username=mizukmb: GitHubのusername
--docker-password=XXXXXX: GItHub parsonal access tokenを渡す。権限は write: package であればOK。もっと絞れるかも
Service
Podにリクエストを渡す時にServiceを使っていい感じに制御する。type の指定で挙動が変わってくる
code:service.yml
apiVersion: v1
kind: Service
metadata:
name: blog
spec:
type: NodePort
selector:
app: blog
ports:
- port: 80
targetPort: 80
外部からのアクセスをPodに渡したいので NodePort を選択
Pod, Serviceそれぞれの YAML ファイルを kubectl apply すれば Service, Pod が起動する
code: shell
$ sudo kubectl apply -f pod.yml -f service.yml
# (snip)
$ sudo kubectl get pod,service # podとserviceの状態を確認
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/blog NodePort 10.105.89.20 <none> 80:31388/TCP 22h <= Serviceがある
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
NAME READY STATUS RESTARTS AGE
pod/blog 1/1 Running 0 22h <= Podがある
この状態で curl <CLUSTER-IP>:PORT すればブログトップページのHTMLが返ってくる。curl localhost:<NODEPORT> で localhost からでもアクセスできることが確認できる。NODEPORT は上記の例だと 31388 になる。この番号は service.yml の spec.ports.nodePort で指定ができる
/icons/hr.icon
感想
3 をやるだけでも結構大変。特にkubernetesは初心者なのでググってはYAMLを修正してapplyして…を永遠に繰り返してた。
kubernetes自体は以前から何度か挑戦してたんだけど、自分が想像するよりも色々できるので今回やったことは基本中の基本というか氷山の一角っぽくて全然学習時間が足りなかった。今回のようにいきなりやるぞ!、ではなく本を読んで体系的に学ぶ方が良いと思った。
kubectl explain は便利。
証明書のアレコレに手をつけることができてないので、まだサーバ自体は移行できてない
CDもまだ未完成。sshしてgit pullしてkubectl applyすればいけるかなあという雑な作戦を考えてる
だいぶ大変だったけどようやく自由に遊べるkubernetes環境が手に入ったので observability とか他のOSSを組合せてみたい