在 TKE 上配置不使用 LB 的 Nginx Ingress Controller

背景 想要在 k8s 里面 host 一个网站,但又不想额外花钱用 LB,想直接用节点的 IP。 方法 首先安装 nginx-ingress: $ helm repo add nginx-stable https://helm.nginx.com/stable $ helm repo update $ helm install ingress-controller nginx-stable/nginx-ingress --set controller.service.type=NodePort --set controller.hostNetwork=true 这里给 ingress controller chart 传了两个参数:第一个指定 service 类型是 NodePort,替代默认的 LoadBalancer;第二个指定 ingress controller 直接在节点上监听,这样就可以用节点的公网 IP 访问了。 然后配一个 ingress: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-example annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: example.com http: paths: - path: / backend: serviceName: example-service servicePort: 80 然后就可以发现请求被正确路由到 example-service 的 80 端口了。

Read More

在 sbt 中 fork 并且并行运行测试

问题 最近在 sbt 使用遇到一个问题,有两个测试,分别用 testOnly 测试的时候没有问题,如果同时测试就会出问题,应该是全局的状态上出现了冲突。一个自然的解决思路是 fork,但是 sbt 默认 fork 之后 test 是顺序执行的,这会很慢。所以搜索了一下,找到了 fork 并且并行测试的方法。 解决方法 解决方法在 sbt 文档中其实就有(原文)。简单来说就是:把每个 test 放到单独的 TestGroup 中,每个 TestGroup 分别用一个 forked JVM 去运行;然后让 sbt 的并行限制设高一些: // move each test into a group and fork them to avoid race condition import Tests._ def singleTests(tests: Seq[TestDefinition]) = tests map { test => new Group( name = test.name, tests = Seq(test), SubProcess(ForkOptions())) } Test / testGrouping := singleTests( (Test / definedTests).

Read More

在命令行中进行 Vivado 仿真

想要在命令行里进行 Vivado 仿真,所以查了下 Xilinx 的 UG900 文档,找到了命令行仿真的方法。首先是生成仿真所需的文件: # assuming batch mode open_project xxx.xpr set_property top YOUR_SIM_TOP [current_fileset -simset] export_ip_user_files -no_script -force export_simulation -simulator xsim -force 可以把这些语句放到 tcl 文件里然后用 batch mode 执行。执行成功以后,会在 export_sim/xsim 目录下生成一些文件。里面会有生成的脚本以供仿真: cd export_sim/xsim && ./YOUR_SIM_TOP.sh 默认情况下它会执行 export_sim/xsim/cmd.tcl 里面的命令。如果想要记录 vcd 文件,修改内容为: open_vcd log_vcd run 20us close_vcd quit 这样就可以把仿真的波形输出到 dump.vcd 文件,拖到本地然后用 GTKWave 看。更多支持的命令可以到 UG900 里找。

Read More

在 Rocket Chip 上挂接 TLRAM

最近遇到一个需求,需要在 Rocket Chip 里面开辟一块空间,通过 verilog 的 $readmemh 来进行初始化而不是用 BootROM,这样每次修改内容不需要重新跑一次 Chisel -> Verilog 的流程。然后到处研究了一下,找到了解决的方案: 首先是新建一个 TLRAM 然后挂接到 cbus 上: import freechips.rocketchip.tilelink.TLRAM import freechips.rocketchip.tilelink.TLFragmenter import freechips.rocketchip.diplomacy.LazyModule import freechips.rocketchip.diplomacy.AddressSet trait HasTestRAM { this: BaseSubsystem => val testRAM = LazyModule( new TLRAM(AddressSet(0x40000000, 0x1FFF), beatBytes = cbus.beatBytes) ) testRAM.node := cbus.coupleTo("bootrom") { TLFragmenter(cbus) := _ } } 这里的地址和大小都可以自由定义。然后添加到自己的 Top Module 中: class TestTop(implicit p:Parameters) extends RocketSystem // ... with HasTestRAM //... { override lazy ... } 实际上这时候 TLRAM 就已经加入到了 TileLink 总线中。接着,为了让 firrtl 生成 $readmemh 的代码,需要两个步骤:

Read More

体验 Tencent Kubernetes Engine

之前在机器上试验了一下 kubernetes,感觉挺不错的,所以就想把腾讯云上面的机器也交给 kubernetes 管理。找到容器服务,新建集群,选择模板里的标准托管集群就可以了。然后开启下面的公网访问,设置一个比较小的 IP 地址段,按照页面下面的要求合并一下 kube config(因为还有别的 k8s cluster): $ KUBECONFIG=~/.kube/config:/path/to/new/config kubectl config view --merge --flatten > new_config $ cp new_config ~/.kube/config 覆盖之前先确认原来的配置还在,然后就可以用 kubectl 切换到新的 context: $ kubectl config get-contexts $ kubectl config use-context new-context-here $ kubectl get node NAME STATUS ROLES AGE VERSION 172.21.0.17 Ready <none> 75m v1.16.3-tke.3 可以看到我们的 k8s node 已经上线了。我一般习惯先配好 kubernetes-dashboard: $ kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.6/install/kubernetes/quick-install.yaml $ kubectl proxy & $ kubectl -n kubernetes-dashboard describe secret (kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print \$1}') | tail -n1 | awk '{print \$2}' | pbcopy 然后在浏览器里访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/overview?

Read More

在 Kubernetes 集群上部署 gitlab—runner

按照 GitLab 上的教程试着把 gitlab-runner 部署到 k8s 集群上,发现异常地简单,所以简单做个笔记: 编辑 values.yaml gitlabUrl: GITLAB_URL runnerRegistrationToken: "REDACTED" rbac: create: true 此处的信息按照 “Set up a specific Runner manually” 下面的提示填写。然后用 Helm 进行安装: $ helm repo add gitlab https://charts.gitlab.io $ kubectl create namespace gitlab-runner $ helm install --namespace gitlab-runner gitlab-runner -f values.yaml gitlab/gitlab-runner 然后去 Kubernetes Dashboard 就可以看到部署的情况,回到 GitLab 也可以看到出现了“Runners activated for this project” ,表示配置成功。 参考配置:https://docs.gitlab.com/runner/install/kubernetes.html

Read More

用 Kubernetes 部署无状态服务

背景 最近需要部署一个用来跑编译的服务,服务从 MQ 取任务,编译完以后提交任务。最初的做法是包装成 docker,然后用 docker-compose 来 scale up。但既然有 k8s 这么好的工具,就试着学习了一下,踩了很多坑,总结了一些需要用到的命令。 搭建 Docker Registry 首先搭建一个本地的 Docker Repository,首先设置密码: $ mkdir auth $ htpasswd user pass > auth/passwd 然后运行 registry: $ docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v "$(pwd)/registry":/var/lib/registry \ -v "$(pwd)/auth":/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry:2 简单起见没有配 tls。然后吧本地的 image push 上去: $ docker tag $image localhost:5000/$image $ docker push localhost:5000/$image 这样就可以了。

Read More

用 jailkit 限制用户仅 scp

最近需要用 scp 部署到生产机器,但又不想出现安全问题,所以用了 jailkit 的方法。首先是创建单独的用户,然后生成 ssh key 来认证,不再赘述。此时是可以 scp 了,但用户依然可以获得 shell,不够安全。 然后找到了下面参考链接,大概摘录一下所需要的命令和配置: mkdir /path/to/jail chown root:root /path/to/jail chmod 701 /path/to/jail jk_init -j /path/to/jail scp sftp jk_lsh jk_jailuser -m -j /path/to/jail jailed_user vim /path/to/jail/etc/jailkit/jk_lsh.ini # Add following lines [jailed_user] paths = /usr/bin, /usr/lib exectuables = /usr/bin/scp 之后可以发现该用户的 shell 已经更改 jk_chrootsh,并且只能用 scp。 参考:https://blog.tinned-software.net/restrict-linux-user-to-scp-to-his-home-directory/

Read More

每周分享第 56 期

咕咕咕 SystemVerilog linter https://github.com/dalance/svlint 东北方言编程语言 https://github.com/zhanyong-wan/dongbei JS LaTeX 渲染到 HTML https://github.com/michael-brade/LaTeX.js 一种对语音助手的攻击 https://surfingattack.github.io/ 在线打铃网站 http://thulpwan.net/timer/ 网络学堂 PC 端 App https://github.com/jiegec/learn_tsinghua_app/releases Rust 2020 roadmap https://github.com/rust-lang/rfcs/pull/2857/files

Read More