Kubernetes进阶之路(十)Service系列之LoadBalance

4 Service-LoadBalance

通常需要第三方云提供商支持,有约束性

Ingress

官网:https://kubernetes.io/docs/concepts/services-networking/ingress/

GitHub Ingress Nginx:https://github.com/kubernetes/ingress-nginx

Nginx Ingress Controller:<https://kubernetes.github.io/ingress-nginx/

An API object that manages external access to the services in a cluster, typically HTTP.

Ingress can provide load balancing, SSL termination and name-based virtual hosting.

Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.

    internet

        |

  [ Ingress ]

  --|-----|--

  [ Services ]

可以发现,Ingress就是帮助我们访问集群内的服务的。为了彰显其优势,我们在使用Ingress之前,先以一个简单案例出发。

4.1使用NodePort类型的service在K8S集群中部署tomcat

(也为了演示将service写在yaml文件中)

浏览器想要访问这个tomcat,也就是外部要访问该tomcat,用之前的Service-NodePort的方式是可以的,比如暴露一个端口,只需要访问 :即可。

01 创建yaml文件

vim my-tomcat.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: tomcat-deployment

  labels:

    app: tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: tomcat

  template:

    metadata:

      labels:

        app: tomcat

    spec:

      containers:

      - name: tomcat

        image: tomcat

        ports:

        - containerPort: 8080

---

apiVersion: v1

kind: Service

metadata:

  name: tomcat-service

spec:

  ports:

  - port: 80 

    protocol: TCP

    targetPort: 8080

  selector:

    app: tomcat

  type: NodePort 

02 创建service

`创建pod、service`

[root@henry001 network]# kubectl apply -f my-tomcat.yaml

deployment.apps/tomcat-deployment created

service/tomcat-service created

`查看service`

[root@henry001 network]# kubectl get svc

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)          AGE

kubernetes          ClusterIP  10.96.0.1        <none>        443/TCP          42h

tomcat-service      NodePort    10.106.112.183  <none>        80:30747/TCP    31s

whoami-deployment  NodePort    10.103.129.91    <none>        8000:31999/TCP  42m

`查看pod`

[root@henry001 network]# kubectl get pods

NAME                                READY  STATUS              RESTARTS  AGE

tomcat-deployment-6b9d6f8547-6mmh2  1/1    Running  0          69s

tomcat-deployment-6b9d6f8547-79nck  1/1    Running  0          69s

tomcat-deployment-6b9d6f8547-c8bps  1/1    Running  0          69s

`查看deployment`

[root@henry001 network]# kubectl get deploy

NAME                READY  UP-TO-DATE  AVAILABLE  AGE

nginx              1/1    1            1          24h

tomcat-deployment  3/3    3            3          97s

显然,Service-NodePort的方式生产环境不推荐使用,那接下来就基于上述需求,使用Ingress实现访问tomcat的需求。下面就开始讲解使用ingress插件来实现外网访问集群pod。

4.2 使用ingress实现

4.2.1架构图

说明:

本文中采用的ingress-controller是nginx-ingress-controller,具体详情可以参考官网:https://www.nginx.com/products/nginx/kubernetes-ingress-controller;

大家也可以根据自己需要采用不同的ingress-controller,可参考https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

4.2.2 实例

(1)以Deployment方式创建Pod,该Pod为Ingress Nginx Controller,要想让外界访问,可以通过Service的NodePort或者HostPort方式,这里选择HostPort,比如指定henry002机器上运行:

# 确保nginx-controller运行到henry002节点上

kubectl label node henry002 name=ingress 

`先下载mandatory.yaml文件,下载地址:https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml,并对mandatory.yaml并进行修改,如下:

# 使用HostPort方式运行,需要增加配置

hostNetwork: true  #使用hostport

      nodeSelector: 

        name: ingress  #指定节点

# 搜索nodeSelector,并且要确保henry002节点上的80和443端口没有被占用,镜像拉取需要较长的时间,这块要特别注意一下

#运行mandatory.yaml

kubectl apply -f mandatory.yaml 

#查看ingress-nginx命名空间下的资源

kubectl get all -n ingress-nginx

(2)查看henry002的80和443端口

lsof -i tcp:80

lsof -i tcp:443

(3)创建tomcat的pod和service

记得将之前的tomcat删除:kubectl delete -f my-tomcat.yaml

vim tomcat.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: tomcat-deployment

  labels:

    app: tomcat

spec:

  replicas: 3

  selector:

    matchLabels:

      app: tomcat

  template:

    metadata:

      labels:

        app: tomcat

    spec:

      containers:

      - name: tomcat

        image: tomcat

        ports:

        - containerPort: 8080

---

apiVersion: v1

kind: Service

metadata:

  name: tomcat-service

spec:

  ports:

  - port: 80 

    protocol: TCP

    targetPort: 8080

  selector:

    app: tomcat

`执行yaml文件`

[root@henry001 network]# kubectl apply -f tomcat-ingress.yaml

deployment.apps/tomcat-deployment created

service/tomcat-service created

`查看service`

[root@henry001 network]# kubectl get svc

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)          AGE

kubernetes          ClusterIP  10.96.0.1        <none>        443/TCP          43h

tomcat-service      ClusterIP  10.101.231.253  <none>        80/TCP          20s

whoami-deployment  NodePort    10.103.129.91    <none>        8000:31999/TCP  150m

`查看pod`

[root@henry001 network]# kubectl get pods

NAME                                READY  STATUS    RESTARTS  AGE

tomcat-deployment-6b9d6f8547-8wxgx  1/1    Running  0          42s

tomcat-deployment-6b9d6f8547-hrhrr  1/1    Running  0          42s

tomcat-deployment-6b9d6f8547-p7zhz  1/1    Running  0          42s

kubectl get svc

kubectl get pods

(4)创建Ingress以及定义转发规则

1>创建 nginx-ingress.yaml文件

vim  nginx-ingress.yaml

#ingress

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: nginx-ingress

spec:

  rules:

  - host: tomcat.henry.com

    http:

      paths:

      - path: /

        backend:

          serviceName: tomcat-service

          servicePort: 80

2>创建ingress并查看

`创建ingress`

[root@henry001 network]# kubectl apply -f nginx-ingress.yaml

ingress.extensions/nginx-ingress created

`查看ingress`

[root@henry001 network]# kubectl get ingress

NAME            HOSTS              ADDRESS  PORTS  AGE

nginx-ingress  tomcat.henry.com            80      47s

`查看ingress详细信息`

[root@henry001 network]# kubectl describe ingress nginx-ingress

Name:            nginx-ingress

Namespace:        default

Address:         

Default backend:  default-http-backend:80 (<none>)

Rules:

  Host              Path  Backends

  ----              ----  --------

  tomcat.henry.com 

                    /  tomcat-service:80 (192.168.217.22:8080,192.168.254.215:8080,192.168.254.216:8080)

Annotations:

  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"nginx-ingress","namespace":"default"},"spec":{"rules":[{"host":"tomcat.henry.com","http":{"paths":[{"backend":{"serviceName":"tomcat-service","servicePort":80},"path":"/"}]}}]}}

Events:

  Type    Reason  Age  From                      Message

  ----    ------  ----  ----                      -------

  Normal  CREATE  53s  nginx-ingress-controller  Ingress default/nginx-ingress

(5)修改win的hosts文件,添加dns解析

182.92.105.161 tomcat.henry.com

(6)打开浏览器,访问tomcat.henry.com

总结:如果以后想要使用Ingress网络,其实只要定义ingress,service和pod即可,前提是要保证nginx ingress controller已经配置好了。

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

推荐阅读更多精彩内容