Ubuntu Weekly Recipe

第719回 UbuntuでDocker Desktop for Linuxを使う

この記事を読むのに必要な時間:およそ 6 分

Kubernetesを動かす

コンテナの話題となれば,みんな大好きKubernetes(以下k8s)は欠かせません。とはいえ自前できちんとしたk8s環境を構築するのはなかなか手間ですし,かといってAWSのEKSやGCPのGKEは,クラスターを維持するだけで結構な料金がかかりますよね。

手軽なお試し環境でよければ,過去にも紹介したように,snapパッケージのmicrok8sを使うのが簡単です。ところがDD4Lを使えば,もっと簡単にk8s環境を用意できます。というのもDD4Lにはk8sがビルトインされており,設定のGUIからチェックを入れるだけで,シングルノードクラスターを自動的に起動させることができるのです。

ウィンドウ右上の歯車アイコンをクリックして,⁠Kubernetes」を開いてください。⁠Enable Kubernetes」にチェックを入れてから「Apply & Restart」をクリックすると,k8sが起動します。

図14 デフォルトでは,k8sのシステムコンテナ(kube-proxyやcorednsなど)はDD4Lのコンテナ一覧には表示されない。⁠Show system containers」にチェックを入れることで表示させることもできるが,自分で起動したコンテナの見通しが悪くなるため,やらないほうがいいだろう

図14

図15 DD4Lのコンテナ一覧には表示されないが,docker psを実行すると,k8s関連のコンテナが起動しているのがわかる

図15

この段階でホームディレクトリ内の~/.kube/configにKUBECONFIGが作成されます。そのためkubectlコマンドをインストールするだけで,DD4L上のk8sクラスターを操作可能です。kubectlコマンドは,snapを使ってインストールするのが簡単でしょう注1⁠。

注1
こうしたバージョンアップが早い単発のコマンドラインアプリは,snapとの相性がいいな……と筆者は思います。

ただし,k8sクラスターとkubectlコマンドのバージョンの違いには注意してください。DD4L 4.9.0では,k8s 1.24.0のクラスターがデプロイされます。DD4Lのバージョンが上がっていくと,新規にデプロイされるクラスターのバージョンもその時期に応じて上がっていきますが,デプロイ済みのクラスターは自動的にアップグレードされません。そのためkubectlをデフォルトの「latest/stable」チャンネルからインストールしてしまうと,snapパッケージの自動更新によって,クライアントとクラスターのバージョンが乖離してしまう可能性があります。この問題を防ぐためには,kubectlのリリースチャンネルを明示的に指定して,バージョンを揃えるのがお勧めです。

リリースチャンネルを1.24/stableに指定してインストールする例と,インストール済みのkubectlのチャンネルを変更する例

$ sudo snap install kubectl --channel=1.24/stable --classic
$ sudo snap switch kubectl --channel=1.24/stable

図16 kubectlコマンドの実行例。docker-desktopというノード1台で構成され,kube-system名前空間にPodが起動しているのがわかる

図16

実際にk8s上にサービスを起動してみましょう。ここでは例として,HTTPのリクエストをそのまま表示する「echoserver」を起動してみます。まず以下の内容で「echoserver.yml」というマニフェストファイルを作成してください。

echoserverのマニフェスト

apiVersion: v1
kind: Namespace
metadata:
  labels:
    app: echoserver
  name: echoserver
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: echoserver
  name: echoserver
  namespace: echoserver
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: echoserver
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: echoserver
  name: echoserver
  namespace: echoserver
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echoserver
  template:
    metadata:
      labels:
        app: echoserver
    spec:
      containers:
      - image: gcr.io/kubernetes-e2e-test-images/echoserver:2.2
        imagePullPolicy: Always
        name: echoserver
        ports:
        - containerPort: 8080

続いて以下のコマンドで,マニフェストを適用します。

kubectl applyコマンドでマニフェストをクラスターに適用する

$ kubectl apply -f echoserver.yml

kubectlコマンドを使って,echoserver名前空間内にふたつのPodと,NodePortのサービスが作成されていることを確認します。

図17 割り当てられているポート(ここでは31367)はブラウザからのアクセスに必要になるため,覚えておく

図17

Webブラウザを開き,⁠http://localhost:(サービスのポート)」にアクセスしてください。echoserverの画面が表示されれば成功です。

図18 echoserverにブラウザからアクセスした画面。リクエストの情報やリクエストヘッダが表示される

図18

このようにDD4Lを使えば,簡単にシングルノードのk8sクラスターを用意できます。ローカルでのテストやデバッグに役立つのではないでしょうか。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。日本仮想化技術株式会社所属。