{"id":35849275,"url":"https://github.com/cloudnativegame/fake-time-injector","last_synced_at":"2026-01-08T07:00:01.016Z","repository":{"id":167203389,"uuid":"630837179","full_name":"CloudNativeGame/fake-time-injector","owner":"CloudNativeGame","description":"A sidecar injector which change the time inside the container instead of the host.","archived":false,"fork":false,"pushed_at":"2025-06-06T09:35:33.000Z","size":920,"stargazers_count":42,"open_issues_count":2,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-06T10:36:06.854Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CloudNativeGame.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-21T09:06:23.000Z","updated_at":"2025-06-06T09:35:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"ce4d2cc1-7f82-4575-a498-d67d518bbcd8","html_url":"https://github.com/CloudNativeGame/fake-time-injector","commit_stats":null,"previous_names":["cloudnativegame/fake-time-injector"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/CloudNativeGame/fake-time-injector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNativeGame%2Ffake-time-injector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNativeGame%2Ffake-time-injector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNativeGame%2Ffake-time-injector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNativeGame%2Ffake-time-injector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CloudNativeGame","download_url":"https://codeload.github.com/CloudNativeGame/fake-time-injector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNativeGame%2Ffake-time-injector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28242433,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2026-01-08T02:00:06.591Z","response_time":241,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-08T07:00:00.050Z","updated_at":"2026-01-08T07:00:01.001Z","avatar_url":"https://github.com/CloudNativeGame.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fake-time-injector\n\n中文 | [English](./docs/en/README.md)\n\n## 概述\n\nfake-time-injector 是一个轻量级且灵活的工具。使用该工具，您可以轻松地将未来的虚假时间值注入到容器中，以便在不同的时间场景下模拟和测试应用程序的行为。\n\nfake-time-injector是阿里云与莉莉丝游戏通过CloudNativeGame社区一起开源的用于云原生场景下修改模拟时间的组件。\n\n![partners](images/partners.png)\n\n## 插件支持编程语言\n\n* Go\n* C\n* Erlang\n* C++\n* Ruby\n* PHP\n* JavaScript\n* Python\n* Java\n\n## 示例\n\n以下是使用 fake-time-injector 修改容器进程时间的示例。该工具使用 Kubernetes 中的 Webhook 机制实现请求解析更改。一旦在容器中部署了此组件，您就可以按照某些规则编写 YAML 文件来修改 pod 中特定容器的时间。基本原理是通过配置 WATCHMAKER 插件和 LIBFAKETIME 插件使此组件能够修改容器时间。\n\n### 步骤1: 部署fake-time-injector\n\n使用以下YAML文件，部署fake-time-injector：\n\n```yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: fake-time-injector-sa\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: fake-time-injector-cr\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"pods\"]\n    verbs: [\"get\", \"list\", \"patch\", \"update\", \"watch\"]\n  - apiGroups: [\"\"]\n    resources: [\"secrets\"]\n    verbs: [\"get\", \"list\"]\n  - apiGroups: [\"admissionregistration.k8s.io\"]\n    resources: [\"mutatingwebhookconfigurations\"]\n    verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\", \"delete\"]\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: fake-time-injector-rb\nsubjects:\n  - kind: ServiceAccount\n    name: fake-time-injector-sa\n    namespace: kube-system\nroleRef:\n  kind: ClusterRole\n  name: fake-time-injector-cr\n  apiGroup: rbac.authorization.k8s.io\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kubernetes-faketime-injector\n  namespace: kube-system\n  labels:\n    app: kubernetes-faketime-injector\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: kubernetes-faketime-injector\n  template:\n    metadata:\n      labels:\n        app: kubernetes-faketime-injector\n    spec:\n      containers:\n        - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/fake-time-injector:v5     #  使用 fake-time-injector/Dockerfile 构建镜像\n          imagePullPolicy: Always\n          name: kubernetes-faketime-injector\n          resources:\n            limits:\n              cpu: 100m\n              memory: 100Mi\n            requests:\n              cpu: 100m\n              memory: 100Mi\n          env:\n            - name: CLUSTER_MODE     # CLUSTER_MODE为true时，命名空间内的所有pod在一定时间范围内(40s)启动时获得一致的偏移量\n              value: \"true\"\n            - name: Namespace_Delay_Timeout     # 命名空间内的所有pod在一定时间范围内(120s)启动时获得一致的偏移量, 默认值为40s.\n              value: \"120\"\n            - name: LIBFAKETIME_PLUGIN_IMAGE\n              value: \"registry.cn-hangzhou.aliyuncs.com/acs/libfaketime:v1\"\n            - name: FAKETIME_PLUGIN_IMAGE\n              value: \"registry-cn-hangzhou.ack.aliyuncs.com/acs/fake-time-sidecar:v4.3\"   # 使用 fake-time-injector/plugins/faketime/build/Dockerfile 创建镜像\n      serviceAccountName:  fake-time-injector-sa\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: kubernetes-faketime-injector\n  namespace: kube-system\nspec:\n  ports:\n    - port: 443\n      targetPort: 443\n      name: webhook\n  selector:\n    app: kubernetes-faketime-injector\n```\n\n将这个YAML文件保存到一个名为deploy.yaml的文件中。然后使用下面的命令来部署它：\n\n```\nkubectl apply -f deploy.yaml \n```\n\n### step2: 修改时间\n\n我们提供两种修改进程时间的方法，watchmaker指令和libfaketime链接库。\n\nlibfaketime链接库配置方法，添加annotation：\n支持语言：python、c、ruby、php、c++、js、java、erlang\n* cloudnativegame.io/fake-time: 设置虚假的时间\n\nyaml配置示例:\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: test\n  namespace: kube-system\n  labels:\n    app: myapp\n    version: v1\n  annotations:\n    cloudnativegame.io/fake-time: \"2024-01-01 00:00:00\"  # 此处还可以配置'+3h40s'或者'-7h20m40s'，相对日期偏移可以是正数或者负数。  “m”、“h”、“d ”和 “y ”可用于指定以分钟、小时、天和年（365 天）为单位的偏移量。\nspec:\n  containers:\n    - name: test\n      image: registry.cn-hangzhou.aliyuncs.com/acs/testc:v1\n```\n\n如果你正在使用[Kruise-Game](https://github.com/openkruise/kruise-game)，通过如下配置即可修改游戏服的时间。\n```yaml\napiVersion: game.kruise.io/v1alpha1\nkind: GameServerSet\nmetadata:\n  name: minecraft\n  namespace: default\nspec:\n  replicas: 3\n  updateStrategy:\n    rollingUpdate:\n      podUpdatePolicy: InPlaceIfPossible\n  gameServerTemplate:\n    metadata:\n      annotations:\n        cloudnativegame.io/fake-time: \"2024-01-01 00:00:00\"\n    spec:\n      containers:\n        - image: registry.cn-hangzhou.aliyuncs.com/acs/minecraft-demo:1.12.2\n          name: minecraft\n```\n\nwatchmaker配置方法,增加如下annotation。\n支持语言：go、python、ruby、php、c++\n* cloudnativegame.io/process-name: 设置需要修改时间的进程\n* cloudnativegame.io/fake-time: 设置虚假的时间\n\nyaml配置示例:\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: testpod\n  namespace: kube-system\n  labels:\n    app: myapp\n    version: v1\n  annotations:\n    cloudnativegame.io/process-name: \"hello\"     # 如果需要同时修改多个进程用`,`隔开进程名即可\n    cloudnativegame.io/fake-time: \"2030-01-01 00:00:00\"     # 此处还可以配置调整的秒数，'86400'表示时间向后漂移一天，watchmaker不支持过去的时间。\nspec:\n  containers:\n    - name: myhello\n      image: registry.cn-hangzhou.aliyuncs.com/acs/hello:v1\n      env:\n        - name: Modify_Sub_Process        # Modify_Sub_Process为true时,同时修改子进程的时间。\n          value: \"true\"\n```\n\n将这个YAML文件保存到一个名为testpod.yaml的本地文件。然后，使用下面的命令来部署它：\n\n```yaml\nkubectl apply -f testpod.yaml\n```\n\n要进入myhello容器并测试时间是否被修改，使用以下命令：\n\n```\nkubectl exec -it testpod -c myhello /bin/bash -n kube-system\n```\n![example1](images/watchmakerexample.png)\n\n我们还提供了另一种方法修改容器的时间,你也可以让命令以虚拟时间内执行:\n\n![example2](images/libfaketimeexample.png)\n\n## 替代方案\n\n我们还推荐另一种修改时间的方法，即直接在Pod上添加一个sidecar容器。下面是你的操作方法：\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    name: hello\n  name: hello\nspec:\n  containers:\n    - image: 'registry.cn-hangzhou.aliyuncs.com/acs/hello:v1'\n      imagePullPolicy: IfNotPresent\n      name: myhello\n    - env:\n        - name: modify_process_name\n          value: hello               # 如果需要同时修改多个进程用`,`隔开进程名即可\n        - name: delay_second\n          value: '86400'\n      image: 'registry-cn-hangzhou.ack.aliyuncs.com/acs/fake-time-sidecar:v4.3'\n      imagePullPolicy: Always\n      name: fake-time-sidecar\n  shareProcessNamespace: true\n```\n\n在这种方法中，你需要为sidecar容器设置两个环境变量：modify_process_name 和 delay_second。这将允许你指定哪个进程需要修改时间，以及未来相距此刻的时间差。\n\n另外请注意，我们在`spec`中加入了 shareProcessNamespace，以确保两个容器共享相同的进程命名空间。\n\n## 依赖项\n\n此项目使用以下开源软件：\n\n* [Chaos-mesh](https://github.com/chaos-mesh/chaos-mesh) - 引用 chaos-mesh 的 watchmaker 组件来模拟进程时间\n* [Libfaketime](https://github.com/wolfcw/libfaketime) - 引用 libfaketime 动态链接库来模拟时间","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudnativegame%2Ffake-time-injector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudnativegame%2Ffake-time-injector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudnativegame%2Ffake-time-injector/lists"}