翻译自:Simplifying Kubernetes with Docker Compose and Friends

今天我们很开心能够声明K8S平台上支持Docker Compose,之前这个功能只在Docker Enterprise版本(收费版)支持,现在你可以在开源K8S集群上使用这个功能。
在这里插入图片描述

为什么有K8S还要用Docker Compose?

Kubernetes API体量非常大,有超过50个一级对象,从PodsDeploymentsValidatingWebhookConfiguration ,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

与其他K8S工具集成

因为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

Logo

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

更多推荐