tnblog
首页
视频
资源
登录

Kubernetes 安装nginx ingress

10643人阅读 2022/6/25 18:18 总访问:3475893 评论:0 收藏:2 手机
分类: 容器编排

Kubernetes

Kubernetes 安装nginx ingress

简介


简单来说是ingress增强版。
具体有兴趣可以看陶老师的讲解(我觉得讲得很详细):https://www.bilibili.com/video/BV1r64y1m72f?share_source=copy_web
官网地址:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

环境


k8s版本为1.24。

解决了什么问题呢


对我而言它解决了网络出口的问题。也就是外部网络访问集群内的主机。

安装Ingress


下载ingress-nginx部署文件。

  1. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
  2. # 修改deploy.yaml
  3. vim deploy.yaml


接下来我们修改ingress-nginx的配置。
首先我们不使用内部DNS解析,让端口映射到主机上。

  1. # ingress control下设置
  2. template:
  3. spec:
  4. hostNetwork: true


接着我们在控制器下面设置hostport,如果不设置ingress的pod所在的节点将访问不了。

  1. ports:
  2. - containerPort: 80
  3. name: http
  4. protocol: TCP
  5. hostPort: 80
  6. - containerPort: 443
  7. name: https
  8. protocol: TCP
  9. hostPort: 443


这里我们只想将ingress nginx部署到master节点,把master的80和443端口做映射,所以我们需要先将指定的节点打好标签,然后通过nodeSelector选择我们的节点。

  1. kubectl get node --show-labels
  2. kubectl label node controlplane mynginx=true
  3. kubectl get node --show-labels

  1. nodeSelector:
  2. mynginx: "true"


修改完成后我们开始部署。

  1. kubectl apply -f deploy.yaml

注意:当出现apiversion找不到版本问题的时候需要修改deploy.yaml中对应的版本。可通过kubectl get apiservices.apiregistration.k8s.io命令查看注册的资源。


接下来我们查看nginx ingress创建情况。

  1. kubectl get pods --namespace=ingress-nginx -o wide


我们看到已经启动成功了。接下来创建官网的示范案例。

  1. kubectl create deployment demo --image=httpd --port=80
  2. kubectl expose deployment demo
  3. kubectl create ingress demo-localhost --class=nginx \
  4. --rule="demo.localdev.me/*=demo:80"
  1. # 查看创建情况
  2. kubectl get pod,svc,ingress


然后我们访问我们的主机master,由于我现在的操作就是在主机master上操作的,所以我们可以直接访问本地ip

  1. curl 127.0.0.1


我们发现请求成功了,但处理失败了,是因为我们配置了域名demo.localdev.me,所以我们只需要在/etc/hosts中添加相关域名就可以了。

  1. vim /etc/hosts
  2. 127.0.0.1 demo.localdev.me
  3. # 保存后我们解析一下
  4. nslookup demo.localdev.me

  1. # 再次访问就没问题了
  2. curl demo.localdev.me

DaemonSet 模式


考虑到单点故障问题,我们可以采取多节点的方式进行部署。
首先我们修改deploy.yaml文件中的类型,注释掉部署数量,并去掉我们的mynginx: "true"标签(因为每个节点都有kubernetes.io/os: linux)。

  1. apiVersion: apps/v1
  2. #kind: Deployment
  3. kind: DaemonSet
  1. # replicase:1
  1. # 最后通过命令更新yaml
  2. kubectl apply -f deploy.yaml


然后我们通过以下面命令查看部署与处理情况。

  1. kubectl get daemonsets.apps -A
  2. curl node01


可以看到完全没问题。

配置其他TCP与UPD出口


我们知道Ingress只能通过80端口和443端口做映射,如果我们希望我们的服务从7200端口出去,这时候我们添加指定的tcp和udp支持。首先我们将它支持的tcp与udp的configmap指定到ingress-nginx命名空间下。

  1. # DaemonSet
  2. spec:
  3. template:
  4. spec:
  5. - args:
  6. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
  7. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services


接下来为服务添加7200的出口并命名为idstcp

  1. # ingress-nginx-controller Service
  2. spec:
  3. ports:
  4. - name: idstcp
  5. port: 7200
  6. protocol: TCP
  7. targetPort: 7200


然后我们编辑tcp-services-configmap.yamludp-services-configmap.yaml的配置。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: tcp-services
  5. namespace: ingress-nginx
  6. data:
  7. 7200: "dev/ocelotapi:80"
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: udp-services
  5. namespace: ingress-nginx
  6. data:
  7. 53: "kube-system/kube-dns:53"


我们分别将TCP外部7200端口映射到dev命名空间下的ocelotapi服务的80端口。
下面将外部的UDP协议53端口暴露到kube-system命名空间下的kube-dns服务的53端口。
然后我们通过执行下面的语句来进行更新部署情况。

  1. kubectl apply -f deploy.yaml
  2. kubectl create -f tcp-services-configmap.yaml
  3. kubectl create -f udp-services-configmap.yaml


在部署完成后我们通过下面的命令来进行测试,发现是暴露成功的。

  1. curl http://127.0.0.1:7200/weatherforecast/

其他问题

国内用户拉不了镜像问题


我创建了两个相对应的镜像在dockerhub上

  1. registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1 --> aidasi/ingress-nginx-kube-webhook-certgen:v1.1.1
  2. registry.k8s.io/ingress-nginx/controller:v1.2.1 --> aidasi/ingress-nginx-controller:v1.2.1
  3. registry.k8s.io/ingress-nginx/controller:v1.3.0 --> aidasi/ingress-nginx-controller:v1.3.0
  4. # 所以大家可以修改Deploy中需要拉取的镜像
  5. # 拉取命令如下
  6. docker pull aidasi/ingress-nginx-kube-webhook-certgen:v1.1.1
  7. docker pull aidasi/ingress-nginx-controller:v1.2.1

添加自定义tls证书


首先我们生成我们自定义的证书,当然你自己有就不用生成。我们可以看到有两个证书文件。

  1. openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/CN=world.universe.mine/O=world.universe.mine"


然后我们创建名为ingress-tlsTLS类型的secret资源。

  1. kubectl create secret tls ingress-tls --key cert.key --cert cert.crt -n world

注意命名空间,写到你的ingress下。


然后修改我们相关的ingress程序的tls。

  1. kuberctl edit ing world -n world
  1. spec:
  2. tls:
  3. - hosts:
  4. - world.universe.mine
  5. secretName: ingress-tls


更新完成后,我们再次进行请求相关的应用,发现就是使用的我们自己的证书了。

  1. curl -m1 -kvI https://world.universe.mine:30443/europe 2>&1 | grep subject | grep world.universe.mine

Ingress参数设置


Ingress可以在运行的时候许需要传递什么参数作为Nginx的转发。
举个例子,首先我们运行一个nginx的pod和它的服务:

  1. kubectl create deployment demo --image=httpd --port=80
  2. kubectl expose deployment demo


创建一个demoingress.yaml定义一个demo.com的域名转发到demo服务中。

  1. # 生成证书
  2. openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/CN=demo.com/O=demo.com"
  3. # 创建证书
  4. kubectl create secret tls my-tls-secret \
  5. --cert=cert.crt \
  6. --key=cert.key
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4. name: demo
  5. annotations:
  6. kubernetes.io/ingress.class: nginx
  7. nginx.ingress.kubernetes.io/rewrite-target: /
  8. nginx.ingress.kubernetes.io/proxy-buffer-size: "256k"
  9. nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
  10. nginx.ingress.kubernetes.io/large-client-header-buffers: "4 16k"
  11. nginx.ingress.kubernetes.io/configuration-snippet: |
  12. proxy_busy_buffers_size 256k;
  13. fastcgi_buffers 16 16k;
  14. fastcgi_buffer_size 32k;
  15. spec:
  16. tls:
  17. - hosts:
  18. - demo.com
  19. secretName: my-tls-secret
  20. rules:
  21. - host: "demo.com"
  22. http:
  23. paths:
  24. - path: /
  25. pathType: Prefix
  26. backend:
  27. service:
  28. name: demo
  29. port:
  30. number: 80
  1. kubectl apply -f demoingress.yaml


更多请参考:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#large-client-header-buffers


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

阿里云 Kubernetes

https://help.aliyun.com/document_detail/86759.html 可以有三种计费方式https://ecs-buy.aliyun.com/wizard?spm=5176.13...

Kubernetes Job讲解

kubernetes Job讲解[TOC] 需求来源Job 背景问题我们可以通过Pod来直接运行任务进程吗?这样做将会产生以下几种问题:1. 我...

Kubernetes DaemonSet讲解

Kubernetes DaemonSet讲解[TOC] 需求来源背景问题我们可以让每个集群内的节点都运行一个相同的Pod吗?如果这样做,以下的...

Kubernetes Pod中断预算【PDB】

Kubernetes Pod中断预算【PDB】[TOC] 尽管Deployment或ReplicaSet一类的控制器能够确保相应Pod对象的副本数量不断逼近期...

Kubernetes Velero 备份的运用

Velero 的运用[TOC] Velero简介Velero是一个开源工具,可以安全地备份,恢复和迁移Kubernetes集群和持久卷。它既可以在本...

Kubernetes 应用配置管理

Kubernetes 应用配置管理[TOC] 需求来源背景问题除了依托容器镜像来定义运行的Container,Pod还需要解决如下问题:1. 不可...

Kubernetes 应用存储和持久化数据卷

Kubernetes 应用配置管理[TOC] Volumes介绍Pod Volumes1. 如果一个Pod中某一个容器异常退出,被kubelet拉起如何保证之前的...

Kubernetes 应用存储和持久化数据卷:存储快照与拓扑调度

Kubernetes 应用存储和持久化数据卷:存储快照与拓扑调度[TOC] 基本知识存储快照产生背景1. 如何保证重要数据在误操作之后...

Kubernetes网络(IPVLAN与MACVLAN)

Kubernetes网络模型[TOC] 三种网络模型 在k8s中一般常见的网络模型支持三种,虚拟网桥、多路复用和硬件交换。 虚拟网...

Kubernetes IP Address

Kubernetes IP Address[TOC] IP AddressIP地址是在计算机网络中被用来唯一标识设备的一组数字。IPv4地址由32位二进制数值...

Dapr 官方教程第二章(Hello World Kubernetes)

Dapr 官方教程第二章(Hello World Kubernetes)[TOC] 本教程将帮助您在 Kubernetes 集群中使用 Dapr。您将从Hello World部...

Kubernetes 搭建RabbitMq集群环境

Kubernetes 搭建RabbitMq集群环境[TOC] 由于Kubectl RabbitMQ 插件在官方是基于krew进行安装的所以我们首先需要安装krew插...

Kubernetes 删除命名空间

Kubernetes 删除命名空间[TOC] 可以直接通过如下命令删除k8s中命名空间下的所有资源。kubectl delete ns [namespace] ...

Kubernetes top之安装metrics-server

Kubernetes top之安装metrics-server[TOC] 一般我们需要知道kubernetes的pod与node的cpu与内存使用情况时,我们可以通过ku...

Kubernetes ExternalName Service

Kubernetes ExternalName Service[TOC] ExternalName 的服务与普通服务的区别在于:将服务映射到 DNS 名称。如下图所示: ...

Kubernetes 自定义Endpoint资源

Kubernetes 自定义Endpoint资源[TOC] 当pod需要服务发布出去的时候中间所关联的还有一个Endpoint这个资源,它能确定服务关...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术