kubernetesをGCPやAWS上で動かすとき、実務でぶち当たった壁、考えないといけないポイントをまとめていきます。
AWSのマネージドで動かすか? k8sの中で動かすか問題
証明書関連
どこでSSL終端を行うのか?k8s-cluster外でSSL終端するのか、しないのか?を考える必要がある。さらにその証明書を得るときに期間が切れたときに自動で証明書を発行するのかいなかなどもある。
シークレット関連
通常、k8sでsecrets.yaml
ファイルを定義した場合、Secretのvalueはbase64
で、エンコードされるだけで、エンコードされた文字列を知れば、簡単にデコードできてしまう。そのため、secretsを以下のサービスを使用して外部に置いておいて、必要な時に動的に取得するといったシークレット管理の仕方が存在する。
external-secrets-operator(ESO)
SSMパラメータストアなどに置いておいて必要な時にk8sからシークレットを呼び出す形
vault
シークレットに対してのアクセス権限を動的に発行してセキュアに保つ
認証認可・IRSA周り
IRSA(IAM Roles for Service Accounts):Pod単位でIAMのロールを割り当てる仕組み。AWS・GCPマネージドリソースとk8s-cluster内のリソースのアクセス許可とアクセス制御を考えるのが非常に大変。
HPA戦略
HPAさせる時のメモリ使用率などから考える。
このpodのメモリ率はこのインスタンスタイプにおいて常時〇%を使用している。じゃあ、〇%のリクエストを受けた時に、PodをHPAさせようなどを考えること
CRD(Custom Resource Definition)
kubernetesはGoでちなみに書かれている。deployment、serviceなどがリソースタイプに存在するのだが、そのdeploymentをdeploymentだと定義させるリソースが存在する。簡単にいうとサードパーティ製のリソースを定義するためのもの。先ほどのESOもその一つである。
EKS・GKEのアップグレードそれに対応
eksなどの特定のkubernetesバージョンに対応してる期間がかなり短い。それもkubernetesのそもそものバージョンアップデートが早いからである。
バージョンが上がったとき、旧バージョンで動いていたk8sリソースが新バージョンで動くかどうかをchangeing logで確認する必要がある。kind:apps/v1beta1
とかなどは新バージョンでなかったりするケースがある。
おまけ
よく実務中、調査で使用するモジュール
k9s
この人が、使い方をまとめてくれている。
aliasでkubectl=kは登録する
kubectlまで打つのが本当にめんどくさい。