Helm自定義模板以及私有庫部署

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章