Skip to content

Service

什么是 Service

Servicekubernetessvc 完全不同,Service 可以认为是对 Deployment 的增强,对应我们应用中的一个具体服务,Service 目前支持两种功能:

  • Nocalhost Dev-Mode 的配置,例如进入开发容器后的工作空间是哪个,将哪些文件同步到开发容器中,等。

  • 支持基于依赖关系的 deployment 启动顺序控制

这些配置并不是必须的!完全不进行配置,也可以照常创建 ApplicationCluster 等等,也可以照常部署你的应用,Service 只在你有需要时才需要配置。

例如,Nocalhost 支持控制一个资源的启动顺序,例如某个 deployment 必须依赖于某个k8s job 执行完毕,那么可以在 config.yaml 做如下配置:

services:
  - name: details
    type: deployment
    dependJobsLabelSelector:
    - "dep-job"

这表示你 kind: Deployment name: Deployment 的这个资源 detail.yaml,将依赖于一个 name: dep-job 的任务 dep-job.yaml 执行完毕。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: details

Service 提供的功能

1. 对开发模式的支持

前面说到 Service 承担两种角色,其一是对开发模式的支持,我们以如下这个配置为例,逐个说明:

services:
  - name: productpage
    serviceType: deployment
    gitUrl: https://github.com/nocalhost/bookinfo-productpage
    devContainerImage: codingcorp-docker.pkg.coding.net/nocalhost/dev-images/python:3.7.7-slim-productpage
    workDir: /home/nocalhost-dev
    syncDirs:
    - ./
    devPorts:
    - 39080:9080

nameserviceType

当你想使用 service 时,nameserviceType 是必填项,用于定位到某个 manifest,目前只支持 deployment 这种 serviceType例如当前有一个 Deployment ,名字为 details:

kind: Deployment
metadata:
  name: details

想要对它进行配置,则需要在 config.yaml 内的 services 下进行如下配置:

  - name: productpage
    serviceType: deployment

devContainerImage

进入开发模式所使用的容器,启动 DevMode 时,实际上会使用开发容器来替换掉目标镜像。我们会为大多数开发语言提供默认的开发容器,这个容器里面通常包含一些常用的调试工具和常用库。

当然你也可以使用自己的镜像,如:

services:
  - name: productpage
    serviceType: deployment
    devContainerImage: foo/bar/python:dev

gitUrl

用于标明与此 Service 对应的源码地址,在进入 Dev-Mode 时,你可以选择将本地某个目录同步到开发容器中,也可以选择从 git 仓库拉取,此时如果你已经配置了 gitUrl, 我们会自动帮你从这个 gitUrl 检出代码。

syncDirs

可选项,数组类型,选择将源码目录的哪些文件夹同步到开发容器中,默认为 . ,既所有。

services:
  - name: productpage
    serviceType: deployment
    syncDirs:
            - foo/
            - bar/

workDir

这是一个可选项,用于标明进入开发模式后的工作目录,以及同步文件所存放的目录,默认将使用 /home/nocalhost-dev

devPorts

自动转发的端口,在进入开发模式后,会自动将其端口转发到本地端口上,格式为localPort:remotePort,如:

services:
  - name: productpage
    serviceType: deployment
    devPorts: 8080:10000

也可以支持 :10000 这种写法,将随机转发到本地的某个端口。

2. 启动顺序依赖关系的指定

dependPodsLabelSelector

表示等待至少一个拥有此 labelpod 处于 RUNNING 状态,否则此 Service 将处于 init Container 状态。例如一个服务,例如 productpage 依赖于另一个服务 foo:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: foo

那么可以对这个 service 进行如下配置:

services:
  - name: productpage
    serviceType: deployment
    dependPodsLabelSelector: 
            - "app=foo"

dependJobsLabelSelector

表示等待至少拥有此 labeljob 已经完成并处于 Succeeded 状态,同样,如果一个服务依赖,例如 productpage 依赖于一个 job:

apiVersion: batch/v1
kind: Job
metadata:
  labels:
    foo: bar

同样可以对这个 service 进行如下配置:

services:
  - name: productpage
    serviceType: deployment
    dependJobsLabelSelector: 
            - "foo=bar"

Service的最佳实践

1.开发模式中的最佳实践 —— 不预先进行任何 service 配置

前面说到 service 并不是必须配置的,如果你没有进行任何 service 相关的配置,当你想进入开发模式时,Nocalhost-Plug-In 会为你自动生成一个模板文件,你只需对其进行修改并保存即可。

点击带有感叹号的齿轮,我们会为你生成一个模板文件:

修改开发镜像

手动修改 devContainerImage,目前我们提供 pythongolangrubynodeperlrustphpjava 这几种默认的开发镜像。

镜像格式如下:

codingcorp-docker.pkg.coding.net/nocalhost/dev-images/LANGUAGE:latest

例如想要使用 java 的默认镜像,则修改 devContainerImagecodingcorp-docker.pkg.coding.net/nocalhost/dev-images/java:latest 即可。或者可以使用其他任意镜像,我们会默认使用 /bin/bash 、/bin/csh 或 /bin/sh 作为默认命令来进入此镜像。

指定 gitUrl (可选)

当你进入开发模式之前,Nocalhost-Plug-In 会让你选择从本地指定源码目录或者从 git 检出,如果你本地已有此 deployment 的源码,则不需要进行 gitUrl 配置,直接选择 Open local derectory 即可。

反之,如果你希望 Nocalhost 帮你进行检出,则修改 girUrl 到对应值。

修改 syncDirs (可选)

在默认提供的配置模板中,我们会自动填写同步 git 目录(或者所选目录)下的所有文件,即 .

# dirs to sync, relative to the root dir of source code
# type: string[]
# default value: ["."]
# optional
syncDirs:
  - "."

如果你只想同步指定的几个目录,可以对其进行修改,如:

syncDirs:
  - "bar/"
  - "foo/"

进入开发模式

做完上述配置后,点击锤子进入开发模式,我们将使用配置中指定的镜像来替换掉原有的镜像,并将对应的文件同步到这个容器中。

2.开发模式中的最佳实践 —— 在 .nocalhost 目录下进行默认的 service 配置

如果你希望维护一份默认的配置,则在 Application 所指定的 git 仓库中,在根目录新增 .nocalhost 文件夹,并新增 config.yaml 文件。

.nocalhost/
                    config.yaml
README.MD
kubemanifest/
                        xxx.yaml
                        ...
foo.java
...

例如:

services:
  - name: productpage
    serviceType: deployment
    gitUrl: https://github.com/nocalhost/bookinfo-productpage
    devContainerImage: codingcorp-docker.pkg.coding.net/nocalhost/dev-images/python:3.7.7-slim-productpage
    workDir: /home/nocalhost-dev
    syncDirs:
    - ./
    devPorts:
    - 39080:9080
    dependJobsLabelSelector:
    - "dep-job"
  - name: details
    serviceType: deployment
    gitUrl: https://github.com/nocalhost/bookinfo-details.git
    devContainerImage: codingcorp-docker.pkg.coding.net/nocalhost/dev-images/ruby:2.7.1-slim
    syncDirs:
    - ./
    workDir: /home/nocalhost-dev
  - name: ratings
    serviceType: deployment
    gitUrl: https://github.com/nocalhost/bookinfo-ratings.git
    devContainerImage: codingcorp-docker.pkg.coding.net/nocalhost/dev-images/node:12.18.1-slim
    workDir: /home/nocalhost-dev
    syncDirs:
    - ./
    dependJobsLabelSelector:
    - "dep-job"
    dependPodsLabelSelector:
    - "productpage"
    - "app.kubernetes.io/name=productpage"

Deployment 进行了 service 的配置,当用户 InstallApplication 时,会拿到这些默认配置,如 'ratings' 这个 deployment,点击齿轮查看当前的配置:

用户可以自由的基于这些配置做修改,这些修改仅在本地生效。