一、说在前面的话
本文是紧接上文,上面已准备好了helm chart,接下来就是在K8S的kubectl执行部署。
二、使用helm部署
1、在kubectl添加helm 私有repo
[admin@jenkins]$ helm repo list
Error: no repositories to show
[admin@jenkins]$ helm repo add nexus http://150xxxx9916:123456@192.168.5.6:8081/repository/xh-helm/
"nexus" has been added to your repositories
[admin@jenkins]$ helm repo list
NAME URL
nexus http://150xxxx9916:123456@192.168.5.6:8081/repository/xh-helm/
# 现在就能检索到前文制作好的chart了
[admin@jenkins]$ helm search repo java
NAME CHART VERSION APP VERSION DESCRIPTION
nexus/java 0.1.0 1.16.0 java demo
2、部署 – chart具体化
因为我之前安装consul,使用的也是helm。
[admin@jenkins]$ helm ls -a
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
consul default 1 2020-09-24 11:07:13.666581513 +0000 UTC deployed consul-0.24.1 1.8.2
# 你可以使用--set xxx='' 替换 values.yaml中的变量。
[admin@jenkins]$ helm install --set env.javaOpts='-Dspring.profiles.active=dev' --set env.configServiceEnabled='false' --set image.tag=1.0.7 devops-service nexus/java
NAME: devops-service
LAST DEPLOYED: Fri Jun 30 10:17:19 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[admin@jenkins]$ helm ls -a
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
consul default 1 2020-09-24 11:07:13.666581513 +0000 UTC deployed consul-0.24.1 1.8.2
devops-service default 1 2023-06-30 07:53:17.486712387 +0000 UTC deployed java-0.1.8 1.16.0
三、helm chart 升级
- 可以看到,在chart升级前后,我们必须执行helm repo update,否则检索不到最新的版本包。
> helm search repo java
NAME CHART VERSION APP VERSION DESCRIPTION
nexus/java 0.1.0 1.16.0 java demo
> helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "nexus" chart repository
Update Complete. ⎈Happy Helming!⎈
> helm search repo java
NAME CHART VERSION APP VERSION DESCRIPTION
nexus/java 0.1.1 1.16.0 java demo
# 注意,在helm install前,务必先卸载
> helm uninstall devops-service
release "devops-service" uninstalled
四、验证
进入Pod,查看日志,见下
访问应用的swagger地址:
http://192.168.80.184:32195/doc.html
因为k8s中的service采用的NodePort方式,所以在k8s外部,你可以使用所在的节点IP+分配的端口号的方式访问该java应用。
五、总结遇到的问题
1、数据类型不一致
Error: INSTALLATION FAILED: Deployment in version “v1” cannot be handled as a Deployment: v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Env: []v1.EnvVar: v1.EnvVar.Value: ReadString: expects " or n, but found f, error found in #10 byte of …|,“value”:false},{“na|…, bigger context …|false”},{“name”:“CONFIG_SERVICE_ENABLED”,“value”:false},{“name”:"spring.cloud.nacos.config.accessKey|…
因为deployment.yaml中的变量CONFIG_SERVICE_ENABLED对应的值,应该是字符串,但是我赋值的是一个布尔类型。
详细见下:
- name: CONFIG_EPHEMERAL
value: 'false'
- name: CONFIG_SERVICE_ENABLED
# 修改前的代码,没有单引号引起来
# value: {{ .Values.env.configServiceEnabled }}
# 修改后的代码
value: '{{ .Values.env.configServiceEnabled }}'
2、镜像的地址错误,导致拉取镜像失败
values.yaml文件,repo地址不对。
image:
# 修改前
repository: harbor.xx.cloud/xxx/
# 修改后
repository: 192.168.5.6:8086/xxx/
deployment.yaml文件,
image: "{{ .Values.image.repository }}:{{ .Values.appName }}:{{ .Values.image.tag }}"
# 应该修改如下,去掉第一个冒号
image: "{{ .Values.image.repository }}{{ .Values.appName }}:{{ .Values.image.tag }}"
我在k8s工作节点上,手动拉取镜像,也是报错。
docker pull harbor.xx.cloud/xxx/devops-service:1.0.7
Error response from daemon: unauthorized: unauthorized to access repository: xxx/devops-service, action: pull: unauthorized to access repository: xxx/devops-service, action: pull
# 正确的写法应该是
docker pull 192.168.5.6:8086/xxx/devops-service:1.0.7
3、排查yaml
反复对比K8S里实际运行yaml文本,和你预期的是否一致,因为helm的原理比较简单,就是使用模板模式了。只要保证你的deployment.yaml和service.yaml等是对的,应用运行就没有什么大碍了。
4、一定要看运行的日志
由于我缺少了环境变量,导致pod中的devops-service容器启动失败。
后面,我在deployment.yaml中追加了环境变量。
- name: APPNAME
value: {{ .Values.appName }}
5、最后一个方法
安装k8s的UI,我这里使用的是KubePi。
刚开始,我在做持久化的时候出问题导致pod没有起来,通过UI工具,我清楚地看到是缺少了volumes。
暂时我去掉了volumes这块,说了这么多,其实遇到最大的麻烦就是保证deployment.yaml正确性。。。
六、最后的话
截止目前,没有一点的devops,顶多是一些容器化部署罢了,说了docker和k8s的一些部署事项。
现在都是手动操作哈,后面我们会引入jenkins和argo来说明如何更加做devops。