1. Ingress 安装及原理
1.1 作用及原理
- 作用:Ingress 是 Kubernetes 中用于管理外部访问(HTTP/HTTPS)到集群内服务的 API 对象,支持负载均衡、SSL 终结和基于名称的虚拟托管。
- 原理:
- 每个节点监听 80 和 443 端口。
- 接收到 HTTP 请求后,根据设置的路径转发到对应的 Service。
- 转发流程:
HAProxy -> Ingress (80 和 443) -> Service -> Pod
。
1.2 安装 Ingress 控制器
推荐使用 DaemonSet 部署
- 解释:
- Ingress 控制器以 Pod 的方式运行,支持 Deployment 和 DaemonSet 两种部署方式。
- 安装文件地址:
- 部署步骤:
- 下载
deploy.yaml
文件。 - 替换镜像为国内镜像源,或提前下载。
- 修改
hostNetwork
配置,直接监听宿主机的 80 和 443 端口。- 如果不使用
hostNetwork
,Ingress 将监听 NodePort(如 30000 左右的端口)。
- 如果不使用
- 转发流程:
HAProxy -> Ingress (80 和 443) -> Service -> Pod
。
- 下载
- 部署文件路径:
/root/ingress/Ingress-case-20230611-backup/1.1-ingress-nginx-1.2.0_deploy-yaml/2.ingress-nginx-controller-v1.2.0_daemonset.yaml
- 注意事项:
- 如果使用 DaemonSet 部署,Ingress 将监听 80 和 443 端口。
- 如果使用 Deployment 部署,Ingress 将监听 NodePort 端口,需要使用 HAProxy 代理。
2. Ingress 项目
2.1 单个域名转发到后端 Pod
部署流程
-
部署后端 Pod 和 Service:
- 部署两个 Deployment 类型的后端 Pod。
- 部署 ClusterIP 类型的 Service。
- 创建 Ingress 规则(需先安装 Ingress 控制器)。
- 双域名支持:复制 Ingress 的 YAML 文件,分开写即可。
-
示例代码:
-
app1:
yaml复制
apiVersion: apps/v1 kind: Deployment metadata: name: magedu-tomcat-app1-deployment namespace: magedu spec: replicas: 1 selector: matchLabels: app: magedu-tomcat-app1-selector template: metadata: labels: app: magedu-tomcat-app1-selector spec: containers: - name: magedu-tomcat-app1-container image: registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/tomcat:7.0.94-alpine imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http env: - name: "password" value: "123456" - name: "age" value: "18" resources: limits: cpu: 1 memory: "512Mi" requests: cpu: 500m memory: "512Mi" --- apiVersion: v1 kind: Service metadata: name: magedu-tomcat-app1-service namespace: magedu spec: type: ClusterIP ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: magedu-tomcat-app1-selector
bash复制
kubectl exec -it -n magedu magedu-tomcat-app1-deployment-86f5cdd876-gntks bash mkdir /usr/local/tomcat/webapps/app1 echo app1 > /usr/local/tomcat/webapps/app1/index.jsp
-
app2:
yaml复制
apiVersion: apps/v1 kind: Deployment metadata: name: magedu-tomcat-app2-deployment namespace: magedu spec: replicas: 1 selector: matchLabels: app: magedu-tomcat-app2-selector template: metadata: labels: app: magedu-tomcat-app2-selector spec: containers: - name: magedu-tomcat-app2-container image: registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/tomcat:7.0.94-alpine imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http env: - name: "password" value: "123456" - name: "age" value: "18" resources: limits: cpu: 1 memory: "512Mi" requests: cpu: 500m memory: "512Mi" --- apiVersion: v1 kind: Service metadata: name: magedu-tomcat-app2-service namespace: magedu spec: type: ClusterIP ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: magedu-tomcat-app2-selector
bash复制
kubectl exec -it -n magedu magedu-tomcat-app2-deployment-86f5cdd876-gntks bash mkdir /usr/local/tomcat/webapps/app2 echo app2 > /usr/local/tomcat/webapps/app2/index.jsp
-
-
创建 Ingress 规则:
yaml复制
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: www.jigaobo.com namespace: magedu annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-body-size: "50m" spec: rules: - host: www.jigaobo.com http: paths: - pathType: Prefix path: "/" backend: service: name: magedu-tomcat-app2-service port: number: 80
-
请求验证:
-
添加
/etc/hosts
解析。 -
请求域名:
bash复制
curl www.jigaobo.com/app2/index.jsp
-
2.2 实现单个域名和双域名的 HTTPS 请求转发到 Service
部署流程
-
部署后端 Pod 和 Service:
- 部署两个 Deployment 类型的后端 Pod。
- 部署 ClusterIP 类型的 Service。
-
创建 Secret:
-
将 HTTPS 证书存入 Secret 中。
-
示例:
bash复制
kubectl create secret tls tls-secret-www --cert=www.jigaobo.com.crt --key=www.jigaobo.com.key -n magedu kubectl create secret tls tls-secret-xxx --cert=xxx.jigaobo.cn.crt --key=xxx.jigaobo.cn.key -n magedu
-
-
创建 Ingress 规则:
-
单域名:
yaml复制
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-web namespace: magedu annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - www.jigaobo.com secretName: tls-secret-www rules: - host: www.jigaobo.com http: paths: - pathType: Prefix path: "/" backend: service: name: magedu-tomcat-app2-service port: number: 80
-
双域名:
yaml复制
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-web-mobile namespace: magedu annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - www.jigaobo.com secretName: tls-secret-www - hosts: - xxx.jigaobo.cn secretName: tls-secret-xxx rules: - host: xxx.jigaobo.cn http: paths: - pathType: Prefix path: "/" backend: service: name: magedu-tomcat-app1-service port: number: 80 - host: www.jigaobo.com http: paths: - pathType: Prefix path: "/" backend: service: name: magedu-tomcat-app2-service port: number: 80
-
-
请求验证:
-
测试 HTTPS 请求:
bash复制
curl https://www.jigaobo.com/app2/index.jsp curl https://xxx.jigaobo.cn/app1/index.jsp
-
2.3 辅助配置
1. 配置相关
-
添加规则:
- 参考官方文档:Ingress | Kubernetes
-
签发自定义证书:
bash复制
kubectl create secret tls tls-secret-mobile --cert=mobile.crt --key=mobile.key -n magedu
-
修改 Service 类型:
- 将 Service 从 NodePort 修改为 ClusterIP,并测试。
-
创建 Secret:
- Secret 必须与 Ingress 规则在同一命名空间中。
2. 透传问题
-
配置方法:
-
配置项均添加到 Ingress YAML 文件的
annotations
中。 -
示例:
yaml复制
annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/cors-allow-credentials: "true" nginx.ingress.kubernetes.io/cors-allow-headers: "*" nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS" nginx.ingress.kubernetes.io/cors-allow-origin: "http://www.jd.com" nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true"
-
-
注解说明:
kubernetes.io/ingress.class: "nginx"
:指定使用 Nginx Ingress Controller。nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
:允许跨域请求携带凭证(如 Cookies)。nginx.ingress.kubernetes.io/cors-allow-headers: "*"
:允许所有自定义头。nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
:允许的跨域请求方法。nginx.ingress.kubernetes.io/cors-allow-origin: "http://www.jd.com"
:允许来自指定域名的跨域请求。nginx.ingress.kubernetes.io/enable-cors: "true"
:启用 CORS。nginx.ingress.kubernetes.io/ssl-redirect: "true"
:启用 SSL 重定向,将所有 HTTP 请求重定向到 HTTPS。
微信公众号:运维-波子
关注我:大厂趣事和面试题。
私信我:面试全套资料。