helmで自作チャートを作成する
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
コンテナの中身は、こんな感じ
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ファイルをデプロイする必要がある。
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: {}
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番号を変更
ports:
- name: http
containerPort: 8080
protocol: TCP
values.yamlファイルにて、
image:
repository: shahidh/golang-hello
pullPolicy: Always
# Overrides the image tag whose default is the chart appVersion.
tag: "latest"
以下も、ClusterIPからNodePortへの変更とポート番号の変更
service:
type: NodePort
port: 8080
その後、k8sクラスタに、helmで管理されたk8sファイルを、デプロイする。
helm install ./demochart --generate-name
その後、
minikube service <サービス名> --url
して、生成されるURLから、無事アプリが動いていることが確認できます。
その他
helm template ./demochart
をすると、今回管理されているk8sマニフェストファイルが確認できて便利
最後に
意外とweb上だと、きちんと動く記事が少なかったため、自分用のメモ用兼用で記事を作成しました。
Discussion