文章目录
- 部署流程
- 模板目录
- 文件解析
- Deployment
- Service
- Ingress
- _helpers.tpl
- Chart.yaml
- values.yaml
- 部署命令
部署流程
- 准备 jar 包
- 使用 Dockerfile 构建镜像
- 上传镜像到仓库(Harbor)
- 使用 Helm 模板部署 jar 到 K8S
本文着重讲解第四步,如何制作 Helm 模板
模板目录
如图所示,整个模板有两大部分组成
第一部分是外层:
- Chart.yml:模板基础信息,例如名称、版本等
- values.yaml:模板的默认传入值
第二部分是 templates:
- _helpers.tpl:此文件中定义一些可重用的模板片断,可在任何资源定义模板中使用
- deployment.yaml:部署 deployment
- service.yaml:定义服务端口
- ingress.yaml:定义访问域名
文件解析
Deployment
- metadata.labels:添加标签,用于识别的唯一标识
- replicas:需要构建多少个
- spec.selector.matchLabels:和 metadata.labels 对应
- spec.template.metadata:和 metadata.labels 对应
- containers.image:镜像路径
- containers.imagePullPolicy:镜像拉取策略,Always:总是拉取;IfNotPresent:默认值,本地有则使用本地镜像,否则拉取;Never:只用本地镜像,不拉取
- containers.ports.containerPort:pod 暴露的端口号
- testchart.env:定义运行环境
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
labels:
app: {{ .Values.name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.name }}
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: {{ .Values.name }}
spec:
containers:
- name: {{ .Values.name }}
image: "{{ .Values.image.name }}"
imagePullPolicy: IfNotPresent
ports:
- name: tcp-{{ .Values.service.port }}
containerPort: {{ .Values.service.port }}
protocol: TCP
{{- if .Values.env.enabled -}}
{{ include "testchart.env" . | indent 10 }}
{{- end }}
Service
- spec.ports.port:设置为80,引用服务时就不需填写端口号
- spec.selector:匹配标签,和 Deployment 的 metadata.labels 对应
- spec.type:Service 的类型,ClusterIP、NodePort、LoaderBalancer
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.name }}
spec:
ports:
- name: tcp-{{ .Values.service.port }}
port: 80
protocol: TCP
targetPort: {{ .Values.service.port }}
selector:
app: {{ .Values.name }}
type: {{ .Values.service.type }}
Ingress
- spec.rules.host:配置域名
- spec.rules.http.paths.backend.serviceName:对应 Service 名称
{{- $hostName := .Values.hostname -}}
{{- $env := .Values._env.name -}}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Values.name }}-ingress-http
spec:
rules:
- host: {{ $hostName }}.{{ $env }}.api.com
http:
paths:
- backend:
serviceName: {{ .Values.name }}
servicePort: 80
{{- if .Values.env.enabled -}}
_helpers.tpl
- env:容器运行前需设置的环境变量列表
- JAVA_OPTS:设置 JVM 相关运行参数的变量
{{- define "testchart.env" }}
env:
- name: JAVA_OPTS
value: -Dspring.profiles.active={{ .Values.env.active }}
{{- end }}
Chart.yaml
apiVersion: v1
name: helm-chart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0
values.yaml
name: demo
replicaCount: 1
_env:
name: dev
hostname: xxx
image:
name: xxxxxx:v1
pullPolicy: IfNotPresent
env:
enabled: true
active: "dev"
service:
type: ClusterIP
port: 8080
部署命令
登录 harbor
helm repo add --username admin --password Harbor12345 harbor http://192.168.140.01/chartrepo/xxx
配置集群访问的文件 kubeconfig
export KUBECONFIG=~/kubeconfig
chmod g-r ~/kubeconfig
chmod o-r ~/kubeconfig
部署
helm install -f values.yaml xxxname harbor/helmname