依赖mysql、redis,使用configmap管理配置文件、secret管理私密配置、hooks管理db migrate
准备工作
- k8s环境以及helm安装配置请看《使用minikube部署k8s环境,helm部署应用》
- 本次案例docker image使用之前构建的镜像《使用gitlab-ci构建持续集成最佳实践》
创建chart项目
helm create rails-app-demo
其他文件都需要手动创建,初始化只提供了简单的模版
配置依赖requirements.yml
手动创建并定义需要依赖的chart包
dependencies:
- name: mysql
version: 1.6.1
repository: https://kubernetes-charts.storage.googleapis.com
condition: mysql.enabled
- name: redis
version: 10.2.1
repository: https://charts.bitnami.com
condition: redis.enabled
helm dependency update rails-app-demo
会自动下载chart文件到charts文件夹中,并生成requirements.lock
在values.yaml中开启mysql和redis
mysql:
enabled: true
redis:
enabled: true
依赖关系配置完毕,测试启动chart
# 这里用的Helm V3
helm install rails rails-app-demo
# 移除
helm delete rails
接下来正式开始配置rails app相关的服务
values配置
定义镜像信息
如果用的是私有镜像源需要配置imagePullSecrets
image:
repository: your_repo_server/test/rails-gitlabci-demo
tag: 14cae314f5c5a9b96c29be9acd49a5ff93a96e1c
pullPolicy: IfNotPresent
定义service信息
RAILS_SERVE_STATIC_FILES是Rails内的配置,如果不开启将访问不了静态文件
service:
type: ClusterIP
port: 80
env:
- name: RAILS_SERVE_STATIC_FILES
value: "true"
- name: SECRET_KEY_BASE
value: xxxxxxxxxx
定义mysql信息
这里需要自定义配置支持中文,不然rails保存中文会报错,存储类用的minikube的默认存储
mysql:
enabled: true
mysqlDatabase: rails-gitlabci-demo_production
mysqlUser: imshanks
mysqlPassword: imshanks
persistence:
enabled: true
storageClass: standard
# initializationFiles:
# first-db.sql: |-
# CREATE DATABASE IF NOT EXISTS rails-gitlabci-demo_production DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
configurationFiles:
mysql_custom.cnf: |-
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
定义redis信息
redis:
enabled: true
# Only used when internal redis is disabled
# host: redis
password: imshanks
# port: 6379
master:
persistence:
enabled: true
storageClass: standard
slave:
persistence:
enabled: true
storageClass: standard
定义ingress信息
本地部署的话需要来hosts里配置rails.test.com,公网部署的话配置域名解析就行了
ingress:
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: rails.test.com
paths:
- "/"
配置congfigmap
通过configmap定义secrets.yml、database.yml、puma.rb和sidekiq.rb,好处是可以动态配置动态生效无需重启容器,配置变更不需要重打镜像
配置secret
secret和configmap类似,专用于保存私密信息,这里设置了redis和mysql的密码
配置deployment
service不用配置,模版已经生成并且和deployment.yaml匹配好了
获取configmap
首先设置volumes
然后设置volumeMounts,对应到容器里的路径
获取values中配置的env变量
我们在configmap里把配置文件里的参数都定义成了读取环境变量的模式,所以可以在values中赋值
在deployment中可以批量读取
获取secrets
密码相关信息也是通过环境变量专递的,所以也在env下配置
健康度检查
需要在应用内专门做一个接口用于报告状态,200才算健康,否则会自动判定为error
livenessProbe:
httpGet:
path: /status
port: http
readinessProbe:
httpGet:
path: /status
port: http
配置启动命令
puma和sidekiq分成2个pod启动,命令配置不一样,sidekiq不需要配置svc,其他的都一样
# puma server
command: ['sh', '-c', 'puma -C /app/config/puma.rb']
# sidekiq server
command: ['sh', '-c', 'sidekiq -e production --logfile /app/log/sidekiq.log']
配置hooks
hooks可以配置job,这里用于执行db migrate,保证应用可以无需任何手动操作直接使用,这里只需要读取database的config就行了
大功告成
再次启动
验证一下rails服务
验证下sidekiq服务