当前位置: 首页 > news >正文

Kubernetes Ingress与安全机制

Kubernetes Ingress与安全机制详解

    • 前言
  • 一、Ingress 服务
      • 1. Ingress 简介
        • 1.1 Service 的作用回顾
        • 1.2 外部访问集群服务的常见方式
      • 2. Ingress 的组成
        • 2.1 Ingress(规则定义对象)
        • 2.2 Ingress Controller(规则执行者 / 流量入口)
  • 三、Ingress 工作原理
  • 四、Ingress 的部署方式
      • 1. DaemonSet + HostNetwork + nodeSelector
      • 2. Deployment + Service(type=NodePort)
  • 五、Ingress 的安全机制
      • 1. TLS 加密
      • 2. 基本认证(BasicAuth)
  • 六、常见检查与排错要点
  • 结语

前言

  在当今的云原生时代,Kubernetes(简称K8s)已经成为了容器编排领域的事实标准。随着微服务架构的广泛应用,如何有效地管理和暴露服务成为了运维和开发人员面临的重要挑战。Kubernetes 提供了多种服务暴露方式,其中 Ingress 作为一种七层反向代理,因其灵活性和高效性,逐渐成为了服务暴露的主流选择。本文将深入探讨 Kubernetes Ingress 的概念、组成、工作原理及其部署方式,并结合实际案例,帮助读者全面理解和掌握 Ingress 的使用。

一、Ingress 服务

1. Ingress 简介

1.1 Service 的作用回顾

在 Kubernetes 中,Service 主要承担两个角色:

  • 对集群内部:持续跟踪 Pod 的变化,维护一个稳定的 Endpoints 列表,为集群内其他组件提供服务发现机制
  • 对集群外部:作为访问 Pod 的统一入口,类似于传统的负载均衡器

但需要注意的是:

Pod IPService 的 ClusterIP 仅在 Kubernetes 集群内部可访问,外部用户无法直接通过这些 IP 访问服务。

因此,为了将集群内部的服务暴露给外部用户,Kubernetes 提供了多种方案:

1.2 外部访问集群服务的常见方式
方式说明适用场景缺点/限制
NodePort在每个节点的 IP 上开放一个静态端口(范围:30000-32767),将流量转发到对应的 Service适用于测试、小规模环境端口管理复杂,不适合生产大规模部署
LoadBalancer通过云厂商的负载均衡器(LB)将外部流量导入到 Service,由云平台自动创建和管理 LB适合公有云环境依赖云厂商,通常会产生额外费用
externalIPs给 Service 指定一个外部可达的 IP,当该 IP 的流量到达集群节点时,会被转发到对应的 Service适用于自有 IP 资源的场景需自行管理 IP 和路由,不常用
Ingress(推荐)基于 HTTP/HTTPS 的七层路由,通过域名或路径将请求路由到不同的 Service,只需一个或少量公网 IP 即可管理多个服务适合生产环境,尤其是需要基于域名或路径做路由管理的场景需要额外部署 Ingress Controller

小结:

  • Ingress 的核心价值在于:使用少量的公网 IP 或负载均衡器,通过 HTTP/HTTPS 协议,基于域名或路径,智能地路由到后端多个 Service。
  • Ingress 本身只是规则定义(YAML 配置),真正负责流量转发的是 Ingress Controller。

2. Ingress 的组成

Ingress 的完整功能由两个核心部分组成:

2.1 Ingress(规则定义对象)
  • 是什么:Ingress 是一个 Kubernetes 的API 资源对象,通过 YAML 文件定义,描述如何将外部请求(基于域名 / URL 路径)路由到对应的 Service
  • 功能包括
    • 基于 域名 的虚拟主机路由(如 example.com → service-A)
    • 基于 URL 路径 的路由(如 /api → service-B,/web → service-C)
    • 支持 TLS/SSL 加密(HTTPS)
    • 提供基础的负载均衡能力(由 Ingress Controller 实现)
  • 关键点:Ingress 只定义规则不负责实际流量转发,它需要依赖 Ingress Controller 来生效。

📌 示例用途:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingress
spec:rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
-------------------------------------------------------------------------------------
kubectl create deployment myapp-demo1 --image=soscscs/myapp:v1 --replicas=2 --port=80
kubectl expose deployment myapp-demo1 --port=80 --target-port=80
kubectl expose deployment myapp-demo1 --port=80 --target-port=80 --dry-run=client  -o yaml > ch.yaml
apiVersion: v1
kind: Service
metadata:labels:app: myapp-demo1name: myapp-demo1
spec:externalIPs:- 192.168.10.12ports:- port: 80protocol: TCPtargetPort: 80selector:app: myapp-demo1
status:

在这里插入图片描述

2.2 Ingress Controller(规则执行者 / 流量入口)
  • 是什么:Ingress Controller 是一个运行在集群中的组件(通常以 Pod 形式存在),它的职责是:

    • 监听集群中的 Ingress 资源变化
    • 根据 Ingress 中定义的规则,动态生成负载均衡配置(如 Nginx 配置)
    • 实际接收外部流量,并按照规则将请求转发到对应的 Service,实现反向代理和负载均衡
  • 特点

    • 不是 Kubernetes 内置组件,需要单独部署
    • 常见的实现有:
      • 官方维护:https://github.com/kubernetes/ingress-nginx(基于 Nginx)、https://cloud.google.com/kubernetes-engine/docs/concepts/ingress(Google Cloud 专用)
      • 第三方:Traefik、HAProxy Ingress、Istio Gateway、Caddy 等
    • 通常以 Pod 形式运行在集群中,内部包含:
      • 一个控制器进程(负责监听 API Server,感知 Ingress 变化,生成配置)
      • 一个反向代理程序(如 Nginx,负责实际流量处理)
  • 工作流程简述

    1. 用户提交 Ingress YAML 到 Kubernetes API Server
    2. Ingress Controller 监听到变化
    3. 根据 Ingress 规则,动态生成或更新代理配置(如 Nginx.conf)
    4. 重新加载或热更新代理服务
    5. 外部用户通过指定的域名 / IP 访问,流量被 Ingress Controller 接收并路由到后端 Service

总结:

  • Ingress = 路由规则(YAML 配置)
  • Ingress Controller = 流量入口 + 规则执行者(真正干活的,提供反向代理、负载均衡、SSL 等能力)
  • 没有 Ingress Controller,Ingress 规则不会生效!
组件作用是否必须备注
Service提供集群内服务发现 & 集群内访问入口✅ 必须是后端真实服务的抽象
Ingress定义外部访问的路由规则(域名 / 路径 → Service)✅ 需要使用 Ingress 功能时本身不转发流量
Ingress Controller实现 Ingress 规则,提供反向代理、负载均衡、SSL 等能力✅ 必须(如果要用 Ingress)需单独部署,比如 ingress-nginx

三、Ingress 工作原理

  Ingress 的工作原理主要包括以下几个步骤:

  1. 感知规则变化:Ingress Controller 与 APIServer 交互,动态地去感知 Ingress 规则变化。
  2. 生成配置:读取规则并按自定义模板生成 Nginx 配置。
  3. 写入配置:将生成的 Nginx 配置写入 Ingress Controller 的 Pod 中,通常位于 /etc/nginx.conf 文件中。
  4. 生效配置:执行 reload 使配置生效,实现按域名分流与动态更新。

四、Ingress 的部署方式

  Ingress 的部署方式主要有三种:Deployment + Service(type=LoadBalancer)、DaemonSet + HostNetwork + nodeSelector 和 Deployment + Service(type=NodePort)。

1. DaemonSet + HostNetwork + nodeSelector

  这种方式在特定节点以 DaemonSet 方式部署 Controller,并使用 HostNetwork 与宿主机网络打通,直接占用宿主机 80/443 端口。该方式链路最短、性能最好,适合大并发生产环境。

#
ingree.contro.tar  ingree.contro.tar.gz  mandatory.yaml
docker load -i ingree.contro.tar
--------------------------------------------------------------------------------------
kubectl label node node2 ingress=true
kubectl get nodes --show-labels
vim mandatory.yaml 
apiVersion: v1
kind: Namespace
metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:name: tcp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:name: udp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:name: nginx-ingress-clusterrolelabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingressesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingresses/statusverbs:- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:name: nginx-ingress-rolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:# Defaults to "<election-id>-<ingress-class>"# Here: "<ingress-controller-leader>-<nginx>"# This has to be adapted if you change either parameter# when launching the nginx-ingress-controller.- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-role
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrole
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:
#  replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:hostNetwork: truenodeSelector:ingress: "true"serviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controllerimage: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx- --annotations-prefix=nginx.ingress.kubernetes.iosecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICE# www-data -> 33runAsUser: 33env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443livenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 10readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 10
---
--------------------------------------------------------------------------------------
vim svc-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:type: ClusterIPports:- protocol: TCPport: 80targetPort: 80selector:app: nginx
--------------------------------------------------------------------------------------
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.nh.comhttp:paths:- path: /pathType: Prefix  # 也可使用 Exactbackend:service:name: nginx-app-svcport:number: 80
--------------------------------------------------------------------------------------
kubectl get pod -n  ingress-nginx -o wide 
kubectl get pods -l app=nginx -o wide

在这里插入图片描述

在这里插入图片描述

2. Deployment + Service(type=NodePort)

  这种方式以 Deployment 部署 Controller,并创建 NodePort Service 暴露。由于 NodePort 是随机端口,通常前置一层负载均衡。该方式多一层 NAT,大流量场景可能影响性能。

docker load -i ingress-controller-0.30.0.tar
# mandatory.yaml
apiVersion: v1
kind: Namespace
metadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:name: udp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nginx-ingress-clusterrolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingressesverbs:- get- list- watch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingresses/statusverbs:- update
---
apiVersion: rbac.authorization.k8s.io/v1 
kind: Role
metadata:name: nginx-ingress-rolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get
---
apiVersion: rbac.authorization.k8s.io/v1 
kind: RoleBinding
metadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-role
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrole
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:terminationGracePeriodSeconds: 300serviceAccountName: nginx-ingress-serviceaccountnodeSelector:kubernetes.io/os: linuxcontainers:- name: nginx-ingress-controllerimage: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0  args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx- --annotations-prefix=nginx.ingress.kubernetes.iosecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICErunAsUser: 101env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80protocol: TCP- name: httpscontainerPort: 443protocol: TCPlivenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 10readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 10lifecycle:preStop:exec:command:- /wait-shutdown
---
apiVersion: v1
kind: LimitRange
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:limits:- min:memory: 90Micpu: 100mtype: Container
======================================================================================
# service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:type: NodePortports:- name: httpport: 80targetPort: 80protocol: TCP# nodePort: 30080  # 可选,如需固定端口则取消注释并设置- name: httpsport: 443targetPort: 443protocol: TCP# nodePort: 30443  # 可选selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
======================================================================================
#ingress-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginx  # 必须与下方 Service 的 selector 一致spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:app: nginx  
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-test
spec:rules:- host: www.nh.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80

在这里插入图片描述在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1
spec:replicas: 2selector:matchLabels:name: nginx1template:metadata:labels:name: nginx1spec:containers:- name: nginx1image: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx1
--- 
# deployment2.yaml(v2)
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment2
spec:replicas: 2selector:matchLabels:name: nginx2template:metadata:labels:name: nginx2spec:containers:- name: nginx2image: soscscs/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx2--- 
# ingress-nginx.yaml(双主机名)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www1.nh.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www2.nh.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port:number: 80

在这里插入图片描述

五、Ingress 的安全机制

  在 Ingress 的使用过程中,安全性是一个不可忽视的重要方面。以下是一些常见的安全机制:

1. TLS 加密

  通过配置 TLS 证书,Ingress 可以实现 HTTPS 访问,确保数据传输的加密和安全性。例如,可以通过生成自签证书并创建相应的 Secret,然后在 Ingress 配置中引用该 Secret 来实现 HTTPS 代理访问。

mkdir -p /opt/ingress-nodeport/https && cd /opt/ingress-nodeport/https
openssl req -x509 -sha256 -nodes -days 365 \-newkey rsa:2048 -keyout tls.key -out tls.crt \-subj "/CN=nginxsvc/O=nginxsvc"# 创建 secret
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
kubectl get secret tls-secret -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https
spec:tls:- hosts:- www3.nh.comsecretName: tls-secretrules:- host: www3.nh.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80

在这里插入图片描述

2. 基本认证(BasicAuth)

  Ingress 支持基本认证,通过配置 BasicAuth,可以对访问者进行身份验证,确保只有授权用户才能访问服务。例如,可以使用 htpasswd 生成认证文件,并将其作为 Secret 引用到 Ingress 配置中。

mkdir -p /opt/ingress-nodeport/basic-auth && cd /opt/ingress-nodeport/basic-auth
yum -y install httpd
htpasswd -c auth nh
kubectl create secret generic basic-auth --from-file=auth
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-authannotations:nginx.ingress.kubernetes.io/auth-type: basicnginx.ingress.kubernetes.io/auth-secret: basic-authnginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - nh'
spec:rules:- host: auth.nh.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80

在这里插入图片描述

六、常见检查与排错要点

在使用 Ingress 过程中,可能会遇到各种问题,以下是一些常见的检查与排错要点:

  • 查看 Controller 运行与端口:通过 kubectl get pod -n ingress-nginx -o widenetstat -lntp | grep nginx 等命令,检查 Ingress Controller 的运行状态和端口监听情况。
  • 进入 Pod 检查 Nginx 配置:通过 kubectl exec -it <controller-pod> -n ingress-nginx -- /bin/bash 命令,进入 Ingress Controller Pod,检查生成的 Nginx 配置文件,确保配置正确。
  • 调度失败:如果遇到调度失败问题,可以检查节点标签和 YAML 配置,确保节点标签匹配或删除不必要的 nodeSelector。

结语

  Kubernetes Ingress 作为服务暴露的重要工具,提供了灵活、高效的 HTTP/HTTPS 服务管理能力。通过本文的介绍,我们了解了 Ingress 的概念、组成、工作原理及其部署方式,并结合实际案例,展示了如何在不同环境中部署和配置 Ingress。同时,我们也探讨了 Ingress 的安全机制和常见检查与排错要点,帮助读者在实际使用中更好地应对各种挑战。

在生产环境中,合理选择和配置 Ingress,结合多节点部署、前置负载均衡、监控告警及安全加固等措施,可以有效提升服务的可用性、性能和安全性。希望本文能为读者在 Kubernetes Ingress 的使用和优化过程中提供有价值的参考和指导。

http://www.dtcms.com/a/502978.html

相关文章:

  • 【企业架构】TOGAF架构标准规范-机会与解决方案
  • apache建设本地网站wordpress修改成中文字体
  • windows平台,用pgloader转换mysql到postgresql
  • Linux驱动第一期1-10-驱动基础总结
  • 我的WordPress网站梅林固件做网站
  • 分库分表:基础介绍
  • 使用css `focus-visible` 改善用户体验
  • AI人工智能-深度学习的基本原理-第二周(小白)
  • 【2070】数字对调
  • 【AI智能体】Coze 提取对标账号短视频生成视频文案实战详解
  • IOT项目——ESP系列
  • 【成长纪实】Dart 与 ArkTS 函数与类的对比学习:从 Flutter 到 HarmonyOS
  • 基于 JETSON+FPGA+GMSL+AI 车载视频采集与存储系统设计(二)系统测试
  • Flutter Event Loop
  • LeetCode 1287.有序数组中出现次数超过25%的元素
  • 递归-50.Pow(x,n)-力扣(LeetCode)
  • Flutter 并发编程全解:从零掌握 Isolate
  • 跨网络互联技术(①Singbox Core-Flutter-Android)
  • 移动端网站的重要性做一款推荐类的网站
  • 用div做网站中间部分做网站是干啥的
  • 【思维导图SimpleMind Pro】SimpleMind Pro——轻量级思维导图软件完全指南:轻量专业,让思维高效可视化
  • jlink烧入软件的使用
  • 03-流程控制语句-教程
  • 【mqtt参数上云和小程序开发】【第5期】hcsr04超声波测距模块调试完成
  • 【STM32笔记】:P03 ISP 一键下载电路详解
  • 江苏省网站建设哪家好php做的购物网站
  • 常见的位运算的总结
  • CSRF(跨站请求伪造)攻击详解:原理、途径与防范
  • 【C++】使用双指针算法习题
  • 全能型 AI 模型新标杆 Qwen2.5-Omni