Ubuntu(WSL2)にK8sのローカル開発環境を構築

はじめに

  • Kubernetesで動くシステムのローカル開発環境構築のため、KinD(Kubernetes in Docker)、k9sのインストール方法と、NGINX Ingress Controllerが動作していることを確認した

環境

  • Windows11 WSL2 Ubuntu

前提

  • WSL2、Ubuntuをインストール済み
  • UbuntuにDockerをインストール済み

手順

環境構築

  1. WSL2を立ち上げ、Dockerがインストールされていることを確認
  2. kubectlコマンドをインストール
    $ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  3. k9sのインストール
    $ curl -L https://github.com/derailed/k9s/releases/download/v0.26.7/k9s_Linux_x86_64.tar.gz -o k9s
    $ tar -xf k9s
    $ chmod +x k9s
    $ sudo mv ./k9s /usr/local/bin/k9s
  4. KinDのインストール
    $ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
    $ chmod +x ./kind
    $ sudo mv ./kind /usr/local/bin/kind

NGINX ingress controllerで動作確認

参考:https://kind.sigs.k8s.io/docs/user/ingress/

  1. kindのclusterを作成
    $ cat <<EOF | kind create cluster --config=-
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
    kubeadmConfigPatches:
    - |
    kind: InitConfiguration
    nodeRegistration:
    kubeletExtraArgs:
    node-labels: "ingress-ready=true"
    extraPortMappings:
    - containerPort: 80
    hostPort: 80
    protocol: TCP
    - containerPort: 443
    hostPort: 443
    protocol: TCP
    EOF
  2. kubectlの現在のcontextがkind-kindであることを確認
    $ kubectl config current-context
    kind-kind
  3. NGINX ingress controllerをインストール
    $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
  4. $ k9sを実行し、ingress-nginx-controllerがRUNNINNG状態になることを確認
  5. 下記のコマンドを実行
    $ kubectl wait --namespace ingress-nginx \
    --for=condition=ready pod \
    --selector=app.kubernetes.io/component=controller \
    --timeout=90s
  6. app.ymlというファイルを作成(内容は後述)し、下記のコマンドを実行
    $ kubectl apply -f app.yml
    • app.ymlをコマンドを実行するディレクトリと別の場所に作成した場合、相対パスか絶対パスでファイルを指定する
    • app.ymlの内容は下記
kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: foo-app
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 8080
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - command:
    - /agnhost
    - netexec
    - --http-port
    - "8080"
    image: registry.k8s.io/e2e-test-images/agnhost:2.39
    name: bar-app
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /foo(/|$)(.*)
        backend:
          service:
            name: foo-service
            port:
              number: 8080
      - pathType: Prefix
        path: /bar(/|$)(.*)
        backend:
          service:
            name: bar-service
            port:
              number: 8080
---

この後、$ curl localhost/fooおよび$ curl localhost/barで時刻が返ってきたら成功