有时我发现自己需要在一个实时的Kubernetes集群上运行一个Ruby脚本。在今天的例子中,它与生成MySQL的负载有关,这在我的笔记本电脑上做起来比较棘手。脚本必须在集群中的工作负载附近运行。
我很懒,要用我的脚本建立和推送一个Docker容器将是一个很大的额外工作。
幸运的是,由于K8S的配置图和Bundler的内联模式,这可以实现,而不必建立一个自定义的容器。
首先,让我们用我们的代码创建一个配置图。
apiVersion: v1
kind: ConfigMap
metadata:
name: load-generator
data:
writer.rb: |
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'mysql2'
end
require 'mysql2'
client = Mysql2::Client.new(database: 'commerce')
loop { client.query("select * from orders") }
# more code follows...
然后进行部署,从我们的配置图中提取ruby:2.7 镜像并运行文件。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: load-generator
name: load-generator
spec:
replicas: 1
selector:
matchLabels:
app: load-generator
template:
metadata:
labels:
app: load-generator
spec:
containers:
- image: ruby:2.7
name: ruby
command: ["ruby"]
args: ["/app/writer.rb"]
volumeMounts:
- name: load-generator
mountPath: /app/writer.rb
subPath: writer.rb
restartPolicy: Always
volumes:
- name: load-generator
configMap:
name: load-generator
你只需要kubectl apply -f 上面的YAML,你就可以运行你的脚本了。