自宅KubernetesクラスターでArgoCDと格闘した話

はじめに

数ヶ月前から自宅Kubernetesクラスターの運用をはじめました。
過去に一度自宅Kubernetesに挑戦してはいたのですが、当時はクラスターを組んで満足してしまい、本格的な運用はしていませんでした。
今回は本格的に運用し、順次運用しているアプリケーションのKubernetes上への移行を進めています。
Kubernetesで実行するアプリケーションのmanifestはGitHubリポジトリに保管し、ArgoCDでGit Opsをするように設定したのですが、その作業の中でいくつかはまったポイントがあったので解決方法を記録に残しておこうと思います。

環境

  • Ubuntu 20.04 LTS
    • CPU 4Core
    • Memory 8GB
  • Kubernetes 1.24 (microk8s)
    • Control Plane x1
    • Node x2
  • ArgoCD v2.4.7

LoadBalancer TypeのServiceのApp HealthがずっとProgressingになる問題

これは原因や対処法がArgoCDのドキュメントに書いてありました。
argo-cd.readthedocs.io
status.loadBalancer{} となっているため、永遠にProgressingになるようです。
対処法としては、ArgoCDのヘルスチェックの仕組みを上書きして、強制的にstatusをHealthyにすれば良さそうです。
ArgoCDのConfigMapに以下のような設定を追加すればOKでした。

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-cm
data:
  resource.customizations.health.Service: |
    hs = {}
    if obj.status ~= nil then
      if obj.status.loadBalancer ~= nil then
        hs.status = "Healthy"
        hs.message = "LoadBalancer status is healthy"
        return hs
      end
    end

    hs.status = "Progressing"
    hs.message = "Waiting for LoadBalancer"
    return hs

余談ですが、ArgoCDのCustom Health CheckのロジックはLuaで書けることを初めて知りました。

Sync Statusが永遠に常にOut Of Syncになる問題

これは、ArgoCDがmanifestをapplyした後、manifestに記述されていないlabelやannotationが自動で追記され、差分が生じることが原因のようです。
具体的には、Datadogのinstallinfoやcluster-agentをArgoCDで管理しようとした際に発生しました。
datadog-installinfoというConfigMapのlabelやdatadog-cluster-agentのmetadataが書き換えられるため、差分として検知されOut Of Sync状態になるようです。
対処法としては、ignoreDifferencesの設定を追加すれば良さそうです。
今回は以下のような設定を追加しました。

spec:
  ignoreDifferences:
    - kind: ConfigMap
      group: ''
      name: datadog-installinfo
      namespace: monitoring
      jsonPointers:
        - "/metadata/labels/app.kubernetes.io~1instance"
    - kind: Deployment
      group: apps
      name: datadog-cluster-agent
      namespace: monitoring
      jsonPointers:
        - "/spec/template/metadata"

ignoreDifferencesのgroupにはAPI Groupを指定します。
KubernetesAPI Groupは以下のドキュメントにまとめられています。
kubernetes.io

ConfigMapのAPI Groupはcoreなのですが、coreの場合は空文字列を指定する必要があるようです。
github.com

また、keyにスラッシュ / が入っている場合は、 ~1エスケープする必要がありました。
jsonPointersの仕様はRFC6901に従っており、RFC6901にスラッシュのエスケープについて書いてありました。
datatracker.ietf.org

最初はバックスラッシュ \エスケープできるかと思いましたが、正しくは ~1 でした。

これらの設定で、ようやくArgoCDのstatusを全て正常にできました。

おわりに

Kubernetesについては最初は難しそうな印象がありましたが、難しいのは構築だけで、運用は思っていたよりも大変ではありませんでした。(そこまで複雑なことをしていないというのもありますが…)
また、構築についてはmicrok8sを使うことで非常に簡単にクラスターを組むことができました。
ArgoCDはダッシュボードがかっこよくて良いですね。これまではdocker-compose.yamlを手動Git Opsしていたのですが、ArgoCDを使えばGitHubにpushするだけでデプロイまで実行されるのでとても楽です。

現在のKubernetesクラスターは、大事に大事に育てていこうと思います。

1年間で読んだWebサイトをRedashで集計して可視化してみた

はじめに

私は、興味がある分野の技術ブログ等をRSS登録して毎日更新された記事をチェックしているのですが、有用な記事や広く共有したい記事などを埋もれさせてしまうことがあり、もったいないなぁと感じていました。
この課題を解決するため、Webサイトをクリッピング・記録し、RSSで共有ができるWebアプリケーション、「fluid」を作りました。
fluid.sublimer.me
今日は、このfluidを使い始めてちょうど1年なので、記念に1年間で記録したWebサイトを集計・可視化してみました。

続きを読む

SkyWay Beta用の認証JWT(SkyWay Auth Token)を生成するサーバーをGoogle Apps Scriptで動かす

はじめに

2月21日に、新しいSkyWayのβ版であるSkyWay Betaがリリースされました。
SkyWay Betaでは、JWT形式のトークン、SkyWay Auth Tokenを使用して、細かい権限管理ができるようになっています。
一方で、ドキュメントには

SkyWay Auth Tokenを利用するためには、これを払い出すアプリケーションサーバーを構築する必要があります。
(中略)
なお、サーバを構築せずにフロントエンドでSkyWay Auth Tokenを生成した場合、シークレットキーをエンドユーザーが取得できるため、誰でも任意の Channel や Room に入ることができる等のセキュリティ上の問題が発生します。

とあるように、SkyWay Auth Tokenを生成するサーバーを建てて、アプリケーションをセキュアにする必要があります。
beta.skyway.ntt.com

今回は、Google Apps Script(以下GAS)を使用して、手軽にSkyWay Auth Tokenを生成するサーバーを建てる方法を紹介します。

※以下の記事でも説明したように筆者はSkyWayの中の人ですが、本記事で紹介する方法はあくまでも一個人として試してみた記録です。
sublimer.hatenablog.com

続きを読む

今年買って良かった物2021

はじめに

毎年書いている「今年買って良かった物」の2021年分です。
今年は就職したので生活が色々と変わったのですが、去年ほど物を買うことはなかったように思います。
とはいえ、生活環境をより良くするためにいろいろ買ってみたので、買ったものと使ってみた感想を簡単に書いていこうと思います。
これまでの「買って良かった物」はこちらです。
sublimer.hatenablog.com
sublimer.hatenablog.com
sublimer.hatenablog.com

続きを読む

C# ( .NET Core)で作る自作TURNサーバー 〜開発のTipsとプロトコルの説明を添えて〜 #nttcom_ac2021

はじめに

この記事は、 NTT Communications Advent Calendar 2021 12日目の記事です。

皆様こんにちは。NTTコミュニケーションズ イノベーションセンターの@sublimerです。今年の4月にNTTコミュニケーションズに入社し、SkyWayの開発・運用の業務を行っています。
本記事では、C# ( .NET Core)でTURNサーバーの自作に挑戦している話を書いていこうと思います。まだ完成はしていないのですが、TURNサーバーのプロトコルの仕組みやサーバー開発の作業の進め方などを紹介します。

続きを読む

WireGuardで拠点間VPNを設定してみた

はじめに

WireGuardを使って、自宅とOracle Cloudの間で拠点間VPNを構築してみました。
Oracle Cloud上のVMから自宅サーバーのDBにアクセスする際などにセキュアな通信ができ、非常に便利です。
構築した際の手順やハマったポイントなどを記事に残しておこうと思います。

続きを読む