k8s-ingress学习总结
大纲
- 概念
- 部署安装ingress
- https 支持
概念
Ingress主要是一个用于Kubernetes集群业务的入口。可以使用Traefik、Istio、Nginx、HAProxy作为Ingress,典型的访问方式是 HTTP
K8s集群对外暴露服务的方式目前有三种:
- LoadBalancer
- Nodeport
- Ingress
LoadBalancer 大部分情况下只适用于支持外部负载均衡器的云提供商(AWS,阿里云,华为云等)使用。缺点 需要云服务商提供支持
Nodeport 的问题是需要集群主机开放大量的端口,如果服务多了就不好管理
Ingress的优势是减少不必要的端口暴露只需要一个NodePort或者一个LoadBalancer就可以满足所有service对外服务的需求,同时可以实现动态配置暴露服务当新增加一个服务时只需要配置一个域名即可
Ingress其实还是利用service 实现对外暴露
ingress的工作原理
ingress contronler通过与k8s的api进行交互,拉取k8s集群中ingress服务规则的变化,然后读取并按照定义的ingress规则,修改ingress-controller中的nginx配置,实现转发到k8s集群中对应的service。
Ingress组成
Ingress由两部分组成:Ingress controller和Ingress服务
单独使用Ingress是无效的
本次测试使用Nginx Ingress controller
k8s社区提供的Nginx ingress,github地址 https://github.com/kubernetes/ingress-nginx
nginx社区提供的Nginx ingress,github地址 https://github.com/nginxinc/kubernetes-ingress
部署安装ingress
本次测试:
- k8s集群版本为 1.70
- Nginx Ingress controller版本为0.26.2
- 两个应用tomcat 和 springboot order-service
使用ingress 对外暴露服务的架构如下
step1 下载并安装Nginx Ingress controller
下载Nginx Ingress controller mandatory.yaml 配置文件
得到 mandatory.yaml 配置文件
注意:此mandatory.yaml 中只有包含 nginx-ingress-controller 没有包含service 需要自己独立创建
kubectl apply -f mandatory.yaml
kubectl get all -n ingress-nginx
nginx-ingress-controller完成安装
step2 创建nginx-ingress-controller-service
创建一个 nginx-ingress-controller-service 用于暴露nginx-ingress-controller
此service的关键是selector 选择的标签是mandatory.yaml 中nginx容器指定的标签
apiVersion: v1
kind: Service
metadata:
namespace: ingress-nginx
name: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
# 此service是需要对外暴露的type: NodePort
type: NodePort
ports:
- name: http #服务为http
port: 80 #service端口为80
targetPort: 80 #容器端口为80 对应nginx-ingress-controller 中nginx-容器的端口
protocol: TCP
nodePort: 32280
# 这里需要注意 selector 标签为 mandatory.yaml nginx-容器的标签
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
执行命令
kubectl apply -f nginx-ingress-controller-service.yaml
进入pod 可以看到内部的实现是基于openresty lua
集群外部使用nodePort端口访问成功
step3 创建业务service + pod
此步骤就是常规的k8s使用方式 service + deployment 实现业务服务部署
注意此步创建的service type都是 ClusterIP 并没有对外暴露
这是tomcat的配置
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
namespace: default
spec:
selector:
app: tomcat
# service的类型为 ClusterIP 这样就不使用nodePort暴露过多的端口
type: ClusterIP
ports:
- name: http
port: 8080
targetPort: 8080
- name: ajp
port: 8009
targetPort: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: bitnami/tomcat
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
ports:
- name: http
containerPort: 8080
- name: ajp
containerPort: 8009
执行命令
kubectl apply -f deploy-service-order.yaml
kubectl apply -f deploy-service-tomcat.yaml
step4 创建Ingress
创建Ingress 实现域名与service的映射
# 注意apiVersion
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
kubernets.io/ingress.class: "nginx"
spec:
rules:
- host: my.test.tomcat.cn #将域名与node IP 绑定写入访问节点hosts文件
http:
paths:
- path:
# 注意配置 backend 指定对应的service 与 service的端口
backend:
serviceName: tomcat-service
servicePort: 8080
- host: my.order.test.con #将域名与node IP 绑定写入访问节点hosts文件
http:
paths:
- path:
backend:
serviceName: order-service
servicePort: 5555
执行命令
kubectl apply -f ingress.yaml
在次登录到nginx-ingress-controller Pod中查看nginx.conf 配置文件
kubectl exec -it -n ingress-nginx nginx-ingress-controller-9dfc54f55-7cj87 bash
step5 修改Host
修改本机host文件,将域名与k8s集群中任意一台机器ip地址映射
使用域名访问 成功实现业务Pod的对外暴露
https 支持
Ingress 支持https需要额外准备证书和私钥
这里直接使用存在的证书和私钥
kubectl create secret tls medcrab-https-secret --cert=/medcrab/k8s/ingress-test/key/medcrab.com.crt --key=/medcrab/k8s/ingress-test/key/medcrab.com.key
*注意此证书书 .medcrab.com 通配符证书
其他部署和上面的http配置类似只需要配置两个地方
- 1 ingress的配置
- 2 创建一个secret 保存证书与私钥
setp1 创建ingress
只需要添加tls 相关配置即可
spec:
tls:
# 注意我们的证书是同配置证书
# secret只需要配置一个即可
- hosts:
- order.medcrab.com
secretName: medcrab-https-secret
- hosts:
- tomcat.medcrab.com
secretName: medcrab-https-secret
setp2 创建secret 保存证书与私钥
kubectl create secret tls medcrab-https-secret --cert=/medcrab/k8s/ingress-test/key/medcrab.com.crt --key=/medcrab/k8s/ingress-test/key/medcrab.com.key
setp3 修改Host
添加ip与域名映射
192.168.0.210 tomcat.medcrab.com
192.168.0.211 order.medcrab.com