helm實戰之開發Chart


一、概述

在Kubernetes環境中使用Helm來管理應用頗為方便,今天一起來開發一個Chart,這樣的實戰可加深對Chart的理解,今后在使用第三方的Chart時,不論學習還是修改都會更加得心應手;

環境信息

實戰環境的版本信息如下,請確保以下軟件都已運行正常:

操作系統 :CentOS Linux release 7.6.1810
Kubernetes:1.18.1
Helm:2.16.6

 

關於Helm安裝,請參考文章:

https://www.cnblogs.com/xiao987334176/p/12752783.html

 

二、創建Chart

1. 執行命令helm create tomcat,會創建一個tomcat目錄,里面的內容如下:
 
# helm create tomcat
Creating tomcat
[root@k8s-master ~]# tree tomcat
tomcat
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
directories, 9 files

 

2. template目錄中的deployment.yaml、service.yaml這些文件的內容,和我們平時創建pod和service時編寫的yaml文件類似,不同之處在於很多配置的值並非固定,而是用變量代替了。

以deployment.yaml中的鏡像名稱為例,如下紅色文字所示:

# cat tomcat/templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
...
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
...

上面紅色文字中的變量是在tomcat/values.yaml中定義的,如下圖紅框所示,只要我們修改了其中的內容,也就完成了depoloyment.yaml中鏡像的設置

 

修改配置

1. 修改tomcat/values.yaml的內容,包括Pod鏡像和版本、Service的類型

vi tomcat/values.yaml

修改image和service,如下面的兩個紅色文字中的內容:

...
image:
 repository: tomcat tag: 8.5.54-jdk8-openjdk
  pullPolicy: IfNotPresent

...
service:
 type: NodePort port: 8080
...

說明:

image 實際下載的鏡像是 tomcat:8.5.54-jdk8-openjdk

service 采用Nodeport方式暴露

 

2. 此次實戰並沒有准備好存活探針和就緒探針,所以這兩個配置也要去掉,否則會導致創建Kubernetes判定創建Pod失敗,修改方法是將deployment.yaml中如下內容全部刪除:

livenessProbe:
  httpGet:
    path: /
    port: http
readinessProbe:
  httpGet:
    path: /
    port: http

 

3. 修改template/deployment.yaml中的內容

vi tomcat/templates/deployment.yaml

將端口從80改為8080,如下紅色文字所示:

spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      serviceAccountName: {{ template "tomcat.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

至此,修改完畢,接下來嘗試部署到Kubernetes環境;

 

檢查和部署

1. 在tomcat文件夾所在目錄,輸入以下命令,可以看到將values.yaml的值填寫到deployment.yaml、service.yaml后的最終效果:

# helm install --dry-run --debug tomcat
[debug] Created tunnel using local port: '33793'

[debug] SERVER: "127.0.0.1:33793"

[debug] Original chart version: ""
[debug] CHART PATH: /root/tomcat
...

篇幅所限只展示了一部分輸出,可見設置的值已經生效;

 

2. 執行命令helm install tomcat,即可部署當前的Chart到Kubernetes環境,控制台輸出如下:

# helm install tomcat
NAME:   donating-indri
LAST DEPLOYED: Wed Apr 22 17:25:56 2020
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                   READY  UP-TO-DATE  AVAILABLE  AGE
donating-indri-tomcat  0/1    1           0          0s

==> v1/Pod(related)
NAME                                    READY  STATUS             RESTARTS  AGE
donating-indri-tomcat-7bf85f5b9f-7hpxw  0/1    ContainerCreating  0         0s

==> v1/Service
NAME                   TYPE      CLUSTER-IP  EXTERNAL-IP  PORT(S)         AGE
donating-indri-tomcat  NodePort  10.1.70.1   <none>       8080:31059/TCP  0s

==> v1/ServiceAccount
NAME                   SECRETS  AGE
donating-indri-tomcat  1        0s


NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services donating-indri-tomcat)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

 

3. 根據控制台的提示,我們輸入以下命令,即可獲取到外部訪問此服務的地址:

# export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services donating-indri-tomcat)P:$NODE_PORT
# export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT
http://192.168.128.130:31059

我這里得到的地址是:http://192.168.128.130:31059

 

4. 在瀏覽器輸入上述地址,如下圖:

 

 為啥會出現404呢?

因為容器中的 /usr/local/tomcat/webapps目錄是空的,但是webapps.dist目錄時有文件的。

解決辦法就是將webapps.dist里面的文件,復制到webapps。

 

 

查看pod

# kubectl get pods
NAME                                        READY   STATUS        RESTARTS   AGE
alternating-shark-tomcat-55fb7596d5-wpdkj   1/1     Running       0          82m

 

復制文件

# kubectl exec -it alternating-shark-tomcat-55fb7596d5-wpdkj /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
# cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps

 

再次刷新頁面

 

 

5. 自定義Chart開發和驗證都完成了,執行命令helm package tomcat即可將整個Chart的配置文件打包,方便在其他環境安裝部署;

至此helm開發Chart實戰就全部完成了,經歷了此番實戰,今后學習中如遇到公共倉庫有不錯的Chart,可用helm fetch xxx
將Chart包下載到本地來研究學習源碼和配置,也可自己修改后再在本地install;

如果需要刪掉運行中的Chart,需要執行2個步驟

查看當前運行的chart

# helm list
NAME                 REVISION    UPDATED                     STATUS      CHART           APP VERSION    NAMESPACE
alternating-shark    1           Wed Apr 22 17:36:54 2020    DEPLOYED    tomcat-0.1.0    1.0            default

 

刪除

# helm delete alternating-shark
release "alternating-shark" deleted

 

 

本文參考鏈接:

https://blog.csdn.net/boling_cavalry/article/details/88759724

https://blog.csdn.net/qq_40891009/article/details/103898876

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM