命令记不住

登陆

k8s 网络 ingress

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.pem

3、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

.