🐡

helmで自作チャートを作成する

2022/08/07に公開

helmとは

k8sのパッケージマネージャー

helmを使うと作成されたk8sリソースを一括で作成or削除して、整合性を保つことができる。

チャートとは、管理対象のパッケージのこと

今回の記事では、

ルートにアクセスすると「hello world!」を返すアプリを使って、

  • Dockerコンテナを動かす
  • Dockerコンテナをk8s上で動かす
  • helmで管理した上でk8s上で動かす

の順に実行していきます。

環境

minikube: v1.25.2
helm: v3.9.2
kubectl: Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", GitCommit:"aea7bbadd2fc0cd689de94a54e5b7b758869d691", GitTreeState:"clean", BuildDate:"2021-09-15T21:10:45Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"darwin/amd64"}

Dockerコンテナを動かす

まずはpullして、ローカルでコンテナを立てて、挙動を確認

docker pull shahidh/golang-hello

docker run -p 8080:8080 shahidh/golang-hello

コンテナの中身は、こんな感じ

main.go
package main

import (
        "net/http"
        "log"
        "fmt"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

http://localhost:8080/ にアクセスすると、下記が表示される

k8s上で動かす

上記をk8sで実行するには、deployment.yamlとservice.yamlファイルをデプロイする必要がある。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo
    speHec:
      containers:
        - image: shahidh/golang-hello
          name: kubernetes
          resources: {}
status: {}
service.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo-service
spec:
  ports:
    - port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: demo
  type: NodePort
status:
  loadBalancer: {}

minikube start --vm-driver=virtualboxでminikubeを起動しクラスタを作成した後に、下記コマンドを実行して、k8s上で展開します。

kubectl apply -f deployment.yaml 
kubectl apply -f service.yaml

k8s上で、コンテナの準備が整ったら、下記コマンドで発行されるURLにアクセスすれば、先程と同じように「Hello World!」が表示されているはずです。

minikube service <サービス名> --url

helmで管理した上でk8s上で動かす

上記のk8sファイルを、helmで管理できるようにします

helm create demochart

すると、下記が生成されます。

.
└── demochart
    ├── Chart.yaml
    ├── charts
    ├── templates
    │   ├── NOTES.txt
    │   ├── _helpers.tpl
    │   ├── deployment.yaml
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── service.yaml
    │   ├── serviceaccount.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml

deployment.yamlファイルにてport番号を変更

deployment.yaml
  ports:
    - name: http
      containerPort: 8080
      protocol: TCP

values.yamlファイルにて、

values.yaml
image:
  repository: shahidh/golang-hello
  pullPolicy: Always
  # Overrides the image tag whose default is the chart appVersion.
  tag: "latest"

以下も、ClusterIPからNodePortへの変更とポート番号の変更

values.yaml
service:
  type: NodePort
  port: 8080

その後、k8sクラスタに、helmで管理されたk8sファイルを、デプロイする。

helm install ./demochart --generate-name

その後、

minikube service <サービス名> --url

して、生成されるURLから、無事アプリが動いていることが確認できます。

その他

helm template ./demochart

をすると、今回管理されているk8sマニフェストファイルが確認できて便利

最後に

意外とweb上だと、きちんと動く記事が少なかったため、自分用のメモ用兼用で記事を作成しました。

Discussion