qidao123.com技术社区-IT企服评测·应用市场
标题:
从入门到跑路(六)k8s配置ingress-nginx
[打印本页]
作者:
乌市泽哥
时间:
2025-2-17 08:45
标题:
从入门到跑路(六)k8s配置ingress-nginx
Ingress-NGINX
是一个基于
NGINX
的 Kubernetes Ingress 控制器,旨在将外部 HTTP 和 HTTPS 流量路由到 Kubernetes 集群中的服务。它是 Kubernetes 官方保举的 Ingress 控制器之一,并且广泛应用于各种生产环境中。
Ingress-NGINX先容
主要作用
在 Kubernetes 集群中,
Ingress-NGINX
的作用是作为
Ingress Controller
来处理和管理从外部世界进入集群的 HTTP 和 HTTPS 流量。Ingress 是 Kubernetes 提供的 API 资源,允许你界说如何路由外部流量到集群内部的服务,而 Ingress Controller 是执行这些路由规则的现实组件。Ingress-NGINX 就是其中的一种实现,使用 NGINX 来处理流量。
关键功能
路由外部流量到内部服务
:
Ingress-NGINX 根据界说的
Ingress 资源
,将外部 HTTP/HTTPS 哀求路由到集群内不同的服务。
通过配置规则,你可以实现 URL 路径的路由(如 /app1 -> service1,/app2 -> service2),以及基于域名的路由(如 app.example.com -> service1)。
支持 HTTPS/TLS 加密
:
Ingress-NGINX 支持通过
TLS
(Transport Layer Security)为外部流量提供加密。你可以通过配置证书,轻松启用 HTTPS。
它支持主动证书管理,通常与
Cert-Manager
一起使用来主动化证书的签发和续期。
负载均衡
:
Ingress-NGINX 提供了负载均衡功能,可以根据负载均衡算法(如轮询、IP 哈希等)将哀求分发到不同的后端服务。
作为反向代理,它也可以基于哀求的不同特征(如 URL、域名等)将流量路由到不同的服务。
路径重写和转发
:
Ingress-NGINX 可以根据界说的路由规则举行路径重写,例如将 /api/v1 转发到 /v2。
支持哀求头的修改和转发,加强机动性。
访问控制与身份验证
:
Ingress-NGINX 支持通过配置根本的 HTTP 认证、OAuth2 等方式来举行身份验证。
还可以配置 IP 白名单/黑名单,限定哪些 IP 或者网络可以访问集群中的应用。
自界说 NGINX 配置
:
可以通过
ConfigMap
或
注解
自界说 NGINX 的配置,好比启用/禁用某些功能,调解超时、连接数等。
也支持对特定 Ingress 资源举行配置,好比设置负载均衡的算法、启用 SSL 等。
监控与日记
:
Ingress-NGINX 集成了
Prometheus
等监控系统,提供具体的流量、错误率、响应时间等指标。
它也可以输出 NGINX 访问日记和错误日记,便于故障排查。
高可用性与容错
:
Ingress-NGINX 作为一种控制器,可以部署为多个副本以实现高可用性。
它还支持集群内的故障恢复和流量分发。
工作原理
Ingress 资源
:在 Kubernetes 中,开发者通过创建
Ingress 资源
来界说 HTTP/HTTPS 路由规则。Ingress 资源包含域名、路径和服务之间的映射。
示例 Ingress 资源配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
复制代码
Ingress Controller
:Ingress-NGINX 是
Ingress Controller
的实现,它监视 Kubernetes API Server 中的 Ingress 资源。每当有新的 Ingress 资源创建或更新时,Ingress-NGINX 会动态更新 NGINX 配置,确保流量按照最新的路由规则被正确转发。
NGINX 配置
:Ingress-NGINX 控制器运行着 NGINX 实例,NGINX 根据动态配置文件对流量举行路由和负载均衡。当外部用户哀求到达集群时,NGINX 会根据路由规则将流量转发到 Kubernetes 服务。
部署 Ingress-NGINX 控制器
通用部署方式
在 Kubernetes 集群中部署 Ingress-NGINX 通常有以下几种方式:
1、使用 Helm 部署
: Helm 是 Kubernetes 的包管理工具,你可以通过 Helm Chart 来快速安装 Ingress-NGINX。
helm install ingress-nginx ingress-nginx/ingress-nginx
复制代码
2、
使用 kubectl 部署
: 你也可以通过 kubectl 从官方提供的清单文件直接安装。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
复制代码
具体部署这两种方式都有问题:
Helm 部署在拉取镜像registry.k8s.io/ingress-nginx/controller:v1.11.3时,每次都需要访问网络,即使你指定镜像拉取策略,如果本地镜像存在,则访问网络的策略只是验证,但是如果没法验证,他是没法使用的。docker是没有这个问题的,这应该是containerd独有的。
kubectl 部署部署文件用的v1.12.0-beta.0 ,大概有些问题,有些权限不能正确生成,原因未知。
因此修改了helm的镜像拉取,让其使用私有仓库,下面是步骤。
本次部署
1、首先安装helm
2、根据
修改所有工作节点的/etc/containerd/config.toml,IP:port是私有仓库的所在,http和https均可。
注,registry.k8s.io的阿里云镜像站点,这里使用不成功,原因位置。
# 修改所有工作节点的/etc/containerd/config.toml,增加粗体部分,指定地址和http访问并重启containerd
sudo vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://hub-mirror.c.163.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."IP:PORT"]
endpoint = ["http://IP:PORT"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://mirrors.aliyun.com/google-containers"]
sudo systemctl restart containerd
复制代码
用户名、暗码、IP以及端口号请根据本身的私有仓库修改,如果直接输入到shell不管用,发起写入到bash文件,然后执行该文件。
kubectl create secret docker-registry cnn.io
--docker-server=IP:port
--docker-username="用户名"
--docker-password="密码"
--docker-email="dockeruser01@example.com"
-n ingress-nginx
复制代码
3、部署
给特哈勃 访问不了的需要屈曲上网,固然镜像拉取也需要屈曲,不会屈曲上网怎么办,云厂商不是有全球地区的服务器吗,恣意一个地区的就行。
由于推送到镜像到私有仓库过程中,sha256值会变化,因此需要先查看该镜像在私有仓库的sha26值,让后通报给helm。
#拉取部署文件
curl -LO https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.11.3/ingress-nginx-4.11.3.tgz
#部署命令
helm install nginx-ingress ingress-nginx-4.11.3.tgz
复制代码
–namespace ingress-nginx
–create-namespace
–set controller.image.repository=IP:port/ingress-nginx/controller
–set controller.image.tag=v1.11.3
–set controller.image.digest=“sha256:值”
–set controller.image.pullSecrets[0].name=cnn.io
#由于hlem不能认识pullSecrets,因此需要手动更新拉取镜像的凭据
kubectl patch deployment nginx-ingress-ingress-nginx-controller -n ingress-nginx
复制代码
-p ‘{“spec”:{“template”:{“spec”:{“imagePullSecrets”:[{“name”:“cnn.io”}]}}}}’
#删除pod,让其重建
kubectl delete pod -n ingress-nginx -l app.kubernetes.io/component=controller
4、私有云需要调解
LoadBalancer
为nodePort
#查看现有情况
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-ingress-nginx-controller LoadBalancer 10.150.225.38 <pending> 80:30692/TCP,443:31509/TCP 47s
nginx-ingress-ingress-nginx-controller-admission ClusterIP 10.150.226.63 <none> 443/TCP 47s
#输出对应的svc配置文件
kubectl get svc nginx-ingress-ingress-nginx-controller -n ingress-nginx -o yaml > ingress-controller-svc.yaml
#修改ingress-controller-svc.yaml
vim ingress-controller-svc.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress
meta.helm.sh/release-namespace: ingress-nginx
creationTimestamp: "2024-12-24T09:21:47Z"
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.11.3
helm.sh/chart: ingress-nginx-4.11.3
name: nginx-ingress-ingress-nginx-controller
namespace: ingress-nginx
resourceVersion: "48422052"
uid: 6497af5d-f370-47ff-ad68-82d2aa114b05
spec:
# 移除 allocateLoadBalancerNodePorts
clusterIP: 10.150.225.38
clusterIPs:
- 10.150.225.38
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- appProtocol: http
name: http
nodePort: 30080 # 指定 NodePort
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
nodePort: 30443 # 指定 NodePort
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress
app.kubernetes.io/name: ingress-nginx
sessionAffinity: None
type: NodePort # 修改服务类型为 NodePort
status:
loadBalancer: {}
复制代码
然后重新应用改文件即可
#重新应用
kubectl apply -f ingress-controller-svc.yaml
#验证
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-ingress-nginx-controller NodePort 10.150.225.38 <none> 80:30080/TCP,443:30443/TCP 17m
nginx-ingress-ingress-nginx-controller-admission ClusterIP 10.150.226.63 <none> 443/TCP 17m
复制代码
5、从路由器/堡垒机/防火墙等装备配置端口转发,80转发到30080,443转发到30433
使用
准备好网站的ssl证书,创建secret
kubectl create secret tls web1-tls-secret
复制代码
–cert=xxxxxxx.com.pem
–key=xxxxxxx.com.key
-n YYY
准备web1-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web1-ingress
namespace: YYY
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx # 使用 ingressClassName
rules:
- host: testk8s.xxxxx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web1
port:
number: 9998 # 修改为服务的内部端口,不是nodePort端口
tls:
- hosts:
- testk8s.xxxxx.com
secretName: web1-tls-secret
kubectl apply -f web1-ingress.yaml
kubectl get ingress web1-ingress -n YYY
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4