Helm自定義模板以及私有庫部署
開發自己的chart
[root@master ~]# helm create mychart
Creating mychart
[root@master ~]# tree -C mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
[root@master mychart]# pwd
/root/mychart
[root@master mychart]# vim values.yaml
replicaCount: 1
image:
repository: nginx
tag: stable
pullPolicy: IfNotPresent
---------- #這些都都是默認信息
因爲這是我們自己開發的,所以有可能會出現錯誤,一般我們在部署之前都會進行調試
調試
[root@master ~]# helm install --dry-run --debug mychart
修改values.yaml文件,模擬一些錯誤來查看效果
[root@master ~]# helm install --dry-run --debug mychart
): error converting YAML to JSON: yaml: line 12: could not find expected ':'
#會告訴你第12行少了個:但是這個12行不是特別準確,只是一個大概的方向
安裝chart
四種方法
- 通過倉庫安裝
- 將chart下載下來,通過tar包安裝
- 通過chart本地目錄安裝(將tar包解壓得到的目錄)
- 通過URL安裝
1、通過倉庫安裝(以redis爲例)
[root@master ~]# helm install stable/redis -n redis
2、將chart下載下來,通過tar包安裝
[root@master ~]# helm fetch stable/redis
[root@master ~]# helm install redis-1.1.15.tgz
3、通過chart本地目錄安裝
[root@master ~]# tar zxf redis-1.1.15.tgz
[root@master ~]# tree -C redis
redis
├── Chart.yaml
├── README.md
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── networkpolicy.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ └── svc.yaml
└── values.yaml
[root@master ~]# helm install redis
4、通過URL安裝
[root@master ~]# helm install http://xxx/charts/xxx.tgz -n name
使用本地目錄安裝剛剛自定義的mychart:
要求:
副本Pod數量爲3個
service類型爲NodePort
映射的端口爲31033
[root@master ~]# cd mychart/
[root@master mychart]# vim values.yaml
replicaCount: 3
service:
type: NodePort
port: 80
nodePort: 31033
[root@master mychart]# helm install -n test ../mychart/
[root@master mychart]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-mychart-657bfc65b8-5j8qn 1/1 Running 0 30s
test-mychart-657bfc65b8-bgt2s 1/1 Running 0 30s
test-mychart-657bfc65b8-v2sph 1/1 Running 0 30s
[root@master mychart]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
test-mychart 3/3 3 3 46s
[root@master mychart]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 61d
test-mychart NodePort 10.104.53.170 <none> 80:30393/TCP 50s
#可以看到這裏的端口與我們指定的並不一致
因爲這些yaml文件都是引用template模板,template模板目錄下的service.yaml裏面沒有nodePort字段,只需要在service.yaml文件裏添加就行
#實例的更新
[root@master templates]# pwd
/root/mychart/templates
[root@master templates]# vim service.yam
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
nodePort: {{ .Values.service.nodePort}}
#再更新以下,進行驗證
[root@master ~]# helm upgrade test mychart/ -f mychart/values.yaml
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 61d
test-mychart NodePort 10.104.53.170 <none> 80:31033/TCP 10m
#端口已經改變了
一般在企業都是使用自己的私有鏡像,那麼就需要搭建私有倉庫
[root@master ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.70:5000
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docke
#node01、node02也加入私有倉庫
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.70:5000
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docke
[root@node02 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.70:5000
[root@node02 ~]# systemctl daemon-reload
[root@node02 ~]# systemctl restart docke
導入私有鏡像,並上傳到私有倉庫
[root@master ~]# docker load < httpd-v1.tar && docker load < httpd-v2.tar && docker load < httpd-v3.tar
[root@master ~]# docker tag httpd:v1 192.168.1.70:5000/httpd:v1
[root@master ~]# docker push 192.168.1.70:5000/httpd:v1
[root@master ~]# docker push 192.168.1.70:5000/httpd:v1
[root@master ~]# docker tag httpd:v2 192.168.1.70:5000/httpd:v2
[root@master ~]# docker tag httpd:v3 192.168.1.70:5000/httpd:v3
[root@master ~]# docker push 192.168.1.70:5000/httpd:v2
[root@master ~]# docker push 192.168.1.70:5000/httpd:v3
node01、node02拉去鏡像
[root@node01 ~]# docker pull 192.168.1.70:5000/httpd:v1
[root@node01 ~]# docker pull 192.168.1.70:5000/httpd:v2
[root@node01 ~]# docker pull 192.168.1.70:5000/httpd:v3
[root@node02 ~]# docker pull 192.168.1.70:5000/httpd:v1
[root@node02 ~]# docker pull 192.168.1.70:5000/httpd:v2
[root@node02 ~]# docker pull 192.168.1.70:5000/httpd:v3
練習:
使用mychart部署一個實例,名爲bdqn,使用私有鏡像v1版本
完成之後,將實例做一個升級,將鏡像改爲v2版本
#修改yaml文件,運行實例
[root@master ~]# vim mychart/values.yaml
image:
repository: 192.168.1.70:5000/httpd
tag: v1
pullPolicy: IfNotPresent
[root@master ~]# helm install -n bdqn mychart/
[root@master ~]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
bdqn-mychart 1/1 1 1 8s mychart 192.168.1.70:5000/httpd:v1 app.kubernetes.io/instance=bdqn,app.kubernetes.io/name=mychart
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
bdqn-mychart-574ffc5496-bd8vf 1/1 Running 0 22s
#實例升級,通過yaml文件的方式
[root@master ~]# vim mychart/values.yaml
image:
repository: 192.168.1.70:5000/httpd
tag: v2
[root@master ~]# helm upgrade bdqn mychart/ -f mychart/values.yaml
[root@master ~]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
bdqn-mychart 1/1 1 1 2m54s mychart 192.168.1.70:5000/httpd:v2 app.kubernetes.io/instance=bdqn,app.kubernetes.io/name=mychart
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
bdqn-mychart-85dcbbcb8f-8h47q 1/1 Running 0 5m28s
#還可以通過命令的方式
[root@master ~]# helm upgrade bdqn mychart/ --set imageTAG=v2
//這種方法更新完成後,查看deployment的時候,鏡像顯示是沒有更新的
#還可以通過edit的方式進行更改
[root@master ~]# kubectl edit deployments. bdqn-mychart
spec:
containers:
- image: 192.168.1.70:5000/httpd:v3
[root@master ~]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
bdqn-mychart 1/1 1 1 28m mychart 192.168.1.70:5000/httpd:v3 app.kubernetes.io/instance=bdqn,app.kubernetes.io/name=mychar
創建自己的Repo倉庫
我們自己創建的chart包,如果公司內其他的同事也需要用,我們可以cp一份給他,但是效率太低,所以就可以創建一個repo倉庫,解決這個需求
1、在node01上運行一個httpd的容器(作爲私有倉庫)
[root@node01 ~]# mkdir /var/www
[root@node01 ~]# docker run -d -p 8080:80 -v /var/www/:/usr/local/apache2/htdocs httpd:latest
[root@node01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03e5e3ef5c95 httpd:latest "httpd-foreground" 13 seconds ago Up 12 seconds 0.0.0.0:8080->80/tcp kind_roentgen
2、master節點上,使用helm package將mychart目錄打包
[root@master ~]# helm package mychart/
Successfully packaged chart and saved it to: /root/mychart-0.1.0.tgz
[root@master ~]# ls
mychart-0.1.0.tgz
3、執行helm repo index生成倉庫的index文件
[root@master ~]# mkdir myrepo
[root@master ~]# mv mychart-0.1.0.tgz myrepo/
[root@master ~]# ls myrepo/
mychart-0.1.0.tgz
[root@master ~]# helm repo index myrepo/ --url http://192.168.1.50:8080/charts #第一步運行的容器的IP+端口
[root@master ~]# ls myrepo/
index.yaml mychart-0.1.0.tgz
[root@master ~]# cat myrepo/index.yaml
apiVersion: v1
entries:
mychart:
- apiVersion: v1
appVersion: "1.0"
created: "2020-03-04T11:08:33.079034645+08:00"
description: A Helm chart for Kubernetes
digest: f2a297c4b377ae7f208848bef8823eeb74ebb7270d8bf07f58270678d0784056
name: mychart
urls:
- http://192.168.1.50:8080/charts/mychart-0.1.0.tgz
version: 0.1.0
generated: "2020-03-04T11:08:33.07808906+08:00"
4、將生成的tar包和index.yaml上傳到node01的/var/www/charts目錄下
#因爲node01上沒有sharts目錄,所以需要創建
[root@node01 ~]# mkdir /var/www/chart
[root@master ~]# cd myrepo/
[root@master myrepo]# scp index.yaml mychart-0.1.0.tgz node01:/var/www/charts
index.yaml 100% 400 0.4KB/s 00:00
mychart-0.1.0.tgz 100% 2861 2.8KB/s 00:00
#在node01上進行驗證
[root@node01 ~]# ls /var/www/charts
index.yaml mychart-0.1.0.tgz
5、添加新的repo倉庫
[root@master myrepo]# helm repo add myrepo http://192.168.1.50:8080/charts
"myrepo" has been added to your repositories
[root@master myrepo]# helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts #這個是不能跨主機的只能在本地使用
myrepo http://192.168.1.50:8080/charts #這個可以跨主機
至此,已經可以正常供內網環境使用這個charts包的私有倉庫了
6、驗證,我們就可以直接使用新的repo倉庫部署實例了
[root@master myrepo]# helm search mychart
NAME CHART VERSION APP VERSION DESCRIPTION
local/mychart 0.1.0 1.0 A Helm chart for Kubernetes
myrepo/mychart 0.1.0 1.0 A Helm chart for Kubernetes
[root@master myrepo]# helm install myrepo/mychart -n test
[root@master ~]# helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
test 1 Wed Mar 4 11:23:25 2020 DEPLOYED mychart-0.1.0 1.0
7、如果以後倉庫中新添加了chart包,需要用helm repo update命令更新本地的index文件
練習:
新創建一個bdqn的chart包,然後將chart包上傳到上述repo源中
#創建新的chart
[root@master ~]# helm create bdqn
Creating bdqn
#將這個chart目錄打包
[root@master ~]# helm package bdqn/
Successfully packaged chart and saved it to: /root/bdqn-0.1.0.tgz
#移動到myrepo下
[root@master ~]# mv bdqn-0.1.0.tgz myrepo/
[root@master ~]# ls myrepo/
bdqn-0.1.0.tgz index.yaml mychart-0.1.0.tgz
#更新index文件
[root@master ~]# helm repo index myrepo/ --url http://192.168.1.50:8080/charts
[root@master myrepo]# scp bdqn-0.1.0.tgz index.yaml node01:/var/www/charts
bdqn-0.1.0.tgz 100% 2826 2.8KB/s 00:00
index.yaml 100% 720 0.7KB/s 00:00
#更新repo倉庫
[root@master myrepo]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "myrepo" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
#搜索驗證
[root@master myrepo]# helm search bdqn
NAME CHART VERSION APP VERSION DESCRIPTION
local/bdqn 0.1.0 1.0 A Helm chart for Kubernetes
myrepo/bdqn 0.1.0 1.0 A Helm chart for Kubernetes
使用url部署這個bdqn實例
[root@master ~]# helm install http://192.168.1.50:8080/charts/bdqn-0.1.0.tgz -n t1
[root@master ~]# helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
t1 1 Wed Mar 4 11:52:50 2020 DEPLOYED bdqn-0.1.0 1.0 default
test 1 Wed Mar 4 11:23:25 2020 DEPLOYED mychart-0.1.0 1.0