今天,我要介绍的这个新伙伴:OrbStack[2],它的 Slogan 是:Say goodbye to slow, clunky containers and VMs。不过,说实话,我最喜欢的还是它的Local domain names的能力,因为它是零配置的。
Container domain names
OrbStack对待容器的态度可谓是亲(强)密(大)无间,它为每个容器赋予了一个独一无二的域名。
举个例子,假设我在本地启动了一个名为getting-started的容器,并将容器内的80端口映射到了本地的3000端口
docker run -d -p 3000:80 --name getting-started docker/getting-started
下面是我本地容器运行的情况
图片
在以往,我需要通过localhost + port的方式来访问这个容器。
图片
现在呢?只需通过OrbStack分配的域名,我就可以畅通无阻地访问它,而且不需要指定端口,非常的丝滑。
图片
mDNS
通过一系列的命令和检查,我们可以看到getting-started.orb.local这个域名确实被解析到了容器的 IP 地址:192.168.215.3。
ping getting-started.orb.localPING getting-started.orb.local (192.168.215.3): 56 data bytes64 bytes from 192.168.215.3: icmp_seq=0 ttl=63 time=1.714 ms64 bytes from 192.168.215.3: icmp_seq=1 ttl=63 time=0.472 ms64 bytes from 192.168.215.3: icmp_seq=2 ttl=63 time=1.204 ms docker inspect getting-started \ -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'192.168.215.3
我本机的/etc/hosts文件内容也没发生过变化,那么它是怎么做到的呢?我们先来看下系统的 DNS 配置信息。
scutil --dnsDNS configurationresolver #1 ...resolver #2 domain : local options : mdns timeout : 5 flags : Request A records reach : 0x00000000 (Not Reachable) order : 300000resolver #3 ...
在scutil –dns命令的输出中,resolver #2部分的options字段包含mdns,这表示该解析器配置用于处理.local域名的多播 DNS 查询。
mDNS 即多播 DNS(Multicast DNS[3])它是一种在本地网络上无需传统 DNS 服务器即可解析主机名的协议。这是 Bonjour(Apple 的实现)用来在本地网络上发现服务和主机名的一种机制。
# 获取本地 getting-started.orb.local 域名的地址 dns-sd -G v4v6 getting-started.orb.localDATE: ---Sat 04 Nov 2023--- 9:52:21.350 ...STARTING...Timestamp A/R Flags IF Hostname Address TTL 9:52:21.351 Add 40000003 18 getting-started.orb.local. FD07:B51A:CC66:0000:A617:DB5E:C0A8:D703%<0> 300 9:52:21.352 Add 40000002 18 getting-started.orb.local. 192.168.215.3 300# 再查看特定主机的解析信息 dns-sd -Q getting-started.orb.localDATE: ---Sat 04 Nov 2023--- 9:55:31.664 ...STARTING...Timestamp A/R Flags IF Name Type Class Rdata 9:55:31.668 Add 40000002 18 getting-started.orb.local. Addr IN 192.168.215.3
Cool…有了这个能力就非常赞了,我可以轻松地将我的本地 Mysql 连接调整成这个样子。
图片
自定义域名
OrbStack允许用户自定义容器的域名,在启动容器时通过标签的方式方便的注入。
docker run --rm -l dev.orbstack.domains=foobar.local docker/getting-started
正如上面提到的 OrbStack 是通过 mDNS 来实现域名到 IP 的解析,所以它只对.local这个 TLD 有效,在做自定义域名的时候需要注意下。
图片
Domain names
通过访问http://orb.local我们可以看到所有正在运行的容器链接。
图片
甚至可以在它的客户端上查看容器列表,单击信息图标获取。
图片
OrbStack + Kind
接下来,我们利用Local domain names的能力,重新部署下自签 TLS 证书的流程,看下和上次的分享有什么区别?
1. 获取集群的域名
通过 UI,获取到 Kind 集群的域名:local-control-plane.orb.local
图片
2. 创建 K8s TLS Secret
然后,我们利用mkcert[4]创建了一个通配符证书
mkcert '*.local-control-plane.orb.local'Created a new certificate valid for the following names - "*.local-control-plane.orb.local"Reminder: X.509 wildcards only go one level deep, so this won't match a.b.local-control-plane.orb.local ℹ️The certificate is at "./_wildcard.local-control-plane.orb.local.pem" and the key at "./_wildcard.local-control-plane.orb.local-key.pem" It will expire on 4 February 2026
并将其作为 K8s TLS Secret 添加到我们的集群中。
kubectl create secret tls tls-secret \ --key=_wildcard.local-control-plane.orb.local-key.pem \ --cert=_wildcard.local-control-plane.orb.local.pem
3. 配置 K8s Ingress 使用 TLS Secret
# 创建一个 Nginx Deploymentkubectl create deployment nginx-deployment --image=nginx:1.25.3# 暴露 Deployment 作为一个 Servicekubectl expose deployment nginx-deployment --port=80
最后,我们在 K8s Ingress 资源中引用了这个 TLS Secret,以启用 HTTPS,对应的域名为:nginx.local-control-plane.orb.local。
kubectl apply -f - <<EOFapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: nginxspec: tls: # 以下 4 行是为了支持 TLS - hosts: # - nginx.local-control-plane.orb.local # secretName: tls-secret # rules: - host: nginx.local-control-plane.orb.local http: paths: - path: / pathType: Prefix backend: service: name: nginx-deployment port: number: 80EOF
完成这些步骤后,我们就可以愉快地验证一下了,中间我们不需要对 DNS 做任何的配置。
图片
HTTPS for containers
小贴士:OrbStack在其即将到来的稳定版中将默认启用 HTTPS 支持,这意味着我们将不再需要手动创建、安装或信任自签名证书,为本地开发者带来前所未有的便捷。
图片
对于那些迫不及待想要体验最新功能的小伙伴们,可以通过以下步骤来抢先体验:进入设置,选择更新通道为Canary(faster),然后在 OrbStack 菜单中选择检查更新。
调整更新通道
检查更新
升级完后,容器里已有的服务就可以直接通过https://getting-started.orb.local/访问了。
图片
OrbStack 的原生 K8s 支持
事实上 OrbStack 提供了一个轻量级的单节点 K8s 集群,它对于开发环境来说是优化的。
图片
在本地开发,如果没有multi-node clusters需求的话,我们可以不用 Kind 自建集群,直接用它就好。
除了以上提到的域名能力之外,我们还可以通过Pod 的 IP又或者Service 的 IP直接访问,这对于我们平时开发或者测试来说非常的方便,不需要再做port-forward了。
大家可以直接看Using Kubernetes[5],这里不再赘述。
写在后面
从传统的 DNS 解决方案,到现代的OrbStack,我们见证了本地开发环境的巨大变革。通过OrbStack,我们不仅提升了工作效率,还享受到了前所未有的便捷。无论是容器的即时访问,还是 Kind 集群的无缝连接,OrbStack都展现了其强大的能力。
在云原生的世界里,每一次技术的进步都是为了让开发者的生活变得更加简单。而今天,我们又向这个目标迈进了一大步。我希望你们能够尝试OrbStack,并且享受它带来的便利。
在下一篇文章中,我将探索更多云原生技术的奥秘。敬请期待,我们下次见!
参考资料
[1]Dnsmasq:https://en.wikipedia.org/wiki/Dnsmasq
[2]OrbStack:https://orbstack.dev/
[3]Multicast DNS:https://en.wikipedia.org/wiki/Multicast_DNS
[4]mkcert:https://github.com/FiloSottile/mkcert
[5]Using Kubernetes:https://docs.orbstack.dev/kubernetes/