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
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 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
再次刷新页面
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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341