kubernetes(1.21.1)学习之二helm安装nginx-ingress-controller

  |   0 评论   |   0 浏览

外部要访问k8s的内网服务,有两种方式,一是服务直接暴露物理机的端口到公网,通过端口映射访问服务,二是通过像ingress这种代理来访问k8s内部服务,这里既然要做k8s集群,那么还是选择更加科学的ingress方式来访问内部服务。ingress controller的实现有很多,常见的AKS Application Gateway, Ambassador API Gateway, AppsCode Inc, AWS ALB Ingress Controller, Contour, Istio,Nginx,最常用的就是nginx,这里就通过helm安装ingress-nginx。

一、安装Helm

  Helm是非常方便的k8s包管理器,被当做神器使用,helm有很多常用的k8s包,类似yum之于linux一样。用Helm能够:

  • 找到而且使用软件包做为kubernetes charts。
  • 以kubernetes charts的方式分享你本身的应用。
  • 为你的kubernetes应用建立可重复利用的builds。
  • 清晰的管理你的kubernetes manifest文件。
  • 管理Helm包的releases版本。
      这里我们先安装helm。下面是按照helm的方法与一些常用的helm指令。
 #下载3.6.2最新版本,可以访问https://v3.helm.sh/查看当前最新版本
 wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
 tar -zxvf helm-v3.6.2-linux-amd64.tar.gz
 cp linux-amd64/helm /usr/local/bin
 #验证
 helm version
 #添加chart源
 helm repo add stable https://charts.helm.sh/stable
 helm repo add aliyuncs https://apphub.aliyuncs.com
 #查询当前集群有哪些 chart 库
 helm repo list
 #查询某个库 有哪些安装程序
 helm search repo aliyuncs | head -5
 #查找安装程序
 helm search repo nginx
 #安装程序
 helm install nginx aliyuncs/nginx
 #查看安装的应用
 helm list
 #删除一个应用
 helm uninstall nginx

二、使用Helm安装ingress-nginx

  ingress的部署,需要考虑两个方面:

  • ingress-controller是作为pod来运行的,以什么方式部署比较好
  • 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。比较适合大并发的生产环境使用。
  这里我们选择第三种DaemonSet+HostNetwork+nodeSelector的方式来部署ingress-nginx。

  • 1、找一个路径,建立目录nginx-ingress,到时候会从helm上面下载chart文件到这个目录。
  • 2、执行helm search repo nginx-ingress ,查看nginx-ingress的版本和仓库,这里我们选择阿里云这个仓库下的
    imagepng
  • 3、进入到nginx-ingress这个目录中,执行如下命令:
#下载chart文件
helm pull aliyuncs/nginx-ingress
tar zxvf nginx-ingress-1.30.3.tgz
cd nginx-ingress

解压后有如下文件:
imagepng

  • 4、修改调整values.yaml中的相关参数
    (1)使用主机网络且daemoSet使用主机端口打开
    imagepng
    imagepng
    (2)将控制器类型由Deployment改为DaemoSet
    imagepng
    (3)指定节点选择规则
    imagepng
    (4)hostnetwork不用创建service
    imagepng
    到这里,helm的value文件就修改完毕,下面要做一些准备工作
  • 5、创建nginx-ingress命名空间
kubectl create namespace nginx-ingress
  • 6、给要起nginx-controller的node节点打上标签,这里要注意,因为我们创建的是DeamonSet,因此不能选择master节点,必须选择master节点以外的节点,这里我们选择slave1
kubectl label server-slave1 ingress=nginx
kubectl get nodes --selector ingress=nginx

imagepng

  • 7、可以安装ingress-nginx了,在nginx-ingress这个目录中,执行如下命令(注意最后面有个‘.’)
helm -n nginx-ingress install nginx-ingress .

imagepng
imagepng
  安装完成后,就可以看到对应的pod了。
imagepng
  到slave1节点上去,可以看到对应的端口已经开启
imagepng
到这里,我们的nginx-ingress-controller已经安装完成。


标题:kubernetes(1.21.1)学习之二helm安装nginx-ingress-controller
作者:michael
地址:https://blog.junxworks.cn/articles/2021/07/19/1626682065731.html