安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml
上面命令中的 YAML 清单是使用 生成的
helm template,因此您最终将获得几乎与使用 Helm 安装控制器相同的资源。
我这边在部署过程中镜像一直拉不下来,更换一下镜像地址。修改deploy.yaml文件。
image: k8s.gcr.io/ingress-nginx/controller:v1.1.0@sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
这三个镜像地址改为:
image: willdockerhub/ingress-nginx-controller:v1.0.0
image: liangjw/kube-webhook-certgen:v1.1.1
image: liangjw/kube-webhook-certgen:v1.1.1
镜像是我在docker.com中找的
https://hub.docker.com/r/willdockerhub/ingress-nginx-controller/tags
https://hub.docker.com/r/liangjw/kube-webhook-certgen/tags
他们同步至 k8s.gcr.io
修改文件中的 kind: Deployment 部分
nodeSelector:
kubernetes.io/os: linux
tolerations:
- operator: "Exists"
nodeSelector:
kubernetes.io/hostname: master
hostNetwork: true
tolerations 因为master节点设置了污点,所以需要该配置 使pod容忍该节点的污点
nodeSelector 节点选择器,设置了master节点的标签。
可以通过
kubectl label node node-1 isIngress="true"给节点设置标签,通过kubectl get nodes --show-labels查看节点所拥有的标签hostNetwork: true 开启 hostnetwork
这里涉及到了几个修改,都不是必要的。tolerations 和 nodeSelector 完全不用配置也可以,hostNetwork 完全可以使用 nodeport 的方式。
这里涉及到了nginx-ingress的部署方式:
ingress的部署
ingress的部署,需要考虑两个方面:
1、ingress-controller是作为pod来运行的,以什么方式部署比较好
2、ingress解决了把如何请求路由到集群内部,那它自己怎么暴露给外部比较好
下面列举一些目前常见的部署和暴露方式,具体使用哪种方式还是得根据实际需求来考虑决定。
Deployment+LoadBalancer模式的Service
如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。
Deployment+NodePort模式的Service
同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。
DaemonSet+HostNetwork+nodeSelector
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。比较适合大并发的生产环境使用。
————————————————
版权声明:本文为CSDN博主「GavinYCF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yucaifu1989/article/details/106898901
修改完后执行apply,并检查服务
看下本地端口
由于配置了hostnetwork,nginx已经在node主机本地监听80/443/8181端口。其中8181是nginx-controller默认配置的一个default backend。这样,只要访问node主机有公网IP,就可以直接映射域名来对外网暴露服务了。如果要nginx高可用的话,可以在多个node上部署,并在前面再搭建一套LVS+keepalive做负载均衡。用hostnetwork的另一个好处是,如果lvs用DR模式的话,是不支持端口映射的,这时候如果用nodeport,暴露非标准的端口,管理起来会很麻烦。
配置ingress资源
我的k8s集群是 v1.21.5 yaml 文件的编写有一些改变,参考 Kubernetes 升级后 ingress api 变化带来的问题
kind: Ingress
metadata:
name: argo-server
namespace: argo
spec:
ingressClassName: nginx
rules:
- host: argo.xiamu.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argo-server
port:
number: 2746
参考文档
k8s ingress原理及ingress-nginx部署测试
https://kubernetes.github.io/ingress-nginx/deploy/
https://kubernetes.io/docs/concepts/services-networking/ingress/
https://github.com/nginxinc/kubernetes-ingress
https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/
