
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部署文件。
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
# 修改deploy.yaml
vim deploy.yaml
接下来我们修改ingress-nginx的配置。
首先我们不使用内部DNS解析,让端口映射到主机上。
# ingress control下设置
template:
spec:
hostNetwork: true
接着我们在控制器下面设置hostport
,如果不设置ingress的pod所在的节点将访问不了。
ports:
- containerPort: 80
name: http
protocol: TCP
hostPort: 80
- containerPort: 443
name: https
protocol: TCP
hostPort: 443
这里我们只想将ingress nginx部署到master节点,把master的80和443端口做映射,所以我们需要先将指定的节点打好标签,然后通过nodeSelector
选择我们的节点。
kubectl get node --show-labels
kubectl label node controlplane mynginx=true
kubectl get node --show-labels
nodeSelector:
mynginx: "true"
修改完成后我们开始部署。
kubectl apply -f deploy.yaml
注意:当出现apiversion找不到版本问题的时候需要修改deploy.yaml中对应的版本。可通过kubectl get apiservices.apiregistration.k8s.io
命令查看注册的资源。
接下来我们查看nginx ingress创建情况。
kubectl get pods --namespace=ingress-nginx -o wide
我们看到已经启动成功了。接下来创建官网的示范案例。
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"
# 查看创建情况
kubectl get pod,svc,ingress
然后我们访问我们的主机master,由于我现在的操作就是在主机master上操作的,所以我们可以直接访问本地ip
curl 127.0.0.1
我们发现请求成功了,但处理失败了,是因为我们配置了域名demo.localdev.me
,所以我们只需要在/etc/hosts
中添加相关域名就可以了。
vim /etc/hosts
127.0.0.1 demo.localdev.me
# 保存后我们解析一下
nslookup demo.localdev.me
# 再次访问就没问题了
curl demo.localdev.me
DaemonSet 模式
考虑到单点故障问题,我们可以采取多节点的方式进行部署。
首先我们修改deploy.yaml
文件中的类型,注释掉部署数量,并去掉我们的mynginx: "true"
标签(因为每个节点都有kubernetes.io/os: linux
)。
apiVersion: apps/v1
#kind: Deployment
kind: DaemonSet
# replicase:1
# 最后通过命令更新yaml
kubectl apply -f deploy.yaml
然后我们通过以下面命令查看部署与处理情况。
kubectl get daemonsets.apps -A
curl node01
可以看到完全没问题。
配置其他TCP与UPD出口
我们知道Ingress只能通过80端口和443端口做映射,如果我们希望我们的服务从7200端口出去,这时候我们添加指定的tcp和udp支持。首先我们将它支持的tcp与udp的configmap指定到ingress-nginx命名空间下。
# DaemonSet
spec:
template:
spec:
- args:
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
接下来为服务添加7200的出口并命名为idstcp
。
# ingress-nginx-controller Service
spec:
ports:
- name: idstcp
port: 7200
protocol: TCP
targetPort: 7200
然后我们编辑tcp-services-configmap.yaml
与udp-services-configmap.yaml
的配置。
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
7200: "dev/ocelotapi:80"
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
data:
53: "kube-system/kube-dns:53"
我们分别将TCP外部7200端口映射到dev命名空间下的ocelotapi服务的80端口。
下面将外部的UDP协议53端口暴露到kube-system命名空间下的kube-dns服务的53端口。
然后我们通过执行下面的语句来进行更新部署情况。
kubectl apply -f deploy.yaml
kubectl create -f tcp-services-configmap.yaml
kubectl create -f udp-services-configmap.yaml
在部署完成后我们通过下面的命令来进行测试,发现是暴露成功的。
curl http://127.0.0.1:7200/weatherforecast/
其他问题
国内用户拉不了镜像问题
我创建了两个相对应的镜像在dockerhub上
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证书
首先我们生成我们自定义的证书,当然你自己有就不用生成。我们可以看到有两个证书文件。
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-tls
TLS类型的secret资源。
kubectl create secret tls ingress-tls --key cert.key --cert cert.crt -n world
注意命名空间,写到你的ingress下。
然后修改我们相关的ingress程序的tls。
kuberctl edit ing world -n world
spec:
tls:
- hosts:
- world.universe.mine
secretName: ingress-tls
更新完成后,我们再次进行请求相关的应用,发现就是使用的我们自己的证书了。
curl -m1 -kvI https://world.universe.mine:30443/europe 2>&1 | grep subject | grep world.universe.mine
Ingress参数设置
Ingress可以在运行的时候许需要传递什么参数作为Nginx的转发。
举个例子,首先我们运行一个nginx的pod和它的服务:
kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
创建一个demoingress.yaml
定义一个demo.com
的域名转发到demo服务中。
# 生成证书
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
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
kubectl apply -f demoingress.yaml
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

