天天看点

k8s 中的 ingress 使用细节

k8s中的ingress

什么是ingress

k8s 中使用 Service 为相同业务的 Pod 对象提供一个固定、统一的访问接口及负载均衡的能力,那么这些 Service 如何被外部的应用访问,其中常用的就是借助于 ​

​Ingress​

​对象。

Ingress 是 Kubernetes 中的一个资源对象,用来管理集群外部访问集群内部服务的方式。

Ingress 对象由 ​

​Ingress Controller​

​ 和 Ingress 策略设置来共同完成。

  • Ingress 策略:用来配置不同的转发规则;
  • ​Ingress Controller​

    ​ :Ingress 对象的域名解析都由 

    Ingress Controller

     来完成,Ingress Controller 就是一个反向代理程序,它负责解析 Ingress 的反向代理规则,如果 Ingress 有增删改的变动,所有的 

    Ingress Controller

     都会及时更新自己相应的转发规则,当 

    Ingress Controller

     收到请求后就会根据这些规则将请求转发到对应的 Service。
k8s 中的 ingress 使用细节

Ingress 如何使用

这里来个简单的 demo 来看下 Ingress 如何使用

1、部署ingress-controller

首先来部署下 ​

​Ingress Controller​

​ 这是使用的是 ​

​ingress-nginx​

使用的 k8s 版本是 ​

​v1.19.9​

​,所以这里选择的 ​​ingress-nginx​​ 是 ​

​v1.1.3​

里面的镜像是需要FQ的,这里打包了镜像到 docker-hub ​​安装脚本​​

$ kubectl apply -f deploy.yaml      

2、部署应用

cat <<EOF >./go-web.yaml
# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: go-web
  name: go-web
  namespace: study-k8s
spec:
  replicas: 5
  selector:
    matchLabels:
      app: go-web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: go-web
    spec:
      containers:
        - image: liz2019/test-docker-go-hub
          name: go-app-container
          resources: {}
status: {}

---
# service
apiVersion: v1
kind: Service
metadata:
  name: go-web-svc
  labels:
    run: go-web-svc
spec:
  selector:
    app: go-web
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
      name: go-web-http

---
# ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: www.go-web.com
      http:
        paths:
          - path: /index
            pathType: Prefix
            backend:
              service:
                name: go-web-svc
                port:
                  number: 8000
EOF      

在最下面放了 ingress 的配置,通过 ​

​path: /index​

​ 将 ingress 请求转发到 go-web-svc 的 service。

➜  ~ kubectl get ingress -n study-k8s
NAME             CLASS    HOSTS            ADDRESS                       PORTS   AGE
go-web-ingress   <none>   www.go-web.com   192.168.56.112,192.168.56.111   80      28m      

访问

$ curl '192.168.56.111:80/index' \
--header 'Host: www.go-web.com'

<h1>hello world</h1><div>你好</div>%      

ingress 使用细节

1、一个集群中可以有多个 ​

​Ingress Controller​

​​, 在 Ingress 中可以指定使用哪一个​

​Ingress Controller​

​;

2、多个 Ingress 规则可能出现竞争;

3、Ingress 可以为多个命名空间服务;

4、关于如何暴露 ingress 服务,让外面的服务访问到?

  • 1、

    Ingress Controller

     用 DaemonSet 方式部署,使用集群内部的某个或某些节点作为边缘节点,给 node 添加 label 来标识,使用 nodeSelector 绑定到边缘节点,保证每个边缘节点启动一个 

    Ingress Controller

     实例,用 hostPort 直接在这些边缘节点宿主机暴露端口,然后我们可以访问边缘节点中 

    Ingress Controller

     暴露的端口,这样外部就可以访问到 

    Ingress Controller

     了;
  • 2、使用亲和性调度策略,使需要部署 

    Ingress Controller

     的节点,每个节点都有一个 

    Ingress Controller

     部署,然后用 hostPort 直接在这些边缘节点宿主机暴露端口,我们就能通过这些节点的 IP 和 hostPort来访问 

    Ingress Controller

     了。

继续阅读