helm实战之开发Chart

发布时间:2020-05-11 13:07:27编辑:admin阅读(519)

    一、概述

    在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. 在浏览器输入上述地址,如下图:

    1.png

     

     为啥会出现404呢?

    因为容器中的 /usr/local/tomcat/webapps目录是空的,但是webapps.dist目录时有文件的。

    解决办法就是将webapps.dist里面的文件,复制到webapps。

     

     

    查看pod

    # kubectl get podsNAME                                        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

    再次刷新页面

    1.png

     

     

    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


关键字