
k8s网络ingress
1.NodePort待解决的问题
1、一般直接使用域名访问,不加端口
2、一般node上配置是一个私有ip
3、假设node配置的有公网ip,多个node都可以访问,到底解析哪一个?
4、只支持4层负载均衡,一个端口只能一个服务使用,端口需要提前规划
2.ingress简介
解决这些问题有效方法:在前面加一个公网负载均衡器(自建或者公有云LB产品) -> 多个nodeport -> 多个pod
项目A a.com 30001
项目B b.com 30002
项目C c.com 30003• Ingress:K8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
• Ingress Controller:负责流量路由,根据Ingress生成具体的路由规则,并对Pod负载均衡器
使用流程
- 部署Ingress Controller
Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。
项目地址:https://github.com/kubernetes/ingress-nginx修改YAML:
• 镜像地址修改成国内的: lizhenliang/ingress-nginx-controller:v0.49.0
• 将Ingress Controller暴露,一般使用NodePort或者宿主机网络(hostNetwork: true)
其他控制器:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
修改Controller的NodePort端口
# Source: ingress-nginx/templates/controller-service.yaml apiVersion: v1 kind: Service metadata: annotations: labels: helm.sh/chart: ingress-nginx-3.36.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.49.0 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 protocol: TCP targetPort: http # nodePort: 30080 - name: https port: 443 protocol: TCP targetPort: https # nodePort: 30443可以多创建Controller,域名解析不单点
#kubectl get pods,svc -n ingress-nginx -o wide NAME READY STATUS RESTARTS SS GATES pod/ingress-nginx-admission-create-8m2bf 0/1 Completed 0 pod/ingress-nginx-admission-patch-wxbch 0/1 Completed 0 pod/ingress-nginx-controller-78b4958f8f-275t4 1/1 Running 1
- 创建Ingress规则
查看service名称
#kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d nginx NodePort 10.109.215.92 <none> 80:31234/TCP 16d书写ingress的yaml文件
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aliangedu spec: rules: - host: web.aliangedu.cn http: paths: - path: / pathType: Prefix backend: service: name: nginx port: number: 80本地写域名
# Ip为ingress-nginx-controller所在节点的IP 192.168.122.73 web.aliangedu.cn访问端口为service的NodePort
3.访问路径
nginx-ingress-controller 基于service找到对应的pod列表,并且自动更新到nginx配置里
nginx 负载均衡服务(都是基于upstream)
Service访问:
域名 -> 公网负载均衡器(一般要求是七层的,能基于域名分流,因为后端通过不同nodeport端口区分项目) -> Service NodePort -> (iptables/ipvs) -> 分布在各个节点上pod
Ingress访问:
域名-> 公网负载均衡器(可以是四层或七层,建议使用四层) -> Service NodePort -> ingress Controller(nginx,基于域名分流) -> 分布在各个节点上pod
Ingress访问(hostNetwork+daemonset+nodeselector):
域名-> 公网负载均衡器(可以是四层或七层,建议使用四层) -> ingress Controller(nginx,基于域名分流,使用宿主机网络 80和443) -> 分布在各个节点上pod
4.ingress与service区别:
1、使用的负载均衡技术不一样
2、ingress不管为多个项目暴露,始终都是走80(30080)和443(30443)端口访问(对于k8s而言,它是全局的负载均衡器)使用公网负载均衡器用途:
1、将k8s节点(内部网络)暴露到互联网上
2、统一访问入口,避免使用端口问题(主要针对Service)
5.Hostnetwork
ingress网络模式选择为Hostnetwork,比较更加流行。基于域名分流,使用宿主机网络
直接暴露在宿主机网络下,内网访问时不需要加NodePort端口,直接使用80和443
6.配置https
1、准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)
2、将证书文件保存到Secret
写入到k8s的secret中存储
kubectl create secret tls web-aliangedu-cn --cert=web.aliangedu.cn.pem --key=web.aliangedu.cn-key.pem3、Ingress规则配置tls,在同一命名空间
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aliangedu-https spec: tls: - hosts: - web.aliangedu.cn secretName: web-aliangedu-cn rules: - host: web.aliangedu.cn http: paths: - path: / pathType: Prefix backend: service: name: nginx port: number: 80.