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

k8s服务发布进阶

目录

一、基本概念

1.Ingress 组成

2. Ingress 工作过程

3. Ingress 工作原理

二、安装 Ingress Nginx Controller

1.下载并安装helm

2. 下载并修改 Ingress Controller 参数

3. 部署 Ingress Nginx Controller

三、 Ingress Nginx 使用入门

1. 创建学习命名空间

2. 部署 Nginx 服务

3. 暴露为 Service

4. 编写 Ingress 配置

5.  应用配置

6.  测试

四、 域名重定向

1. 编写 redirect.yaml

2. 应用与测试

五、前后端分离

1.  部署后端服务

2. 编写 rewrite.yaml

3. 应用与测试

六、 SSL 配置(自签名证书)

1.生成证书

2.创建证书 Secret

3. 编写 HTTPS Ingress

4. 应用与测试

七、Ingress Nginx 实现基本认证

1. 安装 httpd

2. 创建用户密码文件

3. 生成认证 Secret

4. 编写 Ingress 配置

5. 部署认证 Ingress

6. 测试


一、基本概念

1.Ingress 组成

(1) ingress

Ingress 是 Kubernetes 中的一个 API 对象,主要功能是管理从集群外部到集群服务的 HTTP/HTTPS 路由。它能够依据设定的规则,把外部的流量精准转发到集群内部对应的服务上。通过 Ingress,用户可以配置基于域名和路径的路由规则,实现如基于名称的虚拟主机、SSL 终止、HTTP 重定向等功能。Ingress 本身并不直接处理流量,而是需要 Ingress Controller 来具体实现其定义的路由规则。

(2) ingree-controller

Ingress-controller 是实现 Ingress 功能的关键控制器,必须部署在 Kubernetes 集群里。它会时刻监听 Ingress 资源的变化,以及后端 Service 和 Pod 的状态变化,然后按照 Ingress 中设定的规则来配置负载均衡器(如 Nginx、Traefik 等),从而实现流量的转发。Ingress-controller 是 Ingress 的 “执行者”,没有它,Ingress 中定义的路由规则只是一些静态的配置,无法真正发挥作用。Ingress 和 Ingress-controller 相辅相成,Ingress 定义了路由规则的 “蓝图”,而 Ingress-controller 则负责将这个 “蓝图” 付诸实践,确保外部流量能够按照预期的规则流转到集群内部的服务。

2. Ingress 工作过程

首先,用户通过 Kubernetes API 创建 Ingress 资源,在其中定义了从外部到集群服务的路由规则,比如基于域名、路径等的转发规则。然后,部署在集群中的 Ingress-controller 会持续监听 Ingress 资源的变化,当检测到新的 Ingress 资源创建或者已有 Ingress 资源更新时,Ingress-controller 会读取其中的路由规则。接着,Ingress-controller 根据这些规则配置对应的负载均衡器(如 Nginx 配置文件),同时它也会监听后端 Service 和 Pod 的状态,确保所配置的路由能够指向可用的服务端点。当外部流量(如用户的 HTTP/HTTPS 请求)到达集群边缘时,会被负载均衡器接收,负载均衡器再根据 Ingress-controller 配置的规则,将流量转发到集群内部对应的 Service,进而由 Service 转发到后端的 Pod 上,完成一次请求的处理。

3. Ingress 工作原理

Ingress 的核心工作原理是通过 Ingress 资源定义路由规则,由 Ingress-controller 负责将这些规则转化为实际的流量转发配置,并作用于负载均衡器。从本质上来说,Ingress 是一种声明式的配置,它抽象了集群外部访问集群服务的方式,而 Ingress-controller 则是这种抽象的具体实现者。Ingress-controller 通常会以 Pod 的形式运行在集群中,它通过 Kubernetes 的 API 与集群进行交互,实时获取 Ingress、Service、Pod 等资源的状态信息。当 Ingress 资源中定义的路由规则涉及到域名时,Ingress-controller 会确保外部的 DNS 解析能够将该域名指向负载均衡器的入口地址。当外部流量进入负载均衡器后,负载均衡器就会依据 Ingress-controller 配置的规则(这些规则来自于 Ingress 资源的定义),结合请求的域名、路径等信息,将流量转发到对应的 Service。由于 Service 会通过选择器与后端的 Pod 关联,所以流量最终会到达提供相应服务的 Pod。整个过程中,Ingress-controller 持续监控各种资源的变化,一旦有更新,就会重新配置负载均衡器,以保证路由规则的实时有效性和服务的可用性。

二、安装 Ingress Nginx Controller

1.下载并安装helm

# 下载 Helm 安装包(以 v3.9.4 为例,可替换为最新版本)  
[root@k8s-master ~]# wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz  # 解压安装包  
[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz  # 移动 helm 可执行文件到系统路径(确保可全局调用)  
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/  # 验证安装(显示版本即成功)  
[root@k8s-master ~]# helm version  

2. 下载并修改 Ingress Controller 参数

(1) 将Controller 的registry 仓库地址修改为国内的

controller:  name: controller  image:  chroot: false  registry: registry.cn-hangzhou.aliyuncs.com  image: tanzu/controller  tag: "v1.6.4"   #digest: sha256:15be4666c53052484dd2992efacf2f50ea77a78ae8aa21ccd91af6baaa7ea2f  #digestChroot: sha256:0de01e2c316c3ca7847ca13b32d077af7910d07f21a4a82f81061839764f8f1  

(2) 修改 opentelemetry 镜像地址

opentelemetry:  enabled: false  # 国内仓库地址  image: registry.cn-hangzhou.aliyuncs.com/tanzu/opentelemetry:v20230107  containerSecurityContext:  allowPrivilegeEscalation: false  

(3) 将 admissionWebhook 的地址修改为国内的

patchWebhookJob:  securityContext:  allowPrivilegeEscalation: false  resources: {}  patch:  enabled: true  image:  # 国内仓库地址  registry: registry.cn-hangzhou.aliyuncs.com  image: tanzu/kube-webhook-certgen  tag: v20220916-gd32f8c343  # 注释摘要信息  #digest: sha256:543c40f0d93964bc5ab59d93e791f9989963021f1e9e4c9c7b6700b02bfb227b  pullPolicy: IfNotPresent  

(4) 修改 HostNetwork 的值为 true

设置为 true 后,Pod 直接使用宿主机网络命名空间,适合需要绑定宿主机端口(如 80/443 )的场景

controller:  hostNetwork: true  

(5) dnspolicy 设置为 ClusterFirsWitHostNet

与 hostNetwork: true 配合,优先用集群 DNS 解析,集群 DNS 无法解析时 fallback 到宿主机 DNS:

controller:  dnsPolicy: ClusterFirstWithHostNet  

(6) nodeSelector 添加 Ingress:“true”

让 Ingress Controller 仅调度到带有 ingress: "true" 标签的节点(需提前给 k8s-node01 打标签:kubectl label node k8s-node01 ingress=true ):

controller:  nodeSelector:  ingress: true  kubernetes.io/os: linux  

(7) 修改 kind 类型为 DeamonSet

DaemonSet 确保每个符合条件的节点(通过 nodeSelector 筛选)都运行一个 Ingress Controller Pod,适合需要节点级流量接入的场景:

controller:  kind: DaemonSet  

3. 部署 Ingress Nginx Controller

(1)给目标节点打标签

kubectl label node k8s-node01 ingress=true  

(2)创建命名空间

kubectl create ns ingress-nginx  

(3)安装 Ingress Nginx

cd ingress-nginx  
helm install ingress-nginx -n ingress-nginx .  

(4)验证安装

kubectl get po -n ingress-nginx -o wide  

三、 Ingress Nginx 使用入门

1. 创建学习命名空间

kubectl create ns study-ingress  

2. 部署 Nginx 服务

kubectl create deployment nginx --image=nginx:1.7.9 -n study-ingress  

3. 暴露为 Service

kubectl expose deployment nginx --port 80 -n study-ingress  

4. 编写 Ingress 配置

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: nginx-ingress  namespace: study-ingress  
spec:  ingressClassName: nginx  rules:  - host: nginx.test.com  http:  paths:  - backend:  service:  name: nginx  port: {number: 80}  path: /  pathType: ImplementationSpecific  

5.  应用配置

kubectl create -f web-ingress.yaml  

6.  测试

curl http://nginx.test.com  

四、 域名重定向

1. 编写 redirect.yaml

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: nginx-redirect  namespace: study-ingress  annotations:  nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com  
spec:  ingressClassName: nginx  rules:  - host: nginx.redirect.com  http:  paths:  - backend:  service: {name: nginx, port: {number: 80}}  path: /  pathType: ImplementationSpecific  

2. 应用与测试

kubectl create -f redirect.yaml  
# 本地 hosts 绑定 nginx.redirect.com 后访问测试  

五、前后端分离

1.  部署后端服务

kubectl create deployment backend-api --image=nginx:1.7.9 -n study-ingress  
kubectl expose deployment backend-api --port 80 -n study-ingress  

2. 编写 rewrite.yaml

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: backend-api  namespace: study-ingress  annotations:  nginx.ingress.kubernetes.io/rewrite-target: /$2  
spec:  ingressClassName: nginx  rules:  - host: nginx.test.com  http:  paths:  - backend:  service: {name: backend-api, port: {number: 80}}  path: /api-a(/|$)(.*)  pathType: ImplementationSpecific  

3. 应用与测试

kubectl create -f rewrite.yaml  
curl http://nginx.test.com/api-a  

六、 SSL 配置(自签名证书)

1.生成证书

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.test.com"  

2.创建证书 Secret

kubectl create secret tls nginx-tls --key tls.key --cert tls.crt -n study-ingress  

3. 编写 HTTPS Ingress

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: nginx-tls-ingress  namespace: study-ingress  
spec:  ingressClassName: nginx  tls:  - hosts: [nginx.test.com]  secretName: nginx-tls  rules:  - host: nginx.test.com  http:  paths:  - backend: {service: {name: nginx, port: {number: 80}}}  path: /  pathType: ImplementationSpecific  

4. 应用与测试

kubectl apply -f tls-ingress.yaml  
curl -k https://nginx.test.com  # -k 忽略证书校验  

七、Ingress Nginx 实现基本认证

1. 安装 httpd

yum -y install httpd  

2. 创建用户密码文件

htpasswd -c auth zhangsan  
# 按提示输入密码,生成 `auth` 文件  

3. 生成认证 Secret

kubectl create secret generic basic-auth \  
--from-file=auth \  
-n study-ingress  

4. 编写 Ingress 配置

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: ingress-with-auth  namespace: study-ingress  annotations:  nginx.ingress.kubernetes.io/auth-realm: "Please Input Your Username and Password"  nginx.ingress.kubernetes.io/auth-secret: basic-auth  nginx.ingress.kubernetes.io/auth-type: basic  
spec:  ingressClassName: nginx  rules:  - host: auth.test.com  http:  paths:  - backend:  service:  name: nginx  port: {number: 80}  path: /  pathType: ImplementationSpecific  

5. 部署认证 Ingress

kubectl create -f ingress-with-auth.yaml  

6. 测试

访问 http://auth.test.com,弹出认证框,输入设置的密码,验证访问。

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

相关文章:

  • k8s-高级调度(一)
  • k8s深度讲解:无限的扩展性 - CRD 与 Operator
  • Rust 变量遮蔽(Variable Shadowing)
  • Rust与UE5高效集成实战
  • 湖南群狼市场调查——专注汽车销售服务深度评测
  • 如何快速学习GO语言
  • ajax和XMLHttpRequest以及fetch
  • Rust基础-part2-变量和可变类型
  • C#中的设计模式:构建更加优雅的代码
  • 学弟让我帮忙写一个学生管理系统的后端,我直接上科技
  • 数据结构 之 【链式二叉树】(C语言实现二叉树的前序中序后序层序遍历,节点个数、树的高度、第K层的节点个数、查找、完全二叉树的判别、销毁创建二叉树)
  • 操作系统-进程
  • 加工进化论:SPL 一键加速日志转指标
  • 适配多场景,工业显示器让操作更高效
  • 2025最新版Docker讲解/面试/命令/容器化技术
  • 当信任上链解码区块链溯源系统开发逻辑与产业变革
  • 【第四节】ubuntu server安装docker
  • 专题:2025云计算与AI技术研究趋势报告|附200+份报告PDF、原数据表汇总下载
  • 探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
  • VLM-R1 + GRPO 算法完整复现全过程日志
  • 在HTML中CSS三种使用方式
  • 飞算JavaAI:重塑Java开发的“人机协同“新模式
  • vue3+node.js+mysql写接口(二)
  • 优学教育实战03跟进管理
  • tensor
  • axios 与 fetch 的区别
  • C++前缀和与差分的深度探索
  • “SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用
  • K8s Service 终极解析:源码、性能、故障排查全攻略
  • 【VScode | 快捷键】全局搜索快捷键(ctrl+shift+f)失效原因及解决方法