- 1. Ingress入门
- 1.1 Ingress简介
- 1.2 原理和组成部分
- 1.3 资料信息
- 2. Ingress部署的几种方式
- 2.1 前言
- 2.1 Deployment+LoadBalancer模式的Service
- 2.2 Deployment+NodePort模式的Service
- 2.3 DaemonSet+HostNetwork+nodeSelector
- 3. Deployment+NodePort模式
- 3.1. 官网下载yaml,安装ingress-nginx
- 3.2. 创建deployment和service
- 3.3 创建https证书的secret
- 3.4. 创建ingress策略
- 3.5 查看ingress-controller的nodeport端口,并访问
1. Ingress入门
1.1 Ingress简介
kubernetes
自带的service
概念只有四层代理,即表现形式为IP:Port
.
如果需要实现七层代理,即绑定到域名的话,则需要另一个了,即ingress api
- 官方在
v1.11
推出了ingress api
接口,既而达到七层代理的效果 - 对于
ingress
来说,必须要绑定一个域名
1.2 原理和组成部分
Ingress可以理解为Service的Service。它由两部分组成
- Ingress Controller
- 这是一个标准,可以有很多实现,其中
ingress-nginx
是最常用的 - 以pod形式运行的
- 这是一个标准,可以有很多实现,其中
- Ingress策略设置
- 以yaml形式为载体的一组声明式的策略
ingress-controller
会动态地按照策略生成配置文件(如:nginx.conf
)
1.3 资料信息
- Ingress-Nginx github repo
https://github.com/kubernetes/ingress-nginx
- Ingress-Nginx官方网站
https://kubernetes.github.io/ingress-nginx
2. Ingress部署的几种方式
2.1 前言
ingress的部署,需要考虑两个方面:
ingress-controller
是作为pod
来运行的,那么以什么方式部署比较好?ingress
解决了把如何请求路由到集群内部,那它自己怎么暴露给外部比较好?
下面列举一些目前常见的部署和暴露方式,具体使用哪种方式还是得根据实际需求来考虑决定。
2.1 Deployment+LoadBalancer模式的Service
如果要把ingress部署在公有云,那可以选择这种方式。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。
需要额外购买公有云的服务!
2.2 Deployment+NodePort模式的Service
同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
缺点:
- NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。
- 请求节点会是类似
https://www.xx.com:30076
,其中30076
是kubectl get svc -n ingress-nginx
的svc暴露出来的nodeport
端口
2.3 DaemonSet+HostNetwork+nodeSelector
用DaemonSet
结合nodeselector
来部署ingress-controller
到特定的node
上,然后使用HostNetwork
直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433
端口就能访问服务。这时,ingress-controller
所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器
优点
- 该方式整个请求链路最简单,性能相对NodePort模式更好
缺点
- 由于直接利用宿主机节点的网络和端口,一个node只能部署一个
ingress-controller pod
3. Deployment+NodePort模式
3.1. 官网下载yaml,安装ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
3.2. 创建deployment和service
- 这里service定义为
clusterip
apiVersion: apps/v1
kind: Deployment
metadata:
name: tocgenerator-deploy
namespace: default
labels:
app: tocgenerator-deploy
spec:
replicas: 2
revisionHistoryLimit: 2
selector:
matchLabels:
app: tocgenerator-server
template:
metadata:
labels:
app: tocgenerator-server
spec:
containers:
- name: tocgenerator
image: lzw5399/tocgenerator:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: tocgenerator-svc
spec:
selector:
app: tocgenerator-server
ports:
- protocol: TCP
port: 80
targetPort: 80
3.3 创建https证书的secret
- 方式1:直接指定文件创建
kubectl create secret tls mywebsite-secret --key tls.key --cert tls.crt
- 方式2: 以yaml资源清单方式创建
apiVersion: v1
kind: Secret
metadata:
name: mywebsite-secret
data:
tls.crt: **************************
tls.key: **************************
3.4. 创建ingress策略
ingress策略
必须和service同一个namespace!
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tocgenerator-ingress
spec:
tls:
- hosts:
- toc.codepie.fun
secretName: toc-secret
rules:
- host: toc.codepie.fun
http:
paths:
- path: /
backend:
serviceName: tocgenerator-svc
servicePort: 80
3.5 查看ingress-controller的nodeport端口,并访问
- 查看ingress-controller的nodeport端口
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.104.80.142 80:30122/TCP,443:30577/TCP 21h
- 访问
https://toc.codepie.fun:30577