一、说在前面的话

本文是紧接上文,上面已准备好了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。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐