阿里云(ubuntu)已经部署K8S下,ingress-nginx安装和配置

前言:

目前搜索出来的ingress-nginx安装教程都是mandatory.yaml配合service-nodeport.yaml文件来完成。(ingress-nginx官网给出的deploy.yaml安装方式未能成功使用,如有用deploy.yaml安装成功的还请各位大佬指教)。

一 安装ingress:(亲测有效,详细记录)

首先你需要mandatory.yaml和service-nodeport.yaml这两个文件。
此链接包含各版本的mandatory和service-nodeport文件(作者安装的是28版本)
①点开连接后可以通过下面的方式查看需要的版本。
在这里插入图片描述
②选择28版本后,选择mandatory.yaml
在这里插入图片描述

③点开mandatory.yaml文件,复制文件里面的所有内容(内容不止截图中的这一点,其实有很多,只是截不全)。
在这里插入图片描述
④在阿里云的master节点上创建mandatory.yaml文件,然后将复制的内容粘贴进去并保存。
在这里插入图片描述
在这里插入图片描述

⑤安装所需要的两个文件我们已经备好了一个,下面安排service-nodeport.yaml文件。
这个文件在deploy/static/provider/baremetal/service-nodeport.yaml路径下,如下图:
在这里插入图片描述
和mandatory.yaml文件的方法一样,点开service-nodeport.yaml文件,复制全部内容,并且在阿里云上创建service-nodeport.yaml文件粘贴保存。
在这里插入图片描述
值得一提的是,需要修改servic-nodeport.yaml文件中的一个地方,如下图:
在这里插入图片描述

添加nodeport标签是因为,ingress会用这个端口对外提供服务,这个端口我开放的是8889(k8s有默认的端口设置范围,刚开始你可以随意设置一个nodeport,例如:8889,待会咱们apply service-nodeport.yaml文件时如果提示端口错误,同时给你一个端口开放范围,你在修改端口到提示的范围内的就可以,其实端口范围可以自定义,Kubernetes之修改NodePort对外映射端口范围)。
到此为止,我们已经集齐了ingress-nginx安装的所有文件,mandatory.yaml和service-nodeport.yaml文件,接下来,安装!
注:
在安装之前我们先用命令

cat mandatory.yaml |grep image
root@master:~/ingress-nginx-first# cat mandatory.yaml |grep image
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.28.0

查看mandotary.yaml文件中需要使用的镜像,我们可以先提前下载。将镜像在各个slave节点上都拉取一下,不知道master将任务发给那个节点执行。

docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.28.0

在这里插入图片描述

(关于镜像的下载也有坑,在文章末尾我们会在提到,下载镜像有问题的可以直接到文章末尾查阅解决方法)。

⑥镜像下载完成后,执行下面的命令。

kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

执行完上面的命令,接下来执行如下命令查看是否有pod,svc,和deployment起来。

kubectl get pod -n ingress-nginx
kubectl get svc -n ingress-nginx
kubectl get deployment -n ingress-nginx

执行结果,如下图:
在这里插入图片描述

值得注意的是,红框中有个80:8889,即外部可以访问8889端口来与ingress-nginx交互,待会我们就可以用这个8889端口访问我们的ingress(要想访问8889,需要打开防火墙和阿里云后台的对此端口的限制,防火墙添加规则,阿里云后台添加安全组即可,可见方法详见文章尾附录)。

二 验证服务

创建svc及后端deployment

# test-ingress-pods.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: default
spec:
  selector:
    app: myapp
    env: test
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: myapp-test
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: myapp
      env: test
  template:
    metadata:
      labels:
        app: myapp
        env: test
    spec:
      containers:
      - name: myapp
        image: nginx:1.15-alpine #可以修改此处的镜像,自定义服务
        ports:
        - name: httpd
          containerPort: 80

查看pod部署情况

kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
myapp-test-7cdcb494b6-p65k2   1/1     Running   0          22m
myapp-test-7cdcb494b6-rffjh   1/1     Running   0          22m

查看Service

kubectl get svc 
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)
myapp-svc      ClusterIP      10.107.87.99    <none>        80/TCP                                                                                                     3d19h

创建ingress规则

# test-ingress-myapp.yaml
# ingress规则中,要指定需要绑定暴露的svc名称,即serviceName的标签内容
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: default
  annotations: 
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: cgyun.cgclass.net
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-svc #和上面启动的sericvc的name一致
          servicePort: 80

编辑完test-ingress-myapp.yaml后:

kubectl create -f test-ingress-myapp.yaml
kubectl get ingress
NAME            HOSTS               ADDRESS         PORTS   AGE
ingress-myapp   cgyun.cgclass.net   10.103.186.28   80      3d9h

注:如果ingress文件创建失败,请查看附录提供的解决办法。

然后主机浏览器访问cgyun.cgclass.net:8889,(前面我们已经提到8889已经开放,如果想在公网访问这个域名,这个域名需要能被公网解析),这里访问时需要加上servic-nodeport.yaml中的指定那个nodeport端口:8889。
到这里我们的ingress应该可以正常的运行。(往往不大可能一遍成功,我在附录中提及一些我当时遇到的坑)。

附录:

问题cat mandatory.yaml |grep image的后的镜像的下载问题。
问题描述:如果docker pull xxx可以直接拉取到是好事,但是如果拉取速度过慢而且中途还会失败会让我们很苦恼,这时候我们可以考虑换镜像源。
解决办法
点此处查看解决pull速度慢问题

问题进阶版:这是我在运行ingress-nginx官网的deploy.yaml文件时遇到的问题,grep到deploy.yaml中有一个镜像,在修改了docker的镜像源的情况下,拉取还是提示错误,错误如下:

Error response from daemon: Get https://us.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Timeout exceeded while awaiting headers这应该是镜像在国外,拉不到的原因。
进阶版问题解决办法:
镜像在国外,拉取不到的解决办法

问题:ingress服务无法创建,创建超时
问题描述:Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: context deadline exceeded
总而言之一句话,ingress没创建成功,提示超时。
解决办法:
点此解决ingress创建超时失败问题

在这里插入图片描述

此处需要修改三个文件的failurePolicy,每个都需要wq保存退出,如果ingress服务还是创建失败,有可能是修改failurePolicy失败,这时需要单独打开每一个文件修改尝试,如果全部修改成功还是创建不成功,只能再寻他法,还请留言告知方法,我将认真学习。
问题: 开放防火墙和阿里云后台的指定端口
问题描述:同时打开这两个地方的端口限制,才能使外部访问到ingress提供的nodeport。
解决办法:
开放服务器防火墙
阿里云ECS开放端口自定义安全组规则

问题: 安装ingress-nginx过程混乱,不知道自己进想到什么地步,错误百出,无法调适,想删除所有ingress配置。
问题描述: 如果配置ingress-nginx的过程中难免会遇到一些问题,当实在错综复杂无从下手,又身心俱疲时,可以尝试删除所有配置重新来过,仔细查看分析每一步的错误。
解决办法:
删除所有ingress-nginx配置

kubectl delete all --all -n ingress-nginx
kubectl delete namespace ingress-nginx

查看所有ingrss资源是否删除干净:

kubectl get all -n ingress-nginx

作者水平有限,文章如果哪里有错误或不合适,请批评指出,挚谢。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值