翻译自:Simplifying Kubernetes with Docker Compose and Friends
今天我们很开心能够声明K8S平台上支持Docker Compose,之前这个功能只在Docker Enterprise版本(收费版)支持,现在你可以在开源K8S集群上使用这个功能。
Kubernetes API体量非常大,有超过50个一级对象,从Pods
,Deployments
到 ValidatingWebhookConfiguration
,ResourceQuota
.这导致K8S配置十分臃肿,这些配置之后都需要开发者来维护,下面看一个具体的例子。
Sock Shop是微服务的一个典型例子,它由各种不同的后端和技术栈,并且都打包成一个镜像。它也提供了不同的样例配合,分别使用Docker Compose和原生K8S配置,让我们来看一下它们各自的配置文件多少行?
描述相同的配置,K8S的配置文件行数5倍于Docker compose。这对于开发还是以后的维护都是问题。K8S API并非不好,而是太底层了,几乎允许任何形式的分布式系统配置。而Docker Compose是一个高层工具,目的就是提高开发者生产能力。在一般情况下,Compose提供对K8S配置的封装,对于一些高级配置,你仍然可以下降到K8S级别去更改Docker Compose产生的配置。
首先我们需要在K8S控制器上安装Compose.这个控制器使用飘准的K8S扩展点将Stack
引入到K8S API.Docker Desktop 提供对Compose Controller
的内置支持,你只需要更改一下配置。
在K8S集群上手动安装Compose Controller,参考安装指导文档
下面写一个实战一下:
写一个docker compose配置文件:
version: "3.7"
services:
web:
image: dockerdemos/lab-web
ports:
- "33000:80"
words:
image: dockerdemos/lab-words
deploy:
replicas: 3
endpoint_mode: dnsrr
db:
image: dockerdemos/lab-db
之后可以使用docker client将其部署到运行这个Controller的K8S集群上:
$ docker stack deploy --orchestrator=kubernetes -c docker-compose.yml words
Waiting for the stack to be stable and running...
db: Ready [pod status: 1/1 ready, 0/1 pending, 0/1 failed]
web: Ready [pod status: 1/1 ready, 0/1 pending, 0/1 failed]
words: Ready [pod status: 1/3 ready, 2/3 pending, 0/3 failed]
Stack words is stable and running
之后我们可以使用K8S API去和这些对象交互,可以看到自动创建了同样的底层对象(Pod,Service.etc.)
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/db-85849797f6-bhpm8 1/1 Running 0 57s
pod/web-7974f485b7-j7nvt 1/1 Running 0 57s
pod/words-8fd6c974-44r4s 1/1 Running 0 57s
pod/words-8fd6c974-7c59p 1/1 Running 0 57s
pod/words-8fd6c974-zclh5 1/1 Running 0 57s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/db ClusterIP None <none> 55555/TCP 57s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d
service/web ClusterIP None <none> 55555/TCP 57s
service/web-published LoadBalancer 10.102.236.49 localhost 33000:31910/TCP 57s
service/words ClusterIP None <none> 55555/TCP 57s
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/db 1 1 1 1 57s
deployment.apps/web 1 1 1 1 57s
deployment.apps/words 3 3 3 3 57s
NAME DESIRED CURRENT READY AGE
replicaset.apps/db-85849797f6 1 1 1 57s
replicaset.apps/web-7974f485b7 1 1 1 57s
replicaset.apps/words-8fd6c974 3 3 3 57s
你可以使用Docker Compose进行基础配置,使用底层K8S API操作这些由Compose配置文件自动生成的对象。
$ kubectl get stack
NAME STATUS PUBLISHED PORTS PODS AGE
words Running 33000 5/5 4m
因为Stack是K8S原生对象,你可以使用其他K8S工具去操作它。比如,将以下内容另存为stack.yaml
。
kind: Stack
apiVersion: compose.docker.com/v1beta2
metadata:
name: hello
spec:
services:
- name: hello
image: garethr/skaffold-example
ports:
- mode: ingress
target: 5678
published: 5678
protocol: tcp
当你应用改了代码之后,你可以使用Skaffold将镜像自动地重新构建,Stack重新部署。这很大程度地提升了开发者的体验。你需要使用以下内容保存至skaffold.yaml
。
apiVersion: skaffold/v1alpha5
kind: Config
build:
tagPolicy:
sha256: {}
artifacts:
- image: garethr/skaffold-example
local:
useBuildkit: true
deploy:
kubectl:
manifests:
- stack.yaml
我们正在考虑着制作一个插件去加速Compose部署应用的流程,并竭尽全力提升K8S用户体验,并希望得到更多Cloud Native社区的支持,如果你有好的想法,请告诉我们。
k8s天生支持扩展,我们希望你喜欢这个小玩意儿。如果你非常讨厌K8S极为繁琐的底层API,可以试试我们这个小工具,如果你有想法或者任何宝贵的意见,请在github上给我们个评论或者Pull Request:
GIT 地址:compose-on-kubernetes