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 控制器

通用部署方式

在 Kubernetes 集群中部署 Ingress-NGINX 通常有以下几种方式:
1、使用 Helm 部署: Helm 是 Kubernetes 的包管理工具,你可以通过 Helm Chart 来快速安装 Ingress-NGINX。
  1. helm install ingress-nginx ingress-nginx/ingress-nginx
复制代码
2、使用 kubectl 部署: 你也可以通过 kubectl 从官方提供的清单文件直接安装。
  1. 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的阿里云镜像站点,这里使用不成功,原因位置。
  1. # 修改所有工作节点的/etc/containerd/config.toml,增加粗体部分,指定地址和http访问并重启containerd
  2. sudo vim /etc/containerd/config.toml
  3.       [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  4.          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  5.             endpoint = ["https://hub-mirror.c.163.com"]            
  6.          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."IP:PORT"]
  7.             endpoint = ["http://IP:PORT"]
  8.          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
  9.             endpoint = ["https://mirrors.aliyun.com/google-containers"]
  10. sudo systemctl restart containerd
复制代码
用户名、暗码、IP以及端口号请根据本身的私有仓库修改,如果直接输入到shell不管用,发起写入到bash文件,然后执行该文件。
  1. kubectl create  secret docker-registry cnn.io
  2.       --docker-server=IP:port
  3.         --docker-username="用户名"
  4.           --docker-password="密码"
  5.             --docker-email="dockeruser01@example.com"
  6.            -n ingress-nginx
复制代码
3、部署
给特哈勃 访问不了的需要屈曲上网,固然镜像拉取也需要屈曲,不会屈曲上网怎么办,云厂商不是有全球地区的服务器吗,恣意一个地区的就行。
由于推送到镜像到私有仓库过程中,sha256值会变化,因此需要先查看该镜像在私有仓库的sha26值,让后通报给helm。
  1. #拉取部署文件
  2. curl -LO https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.11.3/ingress-nginx-4.11.3.tgz
  3. #部署命令
  4. 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
  1. #由于hlem不能认识pullSecrets,因此需要手动更新拉取镜像的凭据
  2. 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
  1. #查看现有情况
  2. kubectl get svc -n ingress-nginx
  3. NAME                                               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
  4. nginx-ingress-ingress-nginx-controller             LoadBalancer   10.150.225.38   <pending>     80:30692/TCP,443:31509/TCP   47s
  5. nginx-ingress-ingress-nginx-controller-admission   ClusterIP      10.150.226.63   <none>        443/TCP                      47s
  6. #输出对应的svc配置文件
  7. kubectl get svc nginx-ingress-ingress-nginx-controller -n ingress-nginx -o yaml > ingress-controller-svc.yaml
  8. #修改ingress-controller-svc.yaml
  9. vim ingress-controller-svc.yaml
  10. apiVersion: v1
  11. kind: Service
  12. metadata:
  13.   annotations:
  14.     meta.helm.sh/release-name: nginx-ingress
  15.     meta.helm.sh/release-namespace: ingress-nginx
  16.   creationTimestamp: "2024-12-24T09:21:47Z"
  17.   labels:
  18.     app.kubernetes.io/component: controller
  19.     app.kubernetes.io/instance: nginx-ingress
  20.     app.kubernetes.io/managed-by: Helm
  21.     app.kubernetes.io/name: ingress-nginx
  22.     app.kubernetes.io/part-of: ingress-nginx
  23.     app.kubernetes.io/version: 1.11.3
  24.     helm.sh/chart: ingress-nginx-4.11.3
  25.   name: nginx-ingress-ingress-nginx-controller
  26.   namespace: ingress-nginx
  27.   resourceVersion: "48422052"
  28.   uid: 6497af5d-f370-47ff-ad68-82d2aa114b05
  29. spec:
  30.   # 移除 allocateLoadBalancerNodePorts
  31.   clusterIP: 10.150.225.38
  32.   clusterIPs:
  33.     - 10.150.225.38
  34.   externalTrafficPolicy: Cluster
  35.   internalTrafficPolicy: Cluster
  36.   ipFamilies:
  37.     - IPv4
  38.   ipFamilyPolicy: SingleStack
  39.   ports:
  40.     - appProtocol: http
  41.       name: http
  42.       nodePort: 30080  # 指定 NodePort
  43.       port: 80
  44.       protocol: TCP
  45.       targetPort: http
  46.     - appProtocol: https
  47.       name: https
  48.       nodePort: 30443 # 指定 NodePort
  49.       port: 443
  50.       protocol: TCP
  51.       targetPort: https
  52.   selector:
  53.     app.kubernetes.io/component: controller
  54.     app.kubernetes.io/instance: nginx-ingress
  55.     app.kubernetes.io/name: ingress-nginx
  56.   sessionAffinity: None
  57.   type: NodePort  # 修改服务类型为 NodePort
  58. status:
  59.   loadBalancer: {}
复制代码
然后重新应用改文件即可
  1. #重新应用
  2. kubectl apply -f ingress-controller-svc.yaml
  3. #验证
  4. kubectl get svc -n ingress-nginx
  5. NAME                                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
  6. nginx-ingress-ingress-nginx-controller             NodePort    10.150.225.38   <none>        80:30080/TCP,443:30443/TCP   17m
  7. nginx-ingress-ingress-nginx-controller-admission   ClusterIP   10.150.226.63   <none>        443/TCP                      17m
复制代码
5、从路由器/堡垒机/防火墙等装备配置端口转发,80转发到30080,443转发到30433
使用

准备好网站的ssl证书,创建secret
  1. kubectl create secret tls web1-tls-secret
复制代码
–cert=xxxxxxx.com.pem
–key=xxxxxxx.com.key
-n YYY
准备web1-ingress.yaml
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: web1-ingress
  5.   namespace: YYY
  6.   annotations:
  7.     nginx.ingress.kubernetes.io/rewrite-target: /
  8.     nginx.ingress.kubernetes.io/ssl-redirect: "true"
  9. spec:
  10.   ingressClassName: nginx  # 使用 ingressClassName
  11.   rules:
  12.     - host: testk8s.xxxxx.com
  13.       http:
  14.         paths:
  15.           - path: /
  16.             pathType: Prefix
  17.             backend:
  18.               service:
  19.                 name: web1
  20.                 port:
  21.                   number: 9998  # 修改为服务的内部端口,不是nodePort端口
  22.   tls:
  23.     - hosts:
  24.         - testk8s.xxxxx.com
  25.       secretName: web1-tls-secret
  26. kubectl apply -f web1-ingress.yaml
  27. kubectl get ingress web1-ingress -n YYY
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4