这是容器云平台第四篇,接上一篇继续,

首先kubernetes服务暴露有如下几种方式:

  • NodePort
  • Loadbalance
  • ClusterIP
  • Ingress

本文紧贴第一篇架构图,只介绍Ingress,其余的后续再详细说。。

Ingress是什么?

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP,当然TCP也是可以管理滴。

Ingress 可以提供负载均衡、SSL 终结和基于域名的虚拟托管。

大白话就是:把kubernetes集群生部署的服务暴露出来,让集群外部的用户或者服务能访问到。

能为kubernetes提供ingress的控制器很多,本文就用基于HAProxy的控制器:Haproxy Ingreess。

HAProxy是一个快速可靠的TCP和HTTP反向代理和负载均衡器。

当然,一个kubernetes集群也可以同时部署多种ingress控制器。

HAProxy Ingress

HAProxy Ingress 通过监控Kubernetes API,获取services后端的pod状态,动态更新haproxy的配置文件,以实现负载均衡。

它允许每个代理每秒有数千个请求,不管集群的大小,具有非常低的延迟。

简单做个介绍,接下来开始实战。

部署HAProxy Ingress到kubernetes集群

  1. 下载yaml部署文件:wget https://haproxy-ingress.github.io/resources/haproxy-ingress.yaml
  2. 修改haproxy-ingress.yaml,因为现在使用的是1.19版本,有的api版本已经过期,需要修改下

    rbac.authorization.k8s.io/v1beta1 改为rbac.authorization.k8s.io/v1,如果不修改会有Warning,但是目前不影响
  3. 部署:kubectl apply -f haproxy-ingress.yaml
    [root@k8s-master001 opt]# kubectl  apply -f haproxy-ingress.yaml
    namespace/ingress-controller created
    serviceaccount/ingress-controller created
    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
    clusterrole.rbac.authorization.k8s.io/ingress-controller created
    Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role
    role.rbac.authorization.k8s.io/ingress-controller created
    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
    clusterrolebinding.rbac.authorization.k8s.io/ingress-controller created
    Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding
    rolebinding.rbac.authorization.k8s.io/ingress-controller created
    configmap/haproxy-ingress created
    daemonset.apps/haproxy-ingress created
  4. 查看部署状态
    [root@k8s-master001 opt]# kubectl  get all -n ingress-controller
    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
    daemonset.apps/haproxy-ingress 0 0 0 0 0 role=ingress-controller 6m2s

什么鬼,为什么没有haproxy相关的pod呢?

  1. 现在再来看下 haproxy-ingress.yaml 这个文件,发现其中定义了nodeSelector节点标签选择器,但是现在集群节点没有任何机器有这个标签,因此需要给node设置合理的标签,要不然不会创建pod

    现在手动给master003添加一个标签role=ingress-controller
    [root@k8s-master001 opt]#  kubectl label node k8s-master003 role=ingress-controller
    node/k8s-master003 labeled
  2. 再来查看下,已经有haproxy-ingress-6mfqr,状态为Running,表示已经部署好了,是不是so easy~~~
    [root@k8s-master001 opt]# kubectl  get all -n ingress-controlle
    NAME READY STATUS RESTARTS AGE
    pod/haproxy-ingress-6mfqr 1/1 Running 1 2m40s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
    daemonset.apps/haproxy-ingress 1 1 1 1 1 role=ingress-controller 18m

使用Ingress暴露服务

这里使用上一篇部署的nginx作为示例,部署上篇,现在查看下nginx状态

[root@k8s-master001 ~]# kubectl  get po,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-0 1/1 Running 0 32h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d2h
service/nginx NodePort 10.106.27.213 <none> 80:30774/TCP 32h

可以看到有一个名为nginx的service

[root@k8s-master001 ~]# cat ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
annotations:
kubernetes.io/ingress.class: haproxy
spec:
rules:
- host: nginx.ieasou.cn
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80

执行部署,会有个Warning,因为kubernetes apiVersion更新,以后会不在支持extensions/v1beta1,这里不影响,先忽略。

[root@k8s-master001 ~]# kubectl  apply -f ingress.yaml
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions/nginx configured

查看部署结果

[root@k8s-master001 ~]# kubectl  get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx <none> nginx.test.cn 80 21m

现在,需要自己把nginx.test.cn解析到haproxy-ingresss所在节点的IP,本文haproxy-ingresss部署到了master003(10.26.25.22)

测试的话,直接修改/etc/hosts文件,然后可以访问nginx.test.cn

[root@k8s-master001 ~]# curl -I nginx.text.cn
HTTP/1.1 200 OK
server: nginx/1.19.2
date: Sat, 12 Sep 2020 12:40:01 GMT
content-type: text/html
content-length: 612
last-modified: Tue, 11 Aug 2020 14:50:35 GMT
etag: "5f32b03b-264"
accept-ranges: bytes
strict-transport-security: max-age=15768000

从结果可以看到,返回状态码,说明可以访问到部署的nginx服务了。

Tips: 更多好文章,请关注首发微信公众号“菜鸟运维杂谈”!!!

容器云平台No.4~kubernetes 服务暴露之Ingress的更多相关文章

  1. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  2. 容器云平台No.8~kubernetes负载均衡之ingress-nginx

    Ingress 是什么? Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由. 流量路由由 Ingress 资源上定义的规则控制. 可以将 Ingress 配置为服务提供外 ...

  3. 容器云平台No.7~kubernetes监控系统prometheus-operator

    简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...

  4. 容器云平台No.3~kubernetes使用

    今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...

  5. Kubernetes容器云平台建设实践

    [51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...

  6. 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  7. 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)

    [编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...

  8. 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

    开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...

  9. 微服务与K8S容器云平台架构

    微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...

随机推荐

  1. N叉树的前后序遍历和最大深度

    package NTree; import java.util.ArrayList; import java.util.List; /** * N叉树的前后序遍历和最大深度 */ public cla ...

  2. 运行SQL文件报错:Got a packet bigger than 'max_allowed_packet' bytes With statement:

    英文意思:需要使用一个和现在相比较大的空间,可能mysql中的默认空间比文件需要的空间要小 解决方法: 1.修改配置文件中mysql的默认空间大小:在MYSQL的配置文件          my.in ...

  3. ReplayingDecoder 解码器:别以为我有多厉害,也只不过是使用了一下装饰器模式而已~

    原文地址 一.设计模式为啥老是用不好? 想要写出更屌的代码,提高代码的健壮性和可扩展性,那么设计模式可谓是必学的技能. 关于学习设计模式,大家可能都觉得设计模式的概念太过于抽象,理解起来有点费劲:又或 ...

  4. jQuery 事件操作

    入口函数 使用$(document).ready(()=>{})作为jQuery入口函数,与window.onload(()=>{})类似,但它不会等待图片等外部资源的加载完毕,而是在HT ...

  5. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  6. C# Mongo DB 修改多层嵌套集合中的字段

    C# Mongo DB 修改嵌套集合中的字段 虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难 这里我用Bson实现功能 这是模型(我这里有多层嵌套) publ ...

  7. Java枚举简述

    Java 枚举(enum) Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键 ...

  8. python练习 英文字符的鲁棒输入+数字的鲁棒输入

    鲁棒 = Robust 健壮 英文字符的鲁棒输入 描述 获得用户的任何可能输入,将其中的英文字符进行打印输出,程序不出现错误.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪ ...

  9. node.js的安装及其相关环境变量的配置

    笔者最近一直重置电脑,本来想换台mac,想了想还是加下配置吧. 于是慢慢的一直会去安装node 接下来进入教程环节 一.NodeJS下载 1.下载NodeJS安装包下载地址:NodeJS下载 2.开始 ...

  10. EventDispatcher

    事件分发类,提供事件注册.移除.触发功能 采用delegate.dictionary实现 支持自定义事件.事件采用字符串方式标识 支持 0,1,2,3,4 等5种不同参数个数的回调函数   // 路由 ...