'static + Life

運良く生きています

Kubernetes 上に code-server を構築

TL;DR

  • 自宅鯖の Kubernetes (シングルノード) 上に code-server をデプロイした
  • Ingress (nginx-ingress-controller) を使用して外部からもアクセスできるように
  • 外部アクセスでコンテナ <-> ホスト間のファイルの編集が可能になった

環境

  • Host OS: Gentoo Linux (5.15.26-gentoo)
  • Kubernetes Engine: RKE2 v1.22.7-rke2r2
  • Helm: v3.8.0
  • code-server: v4.2.0
  • nginx-ingress-controller は RKE2 にてすでにデプロイされているので, それを使用.
    • 別の k8s engine 使う場合はデプロイは必要になるかもしれません.

ディレクトリ構造

(一部省略してます)

. (/home/kash)
├── manifests
│   ├── code-server
│   │   ├── helm-charts
...

code-server では, ~/manifests 以下を編集できるようになっています. また, code-server/helm-charts については後述します.

内容

code-server デプロイまで

ここは code-server に載ってる Helm でのインストール方法*1 を少し変えたものとなります. また, home という namespace で今回はデプロイしています.

$ git clone https://github.com/coder/code-server
$ mv code-server/ci/helm-chart ./manifests
$ cd manifests

code-server の chart を一部変更するために以下の YAML ファイルを作成 (overwrite.yaml):

ingress:
  enabled: true
  ingressClassName: "nginx"
  hosts:
    - host: <ホスト名>
      paths:
        - /

resources:
  requests:
    cpu: 100m
    memory: 1000Mi

extraVolumeMounts:
  - name: manifests
    mountPath: /k8s/manifests
    existingClaim: code-server-manifests

上記の YAML ファイルでは, Ingress の有効化及びホストやパスの設定, リソースの requests の決定, 追加でマウントする Volume (~/manifests) を指定しています.

code-server の chart は実質完成したので, 次に, PersistentVolume, PersistentVolumeClaim のマニフェストを作成します.

pv.yaml:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: code-server
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: pd-standard
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: code-server
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: code-server
  claimRef:
    name: code-server
    namespace: home
  hostPath:
    path: "/k8s_mnt/code-server"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: code-server-manifests
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: code-server
  claimRef:
    name: code-server-manifests
    namespace: home
  hostPath:
    path: "/k8s_mnt/code-server-manifests"

StorageClass では, 特に動的プロビジョンするわけではないので, provisionerkubernetes.io/no-provisioner を指定し, parameters.typeSSD というわけではないので pd-standard です. PersistentVolume では, デフォルトと Volume と追加の Volume が必要なので二つの PersistentVolume を作成しています. claimRefhome/code-serverhome/code-server-manifests という形で Claim できるようにしています. hostPath では, /k8s_mnt/ 上でマウントできるようにしています.

pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: code-server-manifests
  namespace: home
  labels:
    app.kubernetes.io/name: code-server-manifests
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: "code-server"

PersistentVolumeClaim において, home/code-server はデフォルトの chart で定義されるので, home/code-server-manifests のみの PersistentVolumeClaim の作成となります. ここは特に言うことはないです.

以上が完了したら,

$ kubectl apply -f pv.yaml -f pvc.yaml

で, PersistentVolume, PersistentVolumeClaim を作成します. そのあと,

$ helm upgrade --install code-server helm-chart -f overwrite.yaml

で, code-server をデプロイ. パスワードの表示のコマンドが出るので, 打って出力をメモします.

公開

$ kubectl describe ingress -n home code-server

にて, Backend の ClusterIP が降られていることが確認できたら公開できるので, 指定したホスト名を自宅鯖に向けることで公開が完了し, ホスト名で code-server にアクセスできます. ログインには, 先ほどのパスワードが必要なのでそれでログインできます.