Postgres-HAで複数ストレージを使う

blog.hatena.ne.jp

この辺でデータベースを導入したのだがいろいろ改善したので書いておく

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: postgres
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: postgres
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  source:
    repoURL: registry-1.docker.io/bitnamicharts
    chart: postgresql-ha
    targetRevision: 16.0.11
    helm:
      values: |
        persistence:
          enabled: true
          storageClass: longhorn-r2
          size: 500Gi
        postgresql:
          username: postgres
          password: postgres
          database: db
          replicaCount: 2
        pgpool:
          enabled: true
          replicaCount: 1
          adminUsername: admin
          adminPassword: postgres
        volumePermissions:
          enabled: true

ストレージの作成をPostgresql-haに任せることにした。どうにも各Podにストレージがある方がいいらしい。

そんで各PodにPVCを作るのだがどうにも変なエラーが出る。

MountVolume.MountDevice failed for volume "pvc-03c45c8b-bce4-4531-a3f6-6bc3d79a6f44" : rpc error: code = Internal desc = format of disk "/dev/longhorn/pvc-03c45c8b-bce4-4531-a3f6-6bc3d79a6f44" failed: type:("ext4") target:("/var/snap/microk8s/common/var/lib/kubelet/plugins/kubernetes.io/csi/driver.longhorn.io/f9eba5b4abfd902f35b2670bfeb966b95076caed5175c963b16d612b7c4704a4/globalmount") options:("defaults") errcode:(exit status 1) output:(mke2fs 1.47.0 (5-Feb-2023) /dev/longhorn/pvc-03c45c8b-bce4-4531-a3f6-6bc3d79a6f44 is apparently in use by the system; will not make a filesystem here! )

こんなエラーが出てPodにストレージがマウントされない。どうにもMultipathが悪さをしているらしい。こいつがさっさとストレージをロックしてしまうのでLonghornから弄れなくなるみたいな。

対処法としてMultipathがLonghornのストレージを触らなくすれば良いので

各ノードにsshして

sudo vim /etc/multipath.conf

して

blacklist {
    devnode "^longhorn.*"     # longhornで始まるデバイスを除外
}

これを追記

そして

sudo systemctl restart multipathd

したら動いた。ノードが多いほど面倒だが...

もしかしたら単にこのサービスをdisableしてもいいかもしれない。

MicroK8sアドオンからの移行

Nginx IngressとMetalLBをMicroK8sのアドオンで入れていたがカスタマイズ性に乏しいのと、アップデートのやり方がよく分からない(消して再インストール?)ので、自前でのインストールに切り替える。

microk8s disable ingress metallb

消し飛ばす

まずはMetalLBから入れる

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: metallb
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://metallb.github.io/metallb
    chart: metallb
    targetRevision: 0.15.2
    helm:
      values:
  destination:
    server: https://kubernetes.default.svc
    namespace: metallb-system
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

本体 valuesでリソース量を指定できるらしいが面倒なのでスキップ

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metallb-system
spec:
  addresses:
    - 172.28.7.0-172.28.7.10
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system
spec:
  ipAddressPools:
    - default

IPアドレスの範囲を設定

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: metallb-config
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/coil398/home-k8s
    path: manifests/metallb
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: metallb-system
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

ArgoCDでApplyする

一通りPodが立ち上がったらテスト

kubectl create deployment test-app --image=nginx
kubectl expose deployment test-app --type=LoadBalancer --port=80
kubectl get svc

するとtest-appにEXTERNAL-IPが割り当てられているはずなので

curl http://172.28.7.2

とかでアクセスできたらOK

次にNginx Ingressをデプロイする

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ingress-nginx
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://kubernetes.github.io/ingress-nginx
    chart: ingress-nginx
    targetRevision: 4.12.3
    helm:
      values: |
        controller:
          service:
            type: LoadBalancer
          replicaCount: 2
          metrics:
            enabled: true
            serviceMonitor:
              enabled: true
          config:
            log-level: "1"
  destination:
    server: https://kubernetes.default.svc
    namespace: ingress-nginx
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Prometheusがない場合はserviceMonitor.enabledをfalseにするらしい

実はこの前入れていたのでオンにしておく

kubectl get svc -n ingress-nginx

すると、先ほどデプロイしたMetalLBからIPアドレスIngress Nginx Controllerのサービスに割り当てられていることが分かる。

ボリュームを使うリソースをデプロイしてみる

前回まででPVCの作成まで行ったので、実際にボリュームを使って何かしらのリソースをデプロイしてみる。

その前に、前回PVCの作成まではしたが、それだけではだめで実際にノードにアタッチする部分は手動でやる必要があるらしい。何かと面倒なので手動で作るのは割と非推奨かもしれない。

いずれにせよ何かしらのノードにアタッチして、そのPVCを指定すればボリュームが扱えるはず。というわけでPostgresをデプロイしてみたのだが動かない。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: postgres
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: postgres
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  source:
    repoURL: https://charts.bitnami.com/bitnami
    chart: postgresql
    targetRevision: 15.5.3
    helm:
      values: |
        primary:
          persistence:
            enabled: true
            existingClaim: db-pvc
        volumePermissions:
          enabled: true
        auth:
          username: postgres
          password: postgres
          database: db

実際に立ち上がったPodを見てみるとdb-pvcを参照しているのだがエラーが出ている。

  volumes:
    - emptyDir: {}
      name: empty-dir
    - emptyDir:
        medium: Memory
      name: dshm
    - name: data
      persistentVolumeClaim:
        claimName: db-pvc

applyされているマニフェストにはちゃんとdb-pvcが書かれている。

結局うまく行かないので別の方法でやることにする。要はレプリカ数を変えつつLongHornに自動でボリュームを作らせれば良いので

longhorn.io

ここの方法に則る。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-r2
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "2"
  staleReplicaTimeout: "2880" # 48 hours in minutes
  fromBackup: ""
  fsType: "ext4"

名前がlonghornだと上書きされるようなのでreplica数2にしたlonghorn-r2を作成。これでstorageClass longhorn-r2が使えるようになるので

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-pvc
  namespace: postgres
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1000Gi
  storageClassName: longhorn-r2

そのストレージクラスを指定してdb-pvcを作成。これで良い感じにボリュームが作られた。どうにもボリュームは手作業で作るものではないっぽいな。ChatGPTめ

結局公式ドキュメントをちゃんと読みましょう案件だった。

そしたらちゃんとレプリカ数が2のボリュームが作成されたことがLongHornUIで確認できた。ついでに立ち上げたPodに応じてアタッチもされている。

んだけど今度はマウントに失敗したらしい。なんやねん。

NFSとしてマウントするためのバイナリが存在しない?らしいのですべてのノードで

sudo apt install nfs-common

これをしてからPodを再起動したら無事立ち上がった。

これでもいいんだけどもせっかくなら高可用性を求めたい

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: postgres
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: postgres
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  source:
    repoURL: registry-1.docker.io/bitnamicharts
    chart: postgresql-ha
    targetRevision: 16.0.11
    helm:
      values: |
        postgresql:
          existingClaim: db-pvc
          username: postgres
          password: postgres
          database: db
          replicaCount: 2
        pgpool:
          enabled: true
          replicaCount: 1
          adminUsername: admin
          adminPassword: postgres
        volumePermissions:
          enabled: true

postgresql-haに乗り換えてみた。これで常に複数のPostgresqlが立ち上がりpgpoolでロードバランシングされるらしい。

そして更に、現在のArgoCDはmicrok8sのアドオン機能で入れたものだが、どうにもバージョンアップの手段がないらしい。あまりにも使い勝手が悪いのでHelm管理に切り替えようと思う。

microk8s disable argocd

でArgoCDを消して

helm install argocd argo/argo-cd --namespace argocd --create-namespace --version 8.0.15        

適当に最新版をインストール

あとはapp-of-appsパターンに則って元に戻して終わり。

そしたらせっかくデータベースも作ったのでデータベースを扱うアプリケーションを用意しよう。

まずはpgadminを入れてウェブからいろいろ見えるようにしてみる

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: pgadmin
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: pgadmin
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  source:
    repoURL: https://helm.runix.net
    chart: pgadmin4
    targetRevision: 1.47.0
    helm:
      values: |
        service:
          type: ClusterIP
          port: 80
          targetPort: 80
          annotations: {}
        env:
          email: admin@example.com
          password: password
        ingress:
          enabled: false
        persistentVolume:
          enabled: true
          size: 2Gi
          storageClass: "longhorn-r2"
          accessModes:
            - ReadWriteOnce

これでpgadminを通してデータベースが見えるようになった。pgadminとpostgresは異なる名前空間なので、接続の際にはFQDN名前空間まで含める必要がある。

ストレージもちゃんと払い出された。

そしたら最後に当初の目的のVS Codeを入れる。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: code-server
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: code-server
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  source:
    repoURL: https://github.com/coder/code-server
    path: ci/helm-chart
    targetRevision: main
    helm:
      values: |
        replicaCount: 1
        service:
          type: ClusterIP
          port: 8080
          targetPort: 8080
        ingress:
          enabled: false
        persistence:
          enabled: true
          size: 100Gi
          storageClass: "longhorn-r2"
          accessMode: ReadWriteOnce
        extraArgs:
          - --auth
          - none
          - --disable-telemetry
          - --bind-addr
          - 0.0.0.0:8080

どうにもHelm chartのレポジトリはないようなので直接Githubのレポジトリを参照する。

これでcode serverなるものが立ち上がる。が、どうにもVS CodeとかCodespacesとは違って設定の同期はできないらしい。ケチだ。

ちなみに最初ボリュームサイズを10Giにしてたが100Giにして再度applyしたら勝手にサイズが広がった。偉い。

分散ストレージシステムを用意したい

一回やる気が出ると出続ける現象あるよね。ってことで分散ストレージシステムを用意する。

当初はRookCephでやろうと思ったが、どうにも調べてみるとオーバースペックっぽい上にリソースを結構食うようだ。仕方ないのでLongHornに切り替えていく。

構成として各ミニPCのうち三台に4TB,一台に2TBのSSDが入っていた。このまま全台同じLongHornで動かすと2TBに引っ張られるらしいので、三台と一台に分けて三台をレプリカ2で運用する感じで行こうと思う。すると4 * 3 / 2 = 6TBと2TBの二つのストレージが完成する。前者には信頼性の必要なデータを入れて、後者には最悪消えてもいいデータを置く。レプリカ2は信頼性の観点では少し微妙だろうけど、そこは定期的なNASへのバックアップでカバーする。

[追記]

と思ったけど、別にそういうRAIDみたいに最初から複数のSSDをまとめるみたいなことはしないっぽい。単にボリュームとして使えるだけ切り出して都度一個にまとめる感じ?2TBの分がたまたま選ばれて使い切ったら残りは他のところから取ってくれるみたいな挙動みたい。なので、後述のnoncriticalみたいなのは必要なさそう。

longhorn.io

親切にもArgoCDでHelmチャートを使ってインストールする方法が書かれていたのでこれに則る。

そしたらWeb UIもついているようなので、こいつもcloudflared経由でアクセスできるようにしておこう。

と、その前にlonghorn-driver-deployerのpodが立ち上がらない。ログを見てみるとkubeletのroot-dirがなくて失敗しているようだ。microk8sの場合別のところにあるらしいので、明示的に指定する必要があるとかなんとか。

      helm:
        values: |
          preUpgradeChecker:
            jobEnabled: false
          csi:
            kubeletRootDir: "/var/snap/microk8s/common/var/lib/kubelet"

helmのvaluesのところで明示的にmicrok8sのkubeletのディレクトリを指定してやる。

https://github.com/balchua/do-microk8s/blob/master/docs/longhorn.md

ここを参考にした。

そしたらlonghornの方で、各パソコン上のディスクを登録する必要があるらしいので

kubectl -n longhorn-system edit lhn ${NODE_NAME}で各ノードのspecを編集する。

spec:
  disks:
    shared-ssd:
      path: /mnt/longhorn
      allowScheduling: true
      storageReserved: 0
      tags:
        - shared

共有の方にはこれ

spec:
  disks:
    noncritical-ssd:
      path: /mnt/longhorn
      allowScheduling: true
      storageReserved: 0
      tags:
        - noncritical

単体運用の方にはこれらをそれぞれ追記してやる。

そしたら更にこれらのストレージをLonghornのボリュームとして扱えるようにする必要があるらしい。

apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
  name: db-volume
spec:
  numberOfReplicas: 2
  size: "999653638144"
  frontend: blockdev
  accessMode: rwx
  replicaAutoBalance: best-effort
  dataLocality: best-effort
  diskSelector:
    - shared
---
apiVersion: longhorn.io/v1beta2
kind: Volume
metadata:
  name: test-volume
spec:
  numberOfReplicas: 1
  size: "10737418240"
  frontend: blockdev
  accessMode: rwo
  replicaAutoBalance: disabled
  dataLocality: disabled
  diskSelector:
    - noncritical

こんな感じのをArgoCDで登録したらWeb UIからもストレージが見えるようになった。

[更に追記]

このやり方微妙かも。上手くいかない。

そしたらPersistentVolumeClaimで上で作ったVolumeを指定すれば良い。んだけどPersistentVolumeClaimを作るとそもそもよしなにVolumeを作ってくれる機能もあるらしい。そうしたい場合はどうやらlonghornのサービスアカウントにボリュームを作る権限がないっぽいのでHelmチャートの方で

      helm:
        values: |
          preUpgradeChecker:
            jobEnabled: false
          csi:
            kubeletRootDir: "/var/snap/microk8s/common/var/lib/kubelet"
          serviceAccount:
            create: true
            name: longhorn-service-account
          rbac:
            create: true

これらを追加してあげる。service account自体は既にあるっぽいからもしかしたらrbacの方だけかも。するとpersistentVolumeClaimを作ると自動的にVolumeリソースも作ってくれる。今回は細かく動作を制御したいので(主にレプリカカウント)Volumeリソースを手動で作る。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 931Gi
  volumeName: db-volume
  storageClassName: longhorn
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  volumeName: test-volume

PersistentVolumeClaimで自動でVolumeを作りたい場合はvolumeNameを外せば良いっぽい。 size指定の仕方がちぐはぐなのがめんどくさい。

GUIを見てみるとボリュームができてた。

本当はデータベースまで作りたかったが眠くなったので終わり

[追記]

上にも書いたように2TBのSSDを特別視する理由はなさそうなのでtest volumeを削除して

lhnを編集してnoncriticalの文字をsharedに変更した。これだけですべてのssdを一緒に扱えるようになったのでよくできてる。

自宅K8sに外からアクセスしたい

自宅のK8sに外部からアクセスしたい。が、ポート開放はあまりしたくない&技術的に興味があるのでCloudflare Tunnelを使ってみようと思う。 Cloudflare Zero Trustを使って認証もできるのでセキュアっぽい。

その前にNASとしてUgreenの新しいやつを導入した。それにあたって今までNASとして利用してきたミニPCが空いたので、こいつにもUbuntuをインストールして新しいNodeとして活躍してもらおうと思う。スペックはN95とかそんなんだった気がする。メモリが多分8GBかな?

過去の記事を読んでIPアドレスを設定したいのだが既に存在するクラスタのノード数は五個、にも関わらず記事には六個分のIPが書かれている。確かにマスターノードは三つあるはずなのでワーカーノードが一個分嘘ついてるっぽい。せっかくだしこのワーカーノードのIPとして最後に列挙されてる172.28.6.23を指定すれば上手く動くだろう。多分知らんけど

その前にそもそもしばらく放置されてたので各ノードのアップデートもしておこう。IPアドレスの確認もできるはずだ。

...

というわけで新しいノードには172.28.6.23を付与してワーカーノードとして働いてもらう。

アップデートやらインストールに時間がかかるのでRevolution Idleを眺めつつマリカワールドをプレイする。

インストールは完了したがsshログインするための諸々を入れ忘れた。

sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh
sudo ufw allow ssh

適当にこの辺をやってsshで入れるようにした。

...

マリカワールドのエンディングが流れ始めたので続きをやっていく

sudo snap install microk8s --classic

ワーカーにclassicが必要なのかはよく分からないがどうせ自宅用なのでつけておこう。

microk8s status --wait-ready

これをやる。

/home/worker3/.kube

が存在しないと言われてしまった。

ChatGPTに聞いたら

mkdir -p ~/.kube
microk8s config > ~/.kube/config
sudo chown -R $(whoami) ~/.kube
sudo snap alias microk8s.kubectl kubectl

とやれと言われたのでやる。前もこんなのやったっけ?

よくよく考えなくても最後のkubektlは必要ないな。

適当な既存のノードで

microk8s add-node

として出てきたコマンドを新しいノードで叩くと登録されるはず。された。

クラスタに外部からアクセスしようとしたがtlsのエラーが出てしまった。failed to verify certificateらしい。

改めてconfigを作ったりもしたがだめ

マスターでip aしてみるとvip先生のIPが表示されない。podは存在しているっぽいが

とりあえずvip先生のpodを再起動

改めてマスターでip aしてるとipは紐付いている。

microk8s kubectl configしたconfigを持ってくると、こいつでは繋がるがvip先生のipでは繋がらない。

/var/snap/microk8s/current/certs/csr.conf.templateを見てみるとvip先生のipが消えていたので、再度vip先生のipを追加してconfigを再発行したがまだ動かない。

一旦もろもろのバージョンを上げてみる。

そもそもkube-vipの入れ直しの段階でip aしてみたらまたvip先生のipが消えていたので何かがおかしそうだ。

しかし動かない\(^o^)/

再びマスターでip aしてみるとまたvip先生のipが消えていた。

そういえばログ読んだときにworker3に処理を任せたぜみたいな記述があったのを思い出した。

もしかしてと思いworker3でsudo microk8s configして発行した中身をクライアントの~/.kube/configに入れてみる。もちろん動くがipをvip先生のものにすると動かない。そういえばcrtのテンプレートを編集するのを忘れていた。

sudo vim /var/snap/microk8s/current/certs/csr.conf.template

をして

IP.3 = 172.28.6.100

を追加。

sudo microk8s refresh-certs --cert server.crt

としてみたらようやく動いた。めでたしめでたし。

ノードがたくさんあると気分が良いね。ラズパイとかも混ぜてみたいけどアーキテクチャ変わるからめんどくさそうな予感しかしない。

microk8sのバージョンが古いのでここで一通り上げておこう。

sudo snap refresh microk8s --channel=latest/stable

を実行すればよしなにしてくれるみたい。

クライアントとしてk9sを使っているけど、バージョンアップして自動で再起動されたことが確認できた。無停止ってのは気分が良い。

そういえばこのクラスタではnginx ingressを入れている。なので各ノードでnginx ingressのコントローラが動いているはずなのだが、どうにも新しいノードで立ち上がっていないっぽい。

podをdescribeしてみると、どうにもこのクラスタではciliumをCNIとして使っているのだが、デフォルトのCNIであるcalicoを使おうとして見つからないとエラーが出ているようだ。

そういえばcilium用の設定ファイルを追加する必要があったんだった。

/etc/cni/net.d/05-cilium-cni.conf

に、他のノードから持ってきた中身をコピペ、適当に再起動したら動いた。

{
    "cniVersion": "0.3.1",
    "name": "cilium",
    "type": "cilium-cni",
    "enable-debug": true,
    "log-file": "/var/run/cilium/cilium-cni.log"
}

中身はこんなん。

そういえばciliumのアップデートはどうするんだろう。microk8sのaddon機能で入れたけども、どうにもdisableしてからenableするらしい?ほんまか?

やってみたらバージョンは上がったっぽいけどどうにも腑に落ちない。

一旦使える状態にはなった気がする。

改めてCloudflare Tunnelを使って外部からアクセスできるようにしよう。

developers.cloudflare.com

このページを参考に設定。マニフェストデプロイの時にconfigMapを弄ってビルトインのhello_worldを表示するようにしてみる。

apiVersion: v1
kind: ConfigMap
metadata:
  name: cloudflared
data:
  config.yaml: |
    # Name of the tunnel you want to run
    tunnel: coil398-k8s-tunnel
    credentials-file: /etc/cloudflared/creds/credentials.json
    # Serves the metrics server under /metrics and the readiness server under /ready
    metrics: 0.0.0.0:2000
    # Autoupdates applied in a k8s pod will be lost when the pod is removed or restarted, so
    # autoupdate doesn't make sense in Kubernetes. However, outside of Kubernetes, we strongly
    # recommend using autoupdate.
    no-autoupdate: true
    # The `ingress` block tells cloudflared which local service to route incoming
    # requests to. For more about ingress rules, see
    # https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/ingress
    #
    # Remember, these rules route traffic from cloudflared to a local service. To route traffic
    # from the internet to cloudflared, run `cloudflared tunnel route dns <tunnel> <hostname>`.
    # E.g. `cloudflared tunnel route dns example-tunnel tunnel.example.com`.
    ingress:
    - hostname: k8s.coil398.io
      service: hello_world
    - service: http_status:404

多分こんな感じ。

ついでに本体の方のimageを2025.5.0にする。

https://k8s.coil398.ioにアクセスしたら動いた。やったね。

そしたらマスターノードにアクセスできるようにしたい。正確にはVIP先生に繋がるようにしたい。

ついでにダッシュボードとargocdにもアクセスできるようにしよう。

    ingress:
    - hostname: master.k8s.coil398.io
      service: https://172.28.6.100:16443
      originRequest:
        noTLSVerify: true
    - hostname: dashboard.k8s.coil398.io
      service: https://dashboard-cloudflared.kube-system.svc.cluster.local
      originRequest:
        noTLSVerify: true
    - hostname: argocd.k8s.coil398.io
      service: https://argocd-cloudflared.argocd.svc.cluster.local
      originRequest:
        noTLSVerify: true
    - hostname: k8s.coil398.io
      service: hello_world
    - service: http_status:404

このように書き換え

それでトンネルにこれらのFQDNを登録

cloudflared tunnel route dns coil398-k8s-tunnel dashboard.k8s.coil398.io                                                                                                                                                                                                                                                                                           
cloudflared tunnel route dns coil398-k8s-tunnel argocd.k8s.coil398.io
cloudflared tunnel route dns coil398-k8s-tunnel master.k8s.coil398.io

で、アクセスしてみると

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

というエラー。調べてみると

developers.cloudflare.com

どうやらCloudflaredのデフォルトの証明書ではサブドメイン一階層までしかカバーされないらしい。

なので別途金を払って証明書を追加する。月10$ならまぁ、うん。

これで無事ダッシュボードとArgoCDにアクセスできるようになった。

一方でmasterへのアクセスはうまくいかない。よくよく考えると外部からマスターにアクセス可能になったとしてどうやって認証情報を手に入れれば良いんだ?

一旦先にZero Trustによる認証機能をつけようと思う。

Zero Trustは普通に申し込めば無料で使える。

躓きそうなポイントとしては

認証方法の追加はsettings -> Authenticationから

自分はGithub認証にした。テストの段階でこけることがあるが、しばらく経つと上手くいく。

基本的には右にあるガイドに従えば良い。

チーム名は最初に決めるが、なかなか書いてあるところが見つからない。

settings -> Custom Pagesを見たら書いてあった。

あとはAccess -> Applicationsから追加していけば良い。

多分URLごとにアプリケーションを作る必要がある。

アプリケーションの追加ではSelf-hostedを選択

Application nameは適当に

Add public hostnameで追加する。

ポリシーはGithubのEmailにAlowを付与した。これで自分しかアクセスできなくなるはず。

それ以外は特に弄らずボタンポチポチで完成。

dashboardは認証をつけたのでデフォルトの認証を無効にしたい。

deploymentを弄ろうと思ったがmicrok8sのaddonで入れているので存在しない。

面倒なので直接deploymentを編集して

- --enable-skip-login
- --disable-settings-authorizer

をspec.template.spec.containers[0].argsに入れた。これで外からでも快適にアクセスできる。

そして本命のvip先生への外部からのアクセスだが、さすがに疲れたのでこの辺で一旦終わる。

Copilot workspaceを使いたい

だいぶまえにGithub Copilot Workspaceが使えるようになったけど、なんだかんだいまいち使う先がなかった。

実は最近Neovimを使うことが減っていて、理由としてはプラグインのせいか会社Macだと挙動がめちゃくちゃ重いし

なんか通知を綺麗にするプラグインが荒ぶっていて見た目が汚く、使う気が起きなくなりがちだったから。

なんで、なんか適当にいらなそうなプラグイン整理をやらせてみようと思う。

https://github.com/coil398/dotfiles/blob/ec82e9c762df3032f893364a1791c9508b092b6c/.config/nvim/lua/init.lua

neoclide/coc.nvim いる

nvim-lualine/lualine.nvim いる

nvim-treesitter/nvim-treesitter いる

tomasiser/vim-code-dark いる

folke/tokyonight.nvim いらない

luochen1990/rainbow いる

zbirenbaum/copilot.lua いる

nvim-telescope/telescope.nvim いる

nvim-telescope/telescope-file-browser.nvim いる

fannheyward/telescope-coc.nvim いる

smartpde/telescope-recent-files いる

nvim-telescope/telescope-github.nvim いる

LinArcX/telescope-command-palette.nvim いる

petertriho/nvim-scrollbar いる

TimUntersberger/neogit いる

folke/noice.nvim いらない

stevearc/aerial.nvim いる

itmecho/neoterm.nvim いる

hrsh7th/nvim-cmp いる

hrsh7th/cmp-cmdline いる

hrsh7th/cmp-path いる

hrsh7th/cmp-buffer いる

rust-lang/rust.vim いる

vimjas/vim-python-pep8-indent いる

fatih/vim-go いる

neovimhaskell/haskell-vim いる

luc-tielen/telescope_hoogle いる

rafcamlet/coc-nvim-lua いる

ま、ぶっちゃけ使ってないプラグインもそこそこあるけど

Issue立てる

Brainstorm(大まかな方針のこと?)させる

Plan(もうちょい具体的な実行プランみたいな)を立てさせる

書き換えたらしいけど差分はこの画面だとよく分からないっぽい? 前やったときは新規作成だったけど

よく見てなかったけどパスがおかしかった dotfiles/~/.config/...とかなってたので新規作成になっていたらしい。割と初歩的なミスをしてしまうのはご愛嬌か。なんか手動でパスを編集できたので編集してやり直してみる。

ちゃんと差分も表示されている。パスの扱いはAI苦手そうだなーとかなんとなく分かる気がする。

Update pull requestみたいなボタンを押したけど、前のコミットはそのまま残ってしまっていた。見た感じ前のコミットも消せそうではあったけどdiscardしてもUpdateできなかった。

見回したらcodespaceを開くみたいなボタンがあったので起動してみる。

修正しようとしたけどなんかよく分からないことになったのでやっぱやめ。上記の変更が未コミット状態で開いたけど既存のPRのブランチにプッシュしようと思ってもできなかった。

代わりにPRからCopilot workspaceを開いて修正させてみようと思ったけど開けなかったのでローカルでプルしてシュッと直した。

...

使い方は若干まだ慣れが必要だけどかなり便利だ。エンジニアとしてどう生きるかを考えるべきかもしれない。

Ciliumを入れたらPodが起動しなくなった

NginxのPodを適当にデプロイしようとしたら以下のようなエラーが出た。

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "e0e5c9b3bfe6e550e8edb93296b2b57add7867e5c7a93ae92ddad76dc16372b4": plugin type="cilium-cni" name="cilium" failed (add): unable to connect to Cilium agent: failed to create cilium agent client after 30.000000 seconds timeout: Get "http://localhost/v1/config": dial unix /var/snap/microk8s/7449/var/run/cilium/cilium.sock: connect: connection refused Is the agent running?

とりあえず全部のCiliumのPodをキルしたら動いた。これはなんだったんだ。

後で追記