成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Helm (Kubernetes) vol.1

環境

  • OS: macOS High Sierra 10.13.3
  • Docker(ForMac): Version 18.03.0-ce-rc1-mac54 (23022)

Helm

そう、helm。 Emacserにはお馴染み、違う。 そのhelmじゃないw

https://docs.helm.sh/

xxx.sh っていうドメイン(・∀・)イイネ!!

Helm is the best way to find, share, and use software built for Kubernetes.

そう、k8s上で動かすソフトウェアをパッケージ管理する為の物

k8sにMySQL入れたり、とかとか、楽にできるようにするやつ。

installation

kubernetes

まずは、兎にも角にもk8sが必要だ。

https://qiita.com/taishin/items/920d62a641c9cd58f289

gcloudコマンド経由でkubectlインストールしてると競合する… ので、先に消しとく

gcloud components remove kubectl
which kubectl

して

/usr/local/bin/kubectl

を参照してればOK

❯ kubectl config get-contexts
CURRENT   NAME                                                                        CLUSTER                                                                     AUTHINFO                                                                    NAMESPACE
          docker-for-desktop                                                          docker-for-desktop-cluster                                                  docker-for-desktop

いっぱいあるーね。 でもちゃんと、GKEのcontextも読めてるのでOK

docker-for-desktop がローカルのやつ。 さぁ、contextを切り替えておこう。

❯ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
❯ kubectl config get-contexts
CURRENT   NAME                                                                        CLUSTER                                                                     AUTHINFO                                                                    NAMESPACE
*         docker-for-desktop                                                          docker-for-desktop-cluster                                                  docker-for-desktop

OK

helm

今時のツールはdocumentがしっかりしてるし、構築は楽にできるようになってるね。 homebrewで終了。

brew install kubernetes-helm

Helmを使う

Init

まずは、K8sがHelmを使えるようにする為にinitする必要がある。

~ ❯ helm init
$HELM_HOME has been configured at /Users/xxx/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
  • $HELM_HOME が設定される
  • Tiller ってやつがk8sにinstallされたらしい
~ ❯ kubectl get po --all-namespaces
NAMESPACE     NAME                                         READY     STATUS    RESTARTS   AGE
docker        compose-5d4f4d67b6-5d7d8                     1/1       Running   0          20m
docker        compose-api-7bb7b5968f-8fwmw                 1/1       Running   0          20m
kube-system   etcd-docker-for-desktop                      1/1       Running   0          20m
kube-system   kube-apiserver-docker-for-desktop            1/1       Running   0          20m
kube-system   kube-controller-manager-docker-for-desktop   1/1       Running   0          20m
kube-system   kube-dns-6f4fd4bdf-lpjhf                     3/3       Running   0          21m
kube-system   kube-proxy-sf4n4                             1/1       Running   0          21m
kube-system   kube-scheduler-docker-for-desktop            1/1       Running   0          21m
kube-system   tiller-deploy-5bd98cbb68-skrqn               1/1       Running   0          1m

kube-system tiller-deploy-5bd98cbb68-skrqn 1/1 Running 0 1m

↑これ

パッケージを見てみよう

helmではパッケージをChartsと呼ぶ(海図らしい)

~ ❯ helm search
NAME                            VERSION DESCRIPTION
stable/acs-engine-autoscaler    2.1.0   Scales worker nodes within agent pools
stable/artifactory              6.1.0   Universal Repository Manager supporting all maj...
stable/aws-cluster-autoscaler   0.3.1   Scales worker nodes within autoscaling groups.
stable/buildkite                0.2.0   Agent for Buildkite
…

長いので、省略するけど、結構いろいろある。 デフォルトのレポジトリ。

Helm使って何か動かしてみるか

手始めにk8sのダッシュボードを入れてみるかな GKEはデフォルトではいってる

stable/kubernetes-dashboard

これ。

~ ❯ helm inspect stable/kubernetes-dashboard
appVersion: 1.7.1
description: General-purpose web UI for Kubernetes clusters
keywords:
- kubernetes
- dashboard
maintainers:
- email: Kevin.Fox@pnnl.gov
  name: kfox1111
name: kubernetes-dashboard
version: 0.4.1

---
# Default values for kubernetes-dashboard
# This is a YAML-formatted file.
# Declare name/value pairs to be passed into your templates.
# name: value

image: gcr.io/google_containers/kubernetes-dashboard-amd64
imageTag: "v1.7.1"
imagePullPolicy: "IfNotPresent"

nodeSelector: {}

httpPort: 80

serviceType: ClusterIP

resources:
  limits:
    cpu: 100m
    memory: 50Mi
  requests:
    cpu: 100m
    memory: 50Mi

ingress:
  ## If true, Kubernetes Dashboard Ingress will be created.
  ##
  enabled: false

  ## Kubernetes Dashboard Ingress annotations
  ##
  # annotations:
  #   kubernetes.io/ingress.class: nginx
  #   kubernetes.io/tls-acme: 'true'

  ## Kubernetes Dashboard Ingress hostnames
  ## Must be provided if Ingress is enabled
  ##
  # hosts:
  #   - kubernetes-dashboard.domain.com

  ## Kubernetes Dashboard Ingress TLS configuration
  ## Secrets must be manually created in the namespace
  ##
  # tls:
  #   - secretName: kubernetes-dashboard-tls
  #     hosts:
  #       - kubernetes-dashboard.domain.com

rbac:
  ## If true, create & use RBAC resources
  #
  create: false

  ## Ignored if rbac.create is true
  #
  serviceAccountName: default

Default values for kubernetes-dashboard

って書いてある所以下が、パラメータになっていて、 Ansibleの defaults/main.yml みたいな感じで、設定を外から渡せるようになっている。

ひとまず、そのまま立ち上げてみよう。

~ ❯ helm install stable/kubernetes-dashboard
NAME:   brown-whippet
LAST DEPLOYED: Sat Mar  3 22:26:48 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/Deployment
NAME                                DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
brown-whippet-kubernetes-dashboard  1        1        1           0          0s

==> v1/Service
NAME                                CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
brown-whippet-kubernetes-dashboard  10.107.90.189  <none>       80/TCP   0s


NOTES:
*********************************************************************************
*** PLEASE BE PATIENT: kubernetes-dashboard may take a few minutes to install ***
*********************************************************************************

Get the Kubernetes Dashboard URL by running:
  export POD_NAME=$(kubectl get pods -n default -l "app=kubernetes-dashboard,release=brown-whippet" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:9090/
  kubectl -n default port-forward $POD_NAME 9090:9090

~ ❯ helm ls
NAME            REVISION        UPDATED                         STATUS          CHART                           NAMESPACE
brown-whippet   1               Sat Mar  3 22:26:48 2018        DEPLOYED        kubernetes-dashboard-0.4.1      default

瞬殺。

~ ❯ kubectl get po
NAME                                                  READY     STATUS    RESTARTS   AGE
brown-whippet-kubernetes-dashboard-6c546f54f8-tmccq   1/1       Running   0          3m

ちゃんと動いてる じゃあ、画面見てみるか。

Get the Kubernetes Dashboard URL by running:
  export POD_NAME=$(kubectl get pods -n default -l "app=kubernetes-dashboard,release=brown-whippet" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:9090/
  kubectl -n default port-forward $POD_NAME 9090:9090

丁寧に書いてくれてるね。

http://localhost:9090 でアクセスできる。

てか、なんか大分いろいろ見やすくなってる… 進化してるな。 こんどモニタリングでdashboard使ってみよう。

installしたChartsを落とす

helm delete

してみる。

~ ❯ helm delete stable/kubernetes-dashboard
Error: invalid release name, must match regex ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+$ and the length must not longer than 53

Charts名じゃ消せないらしい。 デプロイしたChartsに対してnameが振られているので、そっちで消す。 (同じChartsでもname分けて複数デプロイできるようになっている)

~ ❯ helm ls
NAME            REVISION        UPDATED                         STATUS          CHART                           NAMESPACE
brown-whippet   1               Sat Mar  3 22:26:48 2018        DEPLOYED        kubernetes-dashboard-0.4.1      default
~ ❯ helm delete brown-whippet
release "brown-whippet" deleted
~ ❯ helm ls
~ ❯ kubectl get po
No resources found.

消えました。

今日はここまで。

TODO

  • 独自Chartsを書いてみる
  • PrivateRepositoryは使えるのか?
    • 独自repositoryを作る
  • etc…