目录
一、Ingress知识
1.1 什么是ingress
1.2 为什么要使用ingress
二、例子 ingress-nginx的实现方式
2.1 基于云环境
2.2 使用 MetalLB
2.3 NodePort service方式
三、例子 ingress-nginx的NodePort实现
3.1 ingress 控制器安装
3.1.1 状态1
3.1.2 状态2
3.2 安装一个ingress-nginx例子
3.2.1 建立k8s Deployment群集,这里设置2台
3.2.2 创建k8s Service服务
3.2.3 创建ingress-nginx实例
3.3 测试效果
思考
前面讲的k8s Service服务,只有IP地址,没有域名,如果要向k8s配置域名,可以加一下“反代”功能,这就是今天出现的ingress。
注:k8s的ingress-nginx需要下载镜像,要梯才能使用,国内我找了半天也没有相关镜像,也不能上传到到我的docker hub账号中
这个可以直接看Ingress官方文档
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
Ingress 公开了从集群外部到集群内 services 的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
internet | [ Ingress ] --|-----|-- [ Services ]
可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS,以及提供基于名称的虚拟主机。Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务。
我们知道 Service 暴露给外界的三种方法NodePort、LoadBalancer、
ExternalName
NodePort
:通过每个 Node 上的 IP 和静态端口(NodePort
)暴露服务。NodePort
服务会路由到ClusterIP
服务,这个ClusterIP
服务会自动创建。通过请求,可以从集群的外部访问一个
: NodePort
服务。LoadBalancer
:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort
服务和ClusterIP
服务。ExternalName
:通过返回CNAME
和它的值,可以将服务映射到externalName
字段的内容(例如,foo.bar.example.com
)。 没有任何类型代理被创建。
但上面都是以IP的形式,作为用户,我其实更希望看到 Kubernetes 为我内置一个全局的负载均衡器。然后,通过我访问的 URL,把请求转发给不同的后端 Service。
而ingress提供了这种功能,Ingress 的功能其实很容易理解:所谓 Ingress,就是 Service 的“Service”。
所谓 Ingress 对象,其实就是 Kubernetes 项目对“反向代理”的一种抽象。
根据 ingress-nginx 官方裸机部署,有3种方式
这处简单了,拿来就用
使用 MetalLB
这个需要去它的官网安装相关插件才行
可以通过 NodePort service方式
上面的3种方式具体可以点相关链接,查看,我这里就不多说了,下面例子中我选择使用NodePort方式实现
这个例子也是同样在 《hualinux 进阶 1.7:kubeadm1.18搭建k8s群集》建立的k8s群集基础上搭建的。
您必须具有 ingress 控制器 才能满足 Ingress 的要求。仅创建 Ingress 资源无效。
所以在此之前得安装ingress 控制器我选择了ingress-nginx
ingress 控制器 ,我这里使用的是 Bare-metal裸机的NodePort安装 ,在执行下面命令前需要用一下梯
#执行基于NodePort的ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
#查看ingress-nginx 安装情况
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
执行结果为:
#需要爬梯,才能下载镜像
inx --watch[root@vm82 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/\
> controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created
[root@vm82 ~]#
#验证
[root@vm82 ~]# kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fd7d8df56-p97j8 0/1 ContainerCreating 0 4s
ingress-nginx-admission-create-lkjzb 0/1 Pending 0 0s
ingress-nginx-admission-create-lkjzb 0/1 Pending 0 0s
ingress-nginx-admission-patch-4z6wv 0/1 Pending 0 0s
ingress-nginx-admission-create-lkjzb 0/1 ContainerCreating 0 0s
ingress-nginx-admission-patch-4z6wv 0/1 Pending 0 0s
ingress-nginx-admission-patch-4z6wv 0/1 ContainerCreating 0 1s
ingress-nginx-admission-create-lkjzb 1/1 Running 0 92s
ingress-nginx-admission-create-lkjzb 0/1 Completed 0 93s
ingress-nginx-admission-patch-4z6wv 0/1 Completed 0 102s
然后打开k8s的web管理界面
过一会儿,再看一下,shell界面
[root@vm82 ~]# kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-7l8vj 0/1 ContainerCreating 0 4s
ingress-nginx-admission-patch-tmdrn 0/1 ContainerCreating 0 3s
ingress-nginx-controller-7fd7d8df56-wh9bf 0/1 ContainerCreating 0 15s
ingress-nginx-admission-patch-tmdrn 1/1 Running 0 101s
ingress-nginx-admission-patch-tmdrn 0/1 Error 0 102s
ingress-nginx-admission-patch-tmdrn 0/1 Error 1 105s
ingress-nginx-admission-patch-tmdrn 0/1 CrashLoopBackOff 1 106s
ingress-nginx-admission-create-7l8vj 0/1 Completed 0 115s
ingress-nginx-admission-patch-tmdrn 0/1 Completed 2 2m7s
#上面有些刚刚开始的时候镜像在下载中,有镜像是正常的
从上面看到部署并没完成,因为Deployments和ReplicaSets都是基于pod的,可以看到pod只完成三分之二,看一下pod情况
注:执行ingress-nginx安装需要下载一个重要的镜像 us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller,文件比较大
下面2个镜像是需要ingres-nginx涉及到的镜像
#没安装ingress-nginx之前,节点镜像情况 [root@vm821 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.18.5 a1daed4e2b60 4 weeks ago 117MB weaveworks/weave-npc 2.6.5 420d4d5aac6f 6 weeks ago 36.8MB weaveworks/weave-kube 2.6.5 e9dd2f85e51b 6 weeks ago 123MB k8s.gcr.io/pause 3.2 80d28bedfe5d 5 months ago 683kB #安装ingess-nginx完成之后,节点镜像情况 [root@vm821 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller
6fb0739a741f 12 days ago 329MB k8s.gcr.io/kube-proxy v1.18.5 a1daed4e2b60 4 weeks ago 117MB jettech/kube-webhook-certgen v1.2.2 5693ebf5622a 4 weeks ago 49MB weaveworks/weave-npc 2.6.5 420d4d5aac6f 6 weeks ago 36.8MB weaveworks/weave-kube 2.6.5 e9dd2f85e51b 6 weeks ago 123MB k8s.gcr.io/pause 3.2 80d28bedfe5d 5 months ago 683kB #从上面可以看出,多了us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller #和jettech/kube-webhook-certgen 两个镜像
完成之后就可以把梯撤了。上面的ingress-nginx控制器也就安装好了,就可以使用ingress-nginx了,这样会添加多一个Ingress-nginx命名空间,可以查看一下基础情况
#查看的时候要指定namespaces
[root@vm82 ~]# kubectl get po -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-7l8vj 0/1 Completed 0 21m 10.44.0.1 vm821
ingress-nginx-admission-patch-tmdrn 0/1 Completed 2 21m 10.44.0.2 vm821
ingress-nginx-controller-7fd7d8df56-wh9bf 1/1 Running 0 22m 10.44.0.1 vm821
[root@vm82 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.102.199.132 80:30113/TCP,443:31657/TCP 22m
ingress-nginx-controller-admission ClusterIP 10.106.215.131 443/TCP 22m
为了方便观看我使用了默认的名字空间defalut,并没指定为ingress-nginx
我这里是一个master和一个节点
#节点上添加
mkdir -p /disk1/www/t1/
echo 'vm821 index.html'>/disk1/www/t1/index.html
#master上操作
mkdir -p /disk1/myk8s
cd /disk1/myk8s
#建立群集
cat>nginx-deployment.yaml<
#创建一个服务
cat>nginx-ser.yaml<
#过一会儿
kubectl get po -o wide
#测试服务是否可访问
kubectl get svc -o wide|grep nginx|awk '{print $3}'|xargs curl
#执行效果如下:
[root@vm82 myk8s]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-c4f985c59-lkjzb 1/1 Running 0 118s 10.44.0.2 vm821
nginx-deployment-c4f985c59-p97j8 1/1 Running 0 118s 10.44.0.3 vm821
[root@vm82 myk8s]# kubectl get svc -o wide|grep nginx|awk '{print $3}'|xargs curl
vm821 index.html
我这里创建一个域名叫www.hualinux.com,默认情况是访问是 域名:nodePort,为了直接使用域名对外访问,我在Service添加了一个扩展IP,这样就有2种方式方式了。
#可以直接使用扩展ip访问,如果不指定端口号默认80
externalIPs:
- 192.168.128.21:80
#创建ingress
cat>ingress.yaml< 443/TCP 16d
[root@vm82 myk8s]# kubectl get ing -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx nginx www.hualinux.com 80 4s
##过大概一分钟这样,再查看,就会发现自动配置了IP地址了,发现配置是是内网IP
[root@vm82 myk8s]# kubectl get ing -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx nginx www.hualinux.com 192.168.3.21 80 76s
#因为节点只有内网IP地址,没有配置外网,所以就匹配内网了
[root@vm82 myk8s]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
vm82 Ready master 16d v1.18.5 192.168.3.82 CentOS Linux 8 (Core) 4.18.0-193.el8.x86_64 docker://19.3.12
vm821 Ready 15d v1.18.5 192.168.3.21 CentOS Linux 8 (Core) 4.18.0-193.el8.x86_64 docker://19.3.12
上面的ingress-nginx就建立好了,现在测试一下是否能访问
#直接使用扩展IP域名访问,我这里使用curl指定域名了,也可以使用hosts绑定域名
[root@vm82 myk8s]# curl http://192.168.128.21 -H 'Host: www.hualinux.com'
vm821 index.html
#如果使用ingress-nginx分配的地址192.168.21,没加端口号情况,发现访问不了
[root@vm82 myk8s]# curl http://192.168.3.21 -H 'Host: www.hualinux.com'
curl: (7) Failed to connect to 192.168.3.21 port 80: 拒绝连接
#加端口号用 域名:nodePort 方式,发现能正常访问
[root@vm82 myk8s]# curl http://192.168.3.21:30006 -H 'Host: www.hualinux.com'
vm821 index.html
上面的情况,如果不使用扩展,那么只能使用 域名:nodePort 方式访问,假如我一个节点有多个域名,像普通那样,使用的是80端口,那么这样很不方便。
如果使用扩展IP的话,那么节点服务器只能用一个80端口,也不行
更好的解决方案是安装内部的DNS,一起配合使用,至于怎么配合,你想到了吗?或者有更好的解决方案?