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

文章介绍了Kubernetes中的Ingress机制,作为NodePort的补充,用于提供HTTP和HTTPS路由。Ingress由负载均衡器IngressController和路由规则组成。文中提到了Nginx实现的IngressController部署,包括DaemonSet和Deployment两种方案,并讨论了如何通过设置污点和标签确保特定节点仅运行Ingress。


前言

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

一、ingress

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

在这里插入图片描述

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

在这里插入图片描述

负载均衡器Ingress Controller

在这里插入图片描述

路由规则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监听端口

在这里插入图片描述

二、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
### 配置 Ingress 暴露 Wordpress 服务的方法 在 Kubernetes 中,Ingress 是一种用于实现从集群外部访问服务的 HTTP 和 HTTPS 路由的资源对象。通过 Ingress,可以使用域名的方式访问应用,类似于传统的 Nginx 配置,但通过 YAML 文件进行声明式管理[^1]。 为了将 Wordpress 服务暴露给外部用户,需要配置 Ingress 并结合 Ingress 控制器来实现。以下是一个完整的配置示例: #### 1. 创建 Wordpress Service 首先,确保 Wordpress 应用已经部署,并为其创建一个 Service。该 Service 将被 Ingress 引用以实现外部访问。 ```yaml apiVersion: v1 kind: Service metadata: name: wordpress spec: ports: - port: 80 targetPort: 80 selector: app: wordpress ``` #### 2. 配置 Ingress 资源 接下来,定义一个 Ingress 资源,指定域名和路径,将流量路由到 Wordpress Service。 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wordpress-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: wordpress port: number: 80 ``` 该 Ingress 配置将所有对根路径 `/` 的 HTTP 请求路由到名为 `wordpress` 的 Service 的 80 端口。 #### 3. 部署 Ingress 控制器 Ingress 控制器负责根据 Ingress 资源的定义生成实际的反向代理配置。常见的 Ingress 控制器包括 Nginx、HAProxy 和 Traefik 等。以 Nginx Ingress 控制器为例,可以通过以下命令部署: ```bash kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml ``` 部署完成后,确保 Ingress 控制器的 Pod 正常运行,并且其服务暴露了 80 和 443 端口。 #### 4. 配置 DNS 解析 最后,将域名解析到 Ingress 控制器所暴露的 IP 地址。可以通过云厂商的负载均衡器或本地 F5 等设备将流量转发到 Ingress,然后将域名指向这些设备的 IP 地址。 例如,假设 Ingress 控制器的外部 IP 为 `203.0.113.10`,则将 `wordpress.example.com` 解析到该 IP: ```bash wordpress.example.com A 203.0.113.10 ``` #### 5. 验证 Ingress 配置 完成上述配置后,可以通过访问 `http://wordpress.example.com` 来验证 Wordpress 服务是否成功暴露。 ### 安全性与扩展性 - **SSL/TLS 支持**:可以在 Ingress 中配置 TLS 证书,实现 HTTPS 访问。 - **基于主机的虚拟服务**:可以配置多个 Ingress 规则,实现多个应用共享同一个 Ingress 控制器。 - **负载均衡策略**:Ingress 控制器支持多种负载均衡算法,如轮询、最少连接等。 通过 Ingress,可以将 Wordpress 服务以标准化、可维护的方式暴露给外部用户,并实现基于域名的访问控制和负载均衡。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷学技术的梁胖胖yo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值