前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你不可能搞不定腾讯云K8S的Service/Ingress

你不可能搞不定腾讯云K8S的Service/Ingress

原创
作者头像
李国宝
修改2019-09-02 12:43:24
2.5K1
修改2019-09-02 12:43:24
举报
文章被收录于专栏:编程技术向北,人生删除指南

你不可能搞不定腾讯云K8S的Service/Ingress

前言

上一个手把手教程上简单介绍过k8s中的Pod/Service,

里面提到过Service是K8S中的负载均衡, 同时也可以在不同Pod中使用Service name互相访问.

如果我们在外部(公网)访问K8S的服务怎么办呢?

首先, 你的有个公网IP.

然后....关掉这个教程.

回到正文.

在k8s中, ingress来负责对外提供访问, 一般域名配置, 域名证书都在这边.

是不是有点熟悉? 这不就是NGINX?

对的, 甚至ingress的实现就有一部分是NGINX.

但是, 大家都知道, 公网IP这种东西, 可是要收费的.

腾讯云的收费标准: 应用型负载均衡器(支持HTTP/HTTPS)0.02元/小时

有钱的同学直接用就好了,

教程见腾讯云集群管理, 点点点就好了.

穷人不配用公网? 不, 我们有自己的倔强!

想下, 我们在做k8s集群的时候, 用的主机不是本来就带公网IP吗?

虽然现在主机已经是k8s的worker节点了, 不过机器还是可以继续用的呀.

所以, 我们的方案是,

主机上装个NGINX, 由NGINX用端口转发的方式转到内部K8S Service中 ,

这样就完美了.

这样的话, 那么我们的主机怎么访问k8s Service呢?

在前面我们简单提过, k8s的pod,service都是在自己的内网的.

虽然现在主机和k8s的服务可能都在一个主机上, 然而里面还是有逻辑层内网隔离的.

那么, 这样怎么办呢?

放心, k8s service早就有解决方案啦.

答案是:

在腾讯云中的使用service.kubernetes.io/qcloud-loadbalancer-internal-subnetid annotations来申请内网IP.

代码语言:txt
复制
---

apiVersion: v1
kind: Service
metadata:
  # 这个annotations是腾讯云申请内网IP的配置, 需要改成自己k8s所在网络的子网id
  # postgresql 这里其实可以不要内网service ip, 内网直接用service name访问即可
  annotations:
    service.kubernetes.io/loadbalance-id: lb-你自己的loadbalanceid
    service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-你自己的子网id
  name: codelover-blog
  namespace: default
spec:
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32278
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: codelover-blog
  sessionAffinity: None
  type: LoadBalancer

查看一下配置的效果

代码语言:txt
复制
➜  codelover-blog git:(master) ✗ kc get service                  
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
codelover-blog   LoadBalancer   172.16.255.232   172.17.0.28   80:32278/TCP                 55d


root@VM-0-13-ubuntu:~# curl -vvvv 172.17.0.28
* Rebuilt URL to: 172.17.0.28/
*   Trying 172.17.0.28...
* Connected to 172.17.0.28 (172.17.0.28) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.17.0.28
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.17.1
< Date: Sun, 01 Sep 2019 05:30:51 GMT
< Content-Type: text/html
< Content-Length: 45988
< Last-Modified: Mon, 08 Jul 2019 03:59:21 GMT
< Connection: keep-alive
< ETag: "5d22bf99-b3a4"
< Accept-Ranges: bytes
<
<!DOCTYPE html>

现在内网IP有了, 下面也就是配置一下NGINX的事情了.

代码语言:txt
复制
    server {
            listen 80;
            server_name  你的域名;
            location / {
                proxy_pass   http://172.17.0.28:80;
            }

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	          gzip on;
            gzip_min_length 5k;
            gzip_buffers 4 16k;
            gzip_http_version 1.1;
            gzip_comp_level 3;
            gzip_types text/plain application/json application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
            gzip_vary on;
    }

好了, 完事.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 你不可能搞不定腾讯云K8S的Service/Ingress
    • 前言
      • 穷人不配用公网? 不, 我们有自己的倔强!
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档