Kubernetes 安装nginx ingress 电脑版发表于:2022/6/25 18:18  >#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 ```  tn2>接着我们在控制器下面设置`hostport`,如果不设置ingress的pod所在的节点将访问不了。 ```bash ports: - containerPort: 80 name: http protocol: TCP hostPort: 80 - containerPort: 443 name: https protocol: TCP hostPort: 443 ```  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 ```  ```bash nodeSelector: mynginx: "true" ```  tn2>修改完成后我们开始部署。 ```bash kubectl apply -f deploy.yaml ```  tn>注意:当出现apiversion找不到版本问题的时候需要修改deploy.yaml中对应的版本。可通过`kubectl get apiservices.apiregistration.k8s.io`命令查看注册的资源。  tn2>接下来我们查看nginx ingress创建情况。 ```bash kubectl get pods --namespace=ingress-nginx -o wide ```  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 ```  tn2>然后我们访问我们的主机master,由于我现在的操作就是在主机master上操作的,所以我们可以直接访问本地ip ```bash curl 127.0.0.1 ```  tn2>我们发现请求成功了,但处理失败了,是因为我们配置了域名`demo.localdev.me`,所以我们只需要在`/etc/hosts`中添加相关域名就可以了。 ```bash vim /etc/hosts 127.0.0.1 demo.localdev.me # 保存后我们解析一下 nslookup demo.localdev.me ```  ```bash # 再次访问就没问题了 curl demo.localdev.me ```  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 ```  tn2>然后我们通过以下面命令查看部署与处理情况。 ```bash kubectl get daemonsets.apps -A curl node01 ```  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 ```  tn2>接下来为服务添加7200的出口并命名为`idstcp`。 ```yaml # ingress-nginx-controller Service spec: ports: - name: idstcp port: 7200 protocol: TCP targetPort: 7200 ```  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/ ```  其他问题 ------------ >### 国内用户拉不了镜像问题 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" ```  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 ```  tn2>更新完成后,我们再次进行请求相关的应用,发现就是使用的我们自己的证书了。 ```yaml curl -m1 -kvI https://world.universe.mine:30443/europe 2>&1 | grep subject | grep world.universe.mine ```  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