首页
视频
资源
登录
原
Kubernetes 安装nginx ingress
9128
人阅读
2022/6/25 18:18
总访问:
2616932
评论:
0
收藏:
2
手机
分类:
容器编排
![Kubernetes](https://img.tnblog.net/arcimg/hb/274ef6f115de4c9b8e40ded5deb2f4c2.jpg "Kubernetes") >#Kubernetes 安装nginx ingress [TOC] 简介 ------------ tn2>简单来说是ingress增强版。 具体有兴趣可以看陶老师的讲解(我觉得讲得很详细):https://www.bilibili.com/video/BV1r64y1m72f?share_source=copy_web 官网地址:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/ >### 环境 tn2>k8s版本为1.24。 解决了什么问题呢 ------------ tn2>对我而言它解决了网络出口的问题。也就是外部网络访问集群内的主机。 安装Ingress ------------ tn2>下载ingress-nginx部署文件。 ```bash wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml # 修改deploy.yaml vim deploy.yaml ``` tn2>接下来我们修改ingress-nginx的配置。 首先我们不使用内部DNS解析,让端口映射到主机上。 ```bash # ingress control下设置 template: spec: hostNetwork: true ``` ![](https://img.tnblog.net/arcimg/hb/df524c14f8444e1d9c4bdcf14acea44d.png) tn2>接着我们在控制器下面设置`hostport`,如果不设置ingress的pod所在的节点将访问不了。 ```bash ports: - containerPort: 80 name: http protocol: TCP hostPort: 80 - containerPort: 443 name: https protocol: TCP hostPort: 443 ``` ![](https://img.tnblog.net/arcimg/hb/b19e496c7f6e4ed793f4c6aa7a8f4248.png) tn2>这里我们只想将ingress nginx部署到master节点,把master的80和443端口做映射,所以我们需要先将指定的节点打好标签,然后通过`nodeSelector`选择我们的节点。 ```bash kubectl get node --show-labels kubectl label node controlplane mynginx=true kubectl get node --show-labels ``` ![](https://img.tnblog.net/arcimg/hb/98fee3c25bfd4f0d882c3e36c9512618.png) ```bash nodeSelector: mynginx: "true" ``` ![](https://img.tnblog.net/arcimg/hb/da5eb5d9848843f4a89d8dc28f73c18b.png) tn2>修改完成后我们开始部署。 ```bash kubectl apply -f deploy.yaml ``` ![](https://img.tnblog.net/arcimg/hb/d1a60f6ea9d649ecb6afb80867f67f4c.png) tn>注意:当出现apiversion找不到版本问题的时候需要修改deploy.yaml中对应的版本。可通过`kubectl get apiservices.apiregistration.k8s.io`命令查看注册的资源。 ![](https://img.tnblog.net/arcimg/hb/89df4f55c0f94c79901cb07525c70e7a.png) tn2>接下来我们查看nginx ingress创建情况。 ```bash kubectl get pods --namespace=ingress-nginx -o wide ``` ![](https://img.tnblog.net/arcimg/hb/0a063607916c456da34f1172b24cebfd.png) tn2>我们看到已经启动成功了。接下来创建官网的示范案例。 ```bash kubectl create deployment demo --image=httpd --port=80 kubectl expose deployment demo kubectl create ingress demo-localhost --class=nginx \ --rule="demo.localdev.me/*=demo:80" ``` ```bash # 查看创建情况 kubectl get pod,svc,ingress ``` ![](https://img.tnblog.net/arcimg/hb/5d65d18c90924adab434974a94fbbca1.png) tn2>然后我们访问我们的主机master,由于我现在的操作就是在主机master上操作的,所以我们可以直接访问本地ip ```bash curl 127.0.0.1 ``` ![](https://img.tnblog.net/arcimg/hb/09055e9000a34998965a7984c45a3cfd.png) tn2>我们发现请求成功了,但处理失败了,是因为我们配置了域名`demo.localdev.me`,所以我们只需要在`/etc/hosts`中添加相关域名就可以了。 ```bash vim /etc/hosts 127.0.0.1 demo.localdev.me # 保存后我们解析一下 nslookup demo.localdev.me ``` ![](https://img.tnblog.net/arcimg/hb/09f62ac0dcf6473aa68406f5dbee8f55.png) ```bash # 再次访问就没问题了 curl demo.localdev.me ``` ![](https://img.tnblog.net/arcimg/hb/51433e4f7b3a49e58c41912b1ad8300c.png) DaemonSet 模式 ------------ tn2>考虑到单点故障问题,我们可以采取多节点的方式进行部署。 首先我们修改`deploy.yaml`文件中的类型,注释掉部署数量,并去掉我们的`mynginx: "true"`标签(因为每个节点都有`kubernetes.io/os: linux`)。 ```bash apiVersion: apps/v1 #kind: Deployment kind: DaemonSet ``` ```bash # replicase:1 ``` ```bash # 最后通过命令更新yaml kubectl apply -f deploy.yaml ``` ![](https://img.tnblog.net/arcimg/hb/259f2b9e9ba54849a5643b36d5cb547e.png) tn2>然后我们通过以下面命令查看部署与处理情况。 ```bash kubectl get daemonsets.apps -A curl node01 ``` ![](https://img.tnblog.net/arcimg/hb/e837d42afae14eeb81540d808eea5bad.png) tn2>可以看到完全没问题。 配置其他TCP与UPD出口 ------------ tn2>我们知道Ingress只能通过80端口和443端口做映射,如果我们希望我们的服务从7200端口出去,这时候我们添加指定的tcp和udp支持。首先我们将它支持的tcp与udp的configmap指定到ingress-nginx命名空间下。 ```yaml # DaemonSet spec: template: spec: - args: - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services ``` ![](https://img.tnblog.net/arcimg/hb/df47aedf9d644a669e17fed810906c53.png) tn2>接下来为服务添加7200的出口并命名为`idstcp`。 ```yaml # ingress-nginx-controller Service spec: ports: - name: idstcp port: 7200 protocol: TCP targetPort: 7200 ``` ![](https://img.tnblog.net/arcimg/hb/814da03686f34281b17c85d477911a50.png) tn2>然后我们编辑`tcp-services-configmap.yaml`与`udp-services-configmap.yaml`的配置。 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 7200: "dev/ocelotapi:80" ``` ```yaml apiVersion: v1 kind: ConfigMap metadata: name: udp-services namespace: ingress-nginx data: 53: "kube-system/kube-dns:53" ``` tn2>我们分别将TCP外部7200端口映射到dev命名空间下的ocelotapi服务的80端口。 下面将外部的UDP协议53端口暴露到kube-system命名空间下的kube-dns服务的53端口。 然后我们通过执行下面的语句来进行更新部署情况。 ```yaml kubectl apply -f deploy.yaml kubectl create -f tcp-services-configmap.yaml kubectl create -f udp-services-configmap.yaml ``` tn2>在部署完成后我们通过下面的命令来进行测试,发现是暴露成功的。 ```bash curl http://127.0.0.1:7200/weatherforecast/ ``` ![](https://img.tnblog.net/arcimg/hb/8dc93c585b3848b2b3897f21f3fa4d7c.png) 其他问题 ------------ >### 国内用户拉不了镜像问题 tn2>我创建了两个相对应的镜像在dockerhub上 ```bash registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1 --> aidasi/ingress-nginx-kube-webhook-certgen:v1.1.1 registry.k8s.io/ingress-nginx/controller:v1.2.1 --> aidasi/ingress-nginx-controller:v1.2.1 registry.k8s.io/ingress-nginx/controller:v1.3.0 --> aidasi/ingress-nginx-controller:v1.3.0 # 所以大家可以修改Deploy中需要拉取的镜像 # 拉取命令如下 docker pull aidasi/ingress-nginx-kube-webhook-certgen:v1.1.1 docker pull aidasi/ingress-nginx-controller:v1.2.1 ``` 添加自定义tls证书 ------------ tn2>首先我们生成我们自定义的证书,当然你自己有就不用生成。我们可以看到有两个证书文件。 ```bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/CN=world.universe.mine/O=world.universe.mine" ``` ![](https://img.tnblog.net/arcimg/hb/2d1d3466804841c7991446ba1e24af97.png) tn2>然后我们创建名为`ingress-tls`TLS类型的secret资源。 ```bash kubectl create secret tls ingress-tls --key cert.key --cert cert.crt -n world ``` tn>注意命名空间,写到你的ingress下。 tn2>然后修改我们相关的ingress程序的tls。 ```bash kuberctl edit ing world -n world ``` ```yaml spec: tls: - hosts: - world.universe.mine secretName: ingress-tls ``` ![](https://img.tnblog.net/arcimg/hb/9fe1a6160a394e589a7bd93b6ecb52ec.png) tn2>更新完成后,我们再次进行请求相关的应用,发现就是使用的我们自己的证书了。 ```yaml curl -m1 -kvI https://world.universe.mine:30443/europe 2>&1 | grep subject | grep world.universe.mine ``` ![](https://img.tnblog.net/arcimg/hb/b9e0ea6990a744c18cddc1a4422acbf1.png) Ingress参数设置 ------------ tn2>Ingress可以在运行的时候许需要传递什么参数作为Nginx的转发。 举个例子,首先我们运行一个nginx的pod和它的服务: ```bash kubectl create deployment demo --image=httpd --port=80 kubectl expose deployment demo ``` tn2>创建一个`demoingress.yaml`定义一个`demo.com`的域名转发到demo服务中。 ```bash # 生成证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/CN=demo.com/O=demo.com" # 创建证书 kubectl create secret tls my-tls-secret \ --cert=cert.crt \ --key=cert.key ``` ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" nginx.ingress.kubernetes.io/proxy-buffers-number: "4" nginx.ingress.kubernetes.io/large-client-header-buffers: "4 16k" nginx.ingress.kubernetes.io/configuration-snippet: | proxy_busy_buffers_size 256k; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; spec: tls: - hosts: - demo.com secretName: my-tls-secret rules: - host: "demo.com" http: paths: - path: / pathType: Prefix backend: service: name: demo port: number: 80 ``` ```bash kubectl apply -f demoingress.yaml ``` tn2>更多请参考:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#large-client-header-buffers
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
168篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
Halcon
1篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术