ingress-nginx的安装使用

ingress-nginx的安装使用

标签: kubernetes   ingress   nginx   helm   traefik  

开源的 Ingress Controller 的实现使用量最大的莫过于 Ingress Nginx 了,可作为反向代理将外部流量导入集群内部,将 Kubernetes 内部的 Service 暴露给外部,在 Ingress 对象中通过域名匹配 Service,这样就可以直接通过域名访问到集群内部的服务了。

实际 Ingress Nginx 有两种实现:

  1. https://github.com/kubernetes/ingress-nginx
  2. https://github.com/nginxinc/kubernetes-ingress

第一种是 Kubernetes 开源社区的实现,第二种是 Nginx 官方的实现,我们通常用的是 Kubernetes 社区的实现,这也是本文所关注的重点。

安装

我们这里通过Helm来简化 nginx-ingress 的安装,所以确保 Helm 能够正常使用。由于部署ingress-nginx 所在的节点需要能够访问外网,这样域名可以解析到这些节点上直接使用,需要让 nginx-ingress 绑定节点的 80 和 443 端口。

如果你的K8S集群是自己部署的,可以选择能够外网访问的边缘节点,ingress-nginx通过 DasemonSet 和 hostPort 来进行部署,并通过 nodeSelector 来筛选有外网 IP 的边缘节点

如果你的K8S集群是在云厂商购买的,可以直接部署,ingress-controller可以通过LoadBalancer提供外网访问服务。

这里我采用的云厂商的K8S集群,部署ingress-nginx的详细文档可以参考:https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx

1)添加Helm Repo:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

2)安装ingress-nginx chart:

kubectl create namespace ingress
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0

3)你也可以新建custom.yaml文件来覆盖 nginx-ingress Chart 包的一些默认参数:

controller:
  image:
    repository: docker.io/amuguelove/ingress-nginx
    tag: "v0.41.0"
    digest:
    pullPolicy: IfNotPresent

  extraArgs:
    enable-ssl-passthrough: "true"
  
  config:
    server-tokens: "false"    

这时你可以使用如何命令:

helm update --install -f custom.yaml ingress-nginx ingress-nginx/ingress-nginx -n ingress --version 3.9.0

4)安装完成后可以通过下面的命令查看 ingress-ingress 的 Pod 使用运行成功:

$ helm list -n ingress
NAME         	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART              	APP VERSION
ingress-nginx	ingress  	7       	2020-12-31 18:13:13.216027 +0800 CST	deployed	ingress-nginx-3.9.0	0.41.0

$ kubectl get pods -n ingress
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-565bcc4954-nls96   1/1     Running   0          141m

安装过程中需要用到k8s.gcr.io/ingress-nginx/controller的镜像,大家可以先本地翻墙pull 下来后重新打上 tag,推送到Dockerhub。也可以使用我打包的,镜像地址如下:docker.io/amuguelove/ingress-nginx

使用

上面的 ingress-ingress 安装成功后,添加 kubernetes.io/ingress.class: nginx 注解到 Ingress资源。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-nginx
  annotations:
    kubernetes.io/ingress.class: nginx # 重点
spec:
  rules:
    - host: nginx.qcloud.com
      http:
        paths:
          - backend:
              serviceName: my-nginx
              servicePort: 80
            path: /

注意我们在 Ingress 资源对象中添加了一个 annotations:kubernetes.io/ingress.class: "nginx",这就是指定让这个 Ingress 通过 ingress-nginx 来处理。

若域名是自己随便定义的,可以在本地/etc/hosts中添加对应的隐射也可以,然后就可以通过域名进行访问了。

除此之外,我们还可以利用cert-manager来进行 HTTPS 自动化,可以参考前面的文章:kubernetes Ingress 自动化 HTTPS

参考资料

  1. Ingress Nginx Chart: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx
  2. Ingress Nginx Github: https://github.com/kubernetes/ingress-nginx

「真诚赞赏,手留余香」

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章