gashirar's blog

ウイスキーがすき/美味しいものがすき/k8sがすき

MinikubeのAddonを作る

はじめに

MinikubeのAddonを眺めていたら下記作成手順をみつけたので試しに作ってみます。

minikube.sigs.k8s.io

開発環境

開発

Minikubeのfork

github.comからでもCLIでもよいのでforkします。

YAMLの用意

今回は例としてNginxのDeploymentとService(NodePort)を作成します。
minikube addons open対応のためkube-system上に展開します。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
    kubernetes.io/minikube-addons-endpoint: nginx
  name: nginx
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

minikube addons open対応のため、ServiceのLabelにはkubernetes.io/minikube-addons-endpointをつけておきます。

addonディレクトリの作成

forkしたリポジトリの下にaddon用のディレクトリを作成します。

mkdir deploy/addons/nginx

YAMLの配置

NginxのYAMLを先ほど作ったディレクトリに配置します。

cp ~/deployment.yaml deploy/addons/nginx/
cp ~/service.yaml deploy/addons/nginx/

Minikubeの修正

pkg/addons/config.goの修正

minikube addons list実行時に追加したAddonを表示させるために、pkg/addons/config.goに下記を追記します。

// Addons is a list of all addons
var Addons = []*Addon{
    {
        name:      "dashboard",
        set:       SetBool,
        callbacks: []setFn{enableOrDisableAddon},
    },
// 略
// 下記を追記
        {
                name:      "nginx",
                set:       SetBool,
                callbacks: []setFn{enableOrDisableAddon},
        },
}

pkg/minikube/assets/addons.goの修正

次はクラスタにコピーするためのManifestファイルの設定のため、pkg/minikube/assets/addons.goに下記を追加します。

var Addons = map[string]*Addon{
// 略
// 下記を追加
    "nginx": NewAddon([]*BinAsset{
        MustBinAsset(
            "deploy/addons/nginx/deployment.yaml",
            vmpath.GuestAddonsDir,
            "nginx-deployment.yaml",
            "0640",
            false),
        MustBinAsset(
            "deploy/addons/nginx/service.yaml",
            vmpath.GuestAddonsDir,
            "nginx-service.yaml",
            "0640",
            false),
    }, false, "nginx"),
}

MustBinAssetの引数については下記の通り:

  • source filename
  • destination directory (typically vmpath.GuestAddonsDir)
  • destination filename
  • permissions (typically 0640)
  • boolean value representing if template substitution is required (often false)

ビルド

makeするとoutディレクトリ配下にminikubeのバイナリができます。

疎通

Addonが一覧に表示されるか確認

まずはminikube addons listコマンドでNginx Addonが表示されているか見てみます。

gashirar:~/minikube$ ./out/minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nginx                       | minikube | disabled     |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   |
| storage-provisioner-gluster | minikube | disabled     |
|-----------------------------|----------|--------------|

metrics-servernvidia-driver-installerの間に表示されています。OK。

Addonの有効化

次は実際にAddonを有効化してみます。

gashirar:~/minikube$ ./out/minikube addons enable nginx
🌟  The 'nginx' addon is enabled
gashirar:~/minikube$ ./out/minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nginx                       | minikube | enabled ✅   |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   |
| storage-provisioner-gluster | minikube | disabled     |
|-----------------------------|----------|--------------|

disabledからenabledに変わりました。
kubectlでResourceも見てみます。

gashirar:~/minikube$ kubectl get deploy -n kube-system
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           2m36s
nginx     1/1     1            1           73s
gashirar:~/minikube$ kubectl get service -n kube-system
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   3m6s
nginx      NodePort    10.111.85.216   <none>        80:32355/TCP             103s

DeploymentServiceともにクラスタ上に展開されています。

Addonで展開されたNginxにアクセス

最後にNginxにアクセスしてみましょう。
今回はminikube addons openに対応してみたので、そのコマンドで疎通してみます。

gashirar:~/minikube$ ./out/minikube addons open nginx
|-------------|-------|-------------|-----------------------------|
|  NAMESPACE  | NAME  | TARGET PORT |             URL             |
|-------------|-------|-------------|-----------------------------|
| kube-system | nginx |          80 | http://192.168.99.100:32355 |
|-------------|-------|-------------|-----------------------------|
🎉  Opening Kubernetes service  kube-system/nginx in default browser...

f:id:gashirar:20200526182406p:plain

ちゃんとNginxの画面が表示されました。 おつかれさまでした。

まとめ

YAMLの準備と数行のソース書き換えでAddonの追加が出来ました。
ドキュメントの方では最後に

Once you have tested your addon, click on new pull request to send us your PR!

とあるので、興味がある方はどうぞ。