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
,弹出认证框,输入设置的密码,验证访问。