基于k8s的内网穿透与服务共存

背景

由于国内的vps要搭建网站都需要备案,所以目前自己的一些服务是在香港的一台vps上;同时自己家里部署了一些服务比如nas需要在外部访问,当前是用另一台vps做的内网穿透,本着能省一点是一点的原则,遂想着将这两个能力放到一台vps上。

核心问题

由于不想每次访问时还需要输入端口号,最理想的方案肯定是都是用80/443端口来访问,但这样内网穿透的端口就会和ingress的端口冲突;
理想的方案是内网穿透的服务不直接占用主机端口,而是通过域名区分,需要穿透的域名转发到内网穿透服务。

解决方案

搭建步骤

vps端部署

搭建k8s集群

由于vps上资源并不富裕,所以这里我使用的是k3s,执行curl -sfL https://get.k3s.io | sh - --disable traefik,注意我后面使用了ingress nginx所以增加了--disable traefik参数禁止默认使用traefik,理论上traefik也行,但是后面ingress的配置可能会有点不同。

部署ingress nginx

# 添加官方 Nginx Ingress helm repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# 使用 Helm 安装 Nginx Ingress
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace kube-system

部署frps

其他没啥特别的,只有service中注意frps的连接端口需要使用NodePort

apiVersion: v1
kind: Service
metadata:
  labels:
    app: frps-svc
  name: frps-svc
  namespace: frps
spec:
  ports:
    - name: server
      port: 10000
      protocol: TCP
      targetPort: 10000
      nodePort: 34567
  selector:
    app: frps-server
  type: NodePort

部署cert manager

由于需要在k8s侧就要做域名的区分,所以需要将tls证书放到k8s侧,同时使用cert manager能够自动进行证书的renew,简化后续维护

helm repo add jetstack https://charts.jetstack.io --force-update
helm repo update

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.14.2 \
  --set installCRDs=true

创建letsencrypt issuer

issuer有ClusterIssuer和Issuer两种,ClusterIssuer是全集群生效,一种只在对应的namespace生效,相应的ingress需要创建在这个namespace。这里我们使用Issuer,因为我们后续需要生成泛域名证书,如果使用ClusterIssuer其中有一步报错一直没查到原因(可能是不支持)。泛域名证书的solver只能使用dns01,关于这里的配置可以参考这里,这里我是用的是Cloudflare

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-dns
  namespace: frps
spec:
  acme:
    email: example@youmail.com
    privateKeySecretRef:
      name: letsencrypt-dns
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - dns01:
          cloudflare:
            apiTokenSecretRef:
              key: api-token
              name: cloudflare-api-token-secret

创建内网穿透的service

后续请求经过ingress后通过这个service转发到内网穿透服务

apiVersion: v1
kind: Service
metadata:
  labels:
    app: frps-http
  name: frps-http
  namespace: frps
spec:
  ports:
    - name: server-http
      port: 38080
      protocol: TCP
      targetPort: 38080
  selector:
    app: frps-server
  type: ClusterIP

创建ingress

注意这里创建的是泛域名的ingress,这样后续要增加服务,在vps侧是不需要增加任何配置的

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wildcard-ingress
  namespace: frps
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - "*.yourdomain.com"
      secretName: my-tls
  rules:
    - host: "*.yourdomain.com"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frps-http
                port:
                  number: 38080

到这里,在vps上的配置就ok了

内网服务搭建

由于家里的服务不止一个,如果经过内网穿透直接映射到服务的endpoint,则frpc的配置就会变得比较复杂,vps侧的service也需要配置多个端口,所以我在内网再部署了一层nginx,再通过nginx转发到各个服务上,这样内网穿透就只需要配置一个80端口即可。nginx的具体配置这里就不列出来了,需要注意的是只需要配置listen 80端口即可,server name需要和vps侧配置相同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容