微服务架构下,一台服务器可能运行了多个服务,如果要在宿主机上对外开放这些端口,那么多个服务就会存在端口冲突,只能对不同服务采用不同的端口。
Kubernetes的Ingress就是为了解决端口抢占和适配用户应用的调度而生的,本质上它就是一个反向代理,但是相比自己用nginx架设一台反向代理,Ingress将配置自动化了

Kubernetes没有内置Ingress控制器,需要用户自己安装,列如安装Nginx Ingress,坑主要就出目前控制器的安装配置上,对新人来说本就对Ingress不了解,迫切希望通过简单的安装配置来体验和学习什么是Ingress,但是结果是问题不断,超级不顺利,以下是我学习过程中遇到的问题:
1. 没有监听主机IP和端口问题
官网给出的安装Ingress Nginx Controller的命令很简洁,如下:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml
没有任何别的说明。但是这个配置默认监听的是集群内部的私有网段,例如10.96.0.0网段,没有监听服务器的IP(假设服务器IP是192.168.1.9)和端口(80、443)

所以即便后续Ingress配置都正确,Ingress也达不到预期的效果,用浏览器访问http://192.168.1.9/页面无法显示。
解决办法就是为name: ingress-nginx-controller的spec.template.spec增加属性hostNetwork: true后重新安装,如下图

2. 控制器随机调度到某一台服务器问题
按上述配置,Ingress Nginx Controller是通过Deployment方式部署的,且replicas默认值是1,这样Ingress Nginx Controller只会被调度到某一个Kubernetes节点,如果集群有3个worker节点,那结果就是只有通过其中一台的IP才能访问透过Ingress发布的WEB服务。
解决办法:
1) 修改replicas属性为3,但未来如果再增加节点,还要再修改replicas属性,不方便。
2) 改为DaemonSet方式,即将kind属性值修改为DaemonSet,nodeSelector值修改为
node-role.kubernetes.io/worker: ‘true’即可,控制器将调度到所有带有标签
node-role.kubernetes.io/worker=true的节点,所有通过节点的IP都能访问透过Ingress开放的服务。
3. 镜像仓库问题
这个问题本来不是问题,但是国内的网络由于众所周知的缘由,涉及的两个镜像都拉取不下来,所以必须修改镜像仓库为国内的(共有3处,改为以下URL)
registry. aliyuncs.com/google_containers/nginx-ingress-controller:v1.6.4
registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20220916-gd32f8c343
然后就能顺利拉取镜像了


















暂无评论内容