Kubernetes那点事儿——暴露服务之Ingress

Kubernetes那点事儿——暴露服务之Ingress

  • 前言
  • 一、ingress
    • 负载均衡器Ingress Controller
    • 路由规则Ingress
  • 二、Ingress Controller
  • 三、案例


前言

在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodeport也有缺点,比如端口号用尽,只能支持4层的负载均衡。为了弥补Nodeport的不足,Ingress应运而生。

一、ingress

Ingress 公开了从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。
下面是一个将所有流量都发送到同一Service的简单Ingress示例:

Kubernetes那点事儿——暴露服务之Ingress_第1张图片

Ingress分为两部分:负载均衡器和路由规则:

Kubernetes那点事儿——暴露服务之Ingress_第2张图片

负载均衡器Ingress Controller

Kubernetes那点事儿——暴露服务之Ingress_第3张图片

路由规则Ingress

# http示例.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service:
            name: web-service  # serviceName对应service的名称
            port:
              number: 80 # servicePort对应service监听端口
              

# https示例.yaml
apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - sslexample.ctnrs.com secretName: secret-tls
  rules:
    - host: sslexample.ingress.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend: 
            name: web-service  # serviceName对应service的名称
            port:
              number: 80 # servicePort对应service监听端口

Kubernetes那点事儿——暴露服务之Ingress_第4张图片

二、Ingress Controller

Ingress Controller有很多实现,示例采用官方维护的基于Nginx实现的,其他还可使用haproxy、lvs等。
Github:https://github.com/kubernetes/ingress-nginx
部署:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

部署Ingress Controller

方案一(2次反代)
使用DaemonSet部署ingress-controller,ds保证集群每个或者部分满足条件的node运行单个pod,如果是打算让每个node都跑一个ingress还是部分满足条件节点跑ingress都需要ds,这种部署模式ingress-controller需用hostnetwork,直接将pod与host共享网命名空间,host直接监控pod监听的端口。ingress可以直接转发请求到host。

user -> LB -> ingress-controller -> pod

方案二(3次反代)

使用Deployment部署ingress-controller,再使用service的nodeport方法去暴露ingress-controller,与DaemonSet方式部署最大的区别该方式ingress-controller不需要hostnetwork,但deployment可能会出现几个ingress都在一个或几个node上,这不优雅也不能保证集群高可用。

user -> LB -> svc(nodePort) -> ingress-controller -> pod

kubectl apply -f ingress-controller.yaml

kubectl get pods -n ingress-nginx -o wide

NAME                             READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES

nginx-ingress-controller-hdx4b   1/1     Running   0          22m   10.7.7.221   k8s-node1   <none>           <none>

nginx-ingress-controller-pqkx8   1/1     Running   0          22m   10.7.7.222   k8s-node2   <none>           <none>

因为controller采用DaemonSet模式,所以集群每个节点都起一个pod,master节点有taint,所以master节点没有pod

三、案例

需求:一个或多个特定的node上只运行ingress(污点+标签+ds)

  1. 打污点,给node打上污点,防止其他pod运行在此node上
  2. 给ingress打上污点容忍,允许pod可以运行在污点node上
  3. 使用nodeSelector,将ingress调度到污点node
  4. 使用DaemonSet控制器,控制每个污点node上都运行一个ingress

你可能感兴趣的:(Kubernetes,kubernetes,云原生,运维,linux)