前言:
目前搜索出来的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
作者水平有限,文章如果哪里有错误或不合适,请批评指出,挚谢。