如何使用 OrbStack 快速给本地 Kubernetes 集群的应用加上域名和 HTTPS 证书

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

293c87c6e6cfacf4307714e8e509144a.jpeg

在 《云原生小技巧 #3:在本地 K8s 中轻松部署自签 TLS 证书》 中,我向大家展示了如何使用 Dnsmasq[1] 来搞定本地 DNS 的问题。那是一种相对传统的做法,简单易行。但是,对于我们这些追求效率的开发者来说,能够即插即用显然更加令人兴奋。

今天,我要介绍的这个新伙伴: 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

下面是我本地容器运行的情况

43fa588e07470c49df332aecb0db70fd.png

在以往,我需要通过 localhost + port 的方式来访问这个容器。

a2378cc8ff89a7a39445dbd8743b4b43.png

现在呢?只需通过 OrbStack 分配的域名,我就可以畅通无阻地访问它,而且不需要指定端口,非常的丝滑。

83bca647119cf6c2a24fdcde5a32813b.png
mDNS

通过一系列的命令和检查,我们可以看到 getting-started.orb.local 这个域名确实被解析到了容器的 IP 地址:192.168.215.3

➜ ping getting-started.orb.local
PING getting-started.orb.local (192.168.215.3): 56 data bytes
64 bytes from 192.168.215.3: icmp_seq=0 ttl=63 time=1.714 ms
64 bytes from 192.168.215.3: icmp_seq=1 ttl=63 time=0.472 ms
64 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 --dns
DNS configuration

resolver #1
  ...

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  reach    : 0x00000000 (Not Reachable)
  order    : 300000

resolver #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.local
DATE: ---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.local
DATE: ---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 连接调整成这个样子。

23517fcef0ac7bc3a24cda77eea3d8f0.png
自定义域名

OrbStack 允许用户自定义容器的域名,在启动容器时通过标签的方式方便的注入。

docker run --rm -l dev.orbstack.domains=foobar.local docker/getting-started

正如上面提到的 OrbStack 是通过 mDNS 来实现域名到 IP 的解析,所以它只对 .local 这个 TLD 有效,在做自定义域名的时候需要注意下。

f5c5e0a9c5ce743debe0171dfc2b0d91.png
Domain names

通过访问 http://orb.local 我们可以看到所有正在运行的容器链接。

897ebdfede21c4e506cf3dd9caf27b22.png

甚至可以在它的客户端上查看容器列表,单击信息图标获取。

6ce0280505ef30e63f2f6f960a82ce64.png

OrbStack + Kind

接下来,我们利用 Local domain names 的能力,重新部署下自签 TLS 证书的流程,看下和上次的分享有什么区别?

1. 获取集群的域名

通过 UI,获取到 Kind 集群的域名:local-control-plane.orb.local

19832bf507153544eb6222df0920a5f7.png
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 Deployment
kubectl create deployment nginx-deployment --image=nginx:1.25.3
# 暴露 Deployment 作为一个 Service
kubectl expose deployment nginx-deployment --port=80

最后,我们在 K8s Ingress 资源中引用了这个 TLS Secret,以启用 HTTPS,对应的域名为:nginx.local-control-plane.orb.local

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
spec:
  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: 80
EOF

完成这些步骤后,我们就可以愉快地验证一下了,中间我们不需要对 DNS 做任何的配置。🎉

c3c4f9f182777ec35b3780c3c626087e.png

HTTPS for containers

💡 小贴士:OrbStack 在其即将到来的稳定版中将默认启用 HTTPS 支持,这意味着我们将不再需要手动创建、安装或信任自签名证书,为本地开发者带来前所未有的便捷。

a65041dd62641d4601c707301b4abf00.png

对于那些迫不及待想要体验最新功能的小伙伴们,可以通过以下步骤来抢先体验:进入设置,选择更新通道为 Canary(faster),然后在 OrbStack 菜单中选择检查更新。

调整更新通道

23ec053547e59eb2a896188b6daf3a2f.png

检查更新

952af9708b16dece761e7359510e7913.png

升级完后,容器里已有的服务就可以直接通过 https://getting-started.orb.local/ 访问了。

4288e13968255ee652cd0ada569cb35e.png

OrbStack 的原生 K8s 支持

事实上 OrbStack 提供了一个轻量级的单节点 K8s 集群,它对于开发环境来说是优化的。

ffedf2e559a14eb413a0c5ee45fe7d79.png

在本地开发,如果没有 multi-node clusters 需求的话,我们可以不用 Kind 自建集群,直接用它就好。

除了以上提到的域名能力之外,我们还可以通过 Pod 的 IP 又或者 Service 的 IP 直接访问,这对于我们平时开发或者测试来说非常的方便,不需要再做 port-forward 了。

大家可以直接看 Using Kubernetes[5],这里不再赘述。

254c13838c8da6732a62f8af9f578c1b.gif

写在后面

从传统的 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/

本文转载自:「Cloud Native 101」,原文:https://url.hi-linux.com/a98zT,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

4e8167be021d23864a452040e60eb911.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

a104e59f3f8e8f993888b52551eca415.png

你可能还喜欢

点击下方图片即可阅读

97c0fa95bb0e990c35c39f3217e25d17.png

如何通过 Nginx Ingress 快速解决 gRPC 长连接负载不均衡问题

3a8f0f27e05f7fc67bc0c79de711e02d.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

6762e0ad399c57373007423ced68bbd2.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用fabric8io/kubernetes-client连接Kubernetes集群并使用证书的方式,你需要按照以下步骤进行操作: 1. 添加依赖:在你的项目中添加fabric8io/kubernetes-client的依赖,你可以在pom.xml文件中添加以下代码: ```xml <dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>5.3.1</version> </dependency> ``` 2. 创建Config对象:在创建KubernetesClient对象之前,需要先创建Config对象,并设置相应的认证信息,以下是一个示例代码: ```java Config config = new ConfigBuilder() .withMasterUrl("https://kubernetes.default.svc.cluster.local") .withTrustCerts(true) .withNamespace("default") .withClientCertData(Base64.getEncoder().encodeToString(clientCert)) .withClientKeyData(Base64.getEncoder().encodeToString(clientKey)) .withCaCertData(Base64.getEncoder().encodeToString(caCert)) .build(); ``` 其中,`withMasterUrl`表示Kubernetes API Server的地址,`withTrustCerts`表示是否信任证书,`withNamespace`表示需要操作的Namespace,`withClientCertData`、`withClientKeyData`、`withCaCertData`分别表示客户端证书、客户端私钥和CA证书的Base64编码字符串,这些信息可以从Kubernetes集群的证书文件中获取。 3. 创建KubernetesClient对象:通过以下代码创建一个KubernetesClient对象,这个对象将作为连接Kubernetes集群的入口: ```java KubernetesClient client = new DefaultKubernetesClient(config); ``` 4. 使用KubernetesClient对象进行操作:使用KubernetesClient对象可以进行各种操作,例如获取pod列表、创建deployment等,以下是一个获取pod列表的示例代码: ```java PodList podList = client.pods().list(); ``` 以上就是使用fabric8io/kubernetes-client连接Kubernetes集群并使用证书的方式的基本步骤,你可以根据需要进行扩展和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值