前言

在跟随书籍学习 kubernetes 的过程中,吾一直在思考如何从外部访问集群的服务,诚然到了 Ingress 的内容,才理解 kubernetes 对外提供内部服务的方式。

Ingress 与 ingress-controller

Ingress 是 kubernetes 的一种资源对象,该对象允许外部访问 kubernetes 服务, 通过创建规则集合来配置访问权限,这些规则定义了哪些入站连接可以访问哪些服务。

ingress-controller 是实现反向代理和负载均衡的程序,其功能是为了使 ingress 工作,通过解析 ingress 的规则来实现请求转发。集群内可以有多个 ingress-controller。

Ingress 部署

Ingress 部署的方式有多种,一般情况下需要考虑场景才选择部署方式。以下是笔者摘抄的常见部署方式:

Deployment + LoadBalancer

如果要把 ingress 部署在公有云,那用这种方式比较合适。用 Deployment 部署 ingress-controller,创建一个 type 为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。

Deployment + NodePort

同样用 deployment 模式部署 ingress-controller,并创建对应的服务,但是 type 为 NodePort。这样,ingress 就会暴露在集群节点 ip 的特定端口上。由于 nodeport 暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境 ip 地址不变的场景。NodePort 方式暴露 ingress 虽然简单方便,但是 NodePort 多了一层 NAT,在请求量级很大时可能对性能会有一定影响。

DaemonSet + HostNetwork + nodeSelector

用 DaemonSet 结合 nodeselector 来部署 ingress-controller 到特定的 node 上,然后使用 HostNetwork 直接把该 pod 与宿主机 node 的网络打通,直接使用宿主机的 80/433 端口就能访问服务。这时,ingress-controller 所在的 node 机器就很类似传统架构的边缘节点,比如机房入口的 nginx 服务器。该方式整个请求链路最简单,性能相对 NodePort 模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个 node 只能部署一个 ingress-controller pod。比较适合大并发的生产环境使用。

在本次实验中也根据相关教程使用 DaemonSet+HostNetwork+nodeSelector 的方式部署。

1、部署 ingress-controller

为需要部署为边缘节点的 node 打上 labe:

$ kubectl  label   node k8sn91 isIngress="true"

在官方 yaml 配置文件中,相关资源的创建已经包含在内,但是我们需要使用 DaemonSet 的方式部署,就需要修改一小部分内容。下载官方 yaml:

$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

修改 Deployment 部分的配置:

……
apiVersion: apps/v1
# kind: Deployment
# 修改成 DaemonSet
kind: DaemonSet
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
# 注释掉 replicas
# replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
# wait up to five minutes for the drain of connections
terminationGracePeriodSeconds: 300
serviceAccountName: nginx-ingress-serviceaccount
# 选择打上 isIngress 标签的 node
nodeSelector:
isIngress: "true"
# 暴露服务
hostNetwork: true
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
……

部署 nginx-ingress-controller:

$ kubectl apply -f mandatory.yaml

查看:

$ kubectl get ds -n ingress-nginx
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-ingress-controller 1 1 1 1 1 isIngress=true 10m
$ kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-prqv5 1/1 Running 0 10m

2、部署测试 web 服务

为了展示 ingress 路由转发功能,创建两个 web 服务,然后通过 ingress 编写规则来转发相关请求。

apple.yaml

kind: Pod
apiVersion: v1
metadata:
name: apple-app
labels:
app: apple
spec:
containers:
- name: apple-app
image: hashicorp/http-echo
args:
- "-text=apple" --- kind: Service
apiVersion: v1
metadata:
name: apple-service
spec:
selector:
app: apple
ports:
- port: 5678 # Default port for image

banana.yaml

kind: Pod
apiVersion: v1
metadata:
name: banana-app
labels:
app: banana
spec:
containers:
- name: banana-app
image: hashicorp/http-echo
args:
- "-text=banana" --- kind: Service
apiVersion: v1
metadata:
name: banana-service
spec:
selector:
app: banana
ports:
- port: 5678 # Default port for image

部署 pod

$ kubectl apply -f apple.yaml
$ kubectl apply -f banana.yaml

查看 service、pod:

$ kubectl get svc,po | grep -E "apple|banana"
service/apple-service ClusterIP 10.106.133.148 <none> 5678/TCP 10m
service/banana-service ClusterIP 10.108.239.61 <none> 5678/TCP 10m
pod/apple-app 1/1 Running 0 10m
pod/banana-app 1/1 Running 0 10m
$ curl 10.106.133.148:5678
apple
$ curl 10.108.239.61:5678
banana

3、部署 Ingress

编写 yaml 文件,指定路由规则

$ vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.tempdomain.com
http:
paths:
- path: /apple
backend:
serviceName: apple-service
servicePort: 5678
- path: /banana
backend:
serviceName: banana-service
servicePort: 5678

部署 ingress:

$ kubectl apply -f ingress-nginx.yaml

查看 ingress:

$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-ingress nginx.tempdomain.com 80 10m
$ kubectl describe ingress nginx-ingress
Name: nginx-ingress
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
nginx.tempdomain.com
/apple apple-service:5678 (100.93.23.211:5678)
/banana banana-service:5678 (100.107.55.15:5678)

4、检查可用性

$ curl nginx.tempdomain.com/apple
apple
$ curl nginx.tempdomain.com/banana
banana

参考:

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

https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html

https://segmentfault.com/a/1190000019908991#articleHeader5

k8s Ingress 理解和部署的更多相关文章

  1. 浅谈 k8s ingress controller 选型

    大家好,先简单自我介绍下,我叫厉辉,来自腾讯云.业余时间比较喜欢开源,现在是Apache APISIX PPMC.今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容 ...

  2. K8s小白?应用部署太难?看这篇就够了!

    在云原生趋势下,容器和 Kubernetes 可谓是家喻户晓,许多企业内部的研发团队都在使用 Kubernetes 打造 DevOps 平台.从最早的容器概念到 Kubernetes 再到 DevOp ...

  3. 基于 K8S 集群安装部署 istio-1.2.4

    使用云平台可以为组织提供丰富的好处.然而,不可否认的是,采用云可能会给 DevOps 团队带来压力.开发人员必须使用微服务以满足应用的可移植性,同时运营商管理了极其庞大的混合和多云部署.Istio 允 ...

  4. Nginx Ingress on TKE 部署最佳实践

    概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...

  5. Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

         前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...

  6. k8s之Dashboard插件部署及使用

    k8s之Dashboard插件部署及使用 目录 k8s之Dashboard插件部署及使用 1. Dashboard介绍 2. 服务器环境 3. 在K8S工具目录中创建dashboard工作目录 4. ...

  7. k8s集群中部署prometheus server

    1.概述 本文档主要介绍如何在k8s集群中部署prometheus server用来作为监控的数据采集服务器,这样做可以很方便的对k8s集群中的指标.pod的.节点的指标进行采集和监控. 2.下载镜像 ...

  8. K8S ingress控制器

    文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...

  9. 使用Kubeadm创建k8s集群之部署规划(三十)

    前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...

随机推荐

  1. Java多线程编程(二)对象及变量的并发访问

    一.synchronized同步方法 1.方法内的变量为线程安全 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了. 示例: ...

  2. C#基本网络操作

    建档操作如ping,查询本机主机ip,同步异步查询局域网内主机,同步异步邮件发送等 1)ping 通过ping类测试网络 using System; using System.Text; using ...

  3. MySQL如何进行索引重建操作?

    在MySQL数据库中,没有类似于SQL Server数据库或Oracle数据库中索引重建的语法(ALTER INDEX ... REBUILD),那么在MySQL数据库中,是否有什么方式重建索引呢? ...

  4. OA权限设计

    Action表,有多少个Action,就有多少个记录; UserAction表,记录条数 = User数 * Action数,用于最终确定用于能否请求某个action Role角色表,自定义条数; R ...

  5. [模板]tarjan——最后通牒

    这么久了我还是不会板子,你们随便笑话我吧. 再不会打我实在是无能为力了. 这篇博客写的像个智障一样...写它的目的就是自嘲? 才不是,为了方便查阅,因为我真的记不住. 对于割边,要存储该点入边的编号, ...

  6. 「刷题」可怜与STS

    又是一道假期望,我们发现一共有$ C_{2n}^m $种情况. 而$ \frac{(2n)!}{m!(2n-m)!}=C_{2n}^m $ 其实结果就是各个情况总伤害. 1.10分算法,爆搜10分. ...

  7. CSPS模拟 74

    T1 贪心,如果用set考虑一下multi. T2 难道是我的疑问都太过sb? 从来没人愿意认真思考一下我的问题. 更好,思考量这东西本该我自己来补. 设$dp[i][j]$为i个点的森林,j个点在特 ...

  8. formdata,ajax提交数据

    var data = document.getElementById("#dataForm"); var formData = new FormData(data); var ac ...

  9. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  10. Asp.Net终于可以在龙芯服务器上运行啦:Jexus成功完成对国产系列CPU的适配

    为了确保我国信息化建设“安全可靠”,使用国产关键系统.关键应用.关键软硬件替代国外信息技术产品,已经在党政部门.国营企事业单位得到了进一步落实.过去运行于 Windows 服务器的 Web 应用程序, ...