hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装
目录一、Ingress知识1.1 什么是ingress1.2 为什么要使用ingress二、例子 ingress-nginx的实现方式2.1基于云环境2.2 使用MetalLB2.3NodePort service方式三、例子 ingress-nginx的NodePort实现3.1ingress 控制器安装3.1.1 状态13.1.2 状态23.2 安装一个ingress-nginx例子3.2.1
目录
3.2.1 建立k8s Deployment群集,这里设置2台
前面讲的k8s Service服务,只有IP地址,没有域名,如果要向k8s配置域名,可以加一下“反代”功能,这就是今天出现的ingress。
注:k8s的ingress-nginx需要下载镜像,要梯才能使用,国内我找了半天也没有相关镜像,也不能上传到到我的docker hub账号中
一、Ingress知识
1.1 什么是ingress
这个可以直接看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 类型的服务。
1.2 为什么要使用ingress
我们知道 Service 暴露给外界的三种方法NodePort、LoadBalancer、
ExternalName
NodePort
:通过每个 Node 上的 IP 和静态端口(NodePort
)暴露服务。NodePort
服务会路由到ClusterIP
服务,这个ClusterIP
服务会自动创建。通过请求<NodeIP>:<NodePort>
,可以从集群的外部访问一个NodePort
服务。LoadBalancer
:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort
服务和ClusterIP
服务。ExternalName
:通过返回CNAME
和它的值,可以将服务映射到externalName
字段的内容(例如,foo.bar.example.com
)。 没有任何类型代理被创建。
但上面都是以IP的形式,作为用户,我其实更希望看到 Kubernetes 为我内置一个全局的负载均衡器。然后,通过我访问的 URL,把请求转发给不同的后端 Service。
而ingress提供了这种功能,Ingress 的功能其实很容易理解:所谓 Ingress,就是 Service 的“Service”。
所谓 Ingress 对象,其实就是 Kubernetes 项目对“反向代理”的一种抽象。
二、例子 ingress-nginx的实现方式
根据 ingress-nginx 官方裸机部署,有3种方式
2.1 基于云环境
这处简单了,拿来就用
2.2 使用 MetalLB
使用 MetalLB
这个需要去它的官网安装相关插件才行
2.3 NodePort service方式
可以通过 NodePort service方式
上面的3种方式具体可以点相关链接,查看,我这里就不多说了,下面例子中我选择使用NodePort方式实现
三、例子 ingress-nginx的NodePort实现
这个例子也是同样在 《hualinux 进阶 1.7:kubeadm1.18搭建k8s群集》建立的k8s群集基础上搭建的。
您必须具有 ingress 控制器 才能满足 Ingress 的要求。仅创建 Ingress 资源无效。
所以在此之前得安装ingress 控制器我选择了ingress-nginx
3.1 ingress 控制器安装
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管理界面
3.1.1 状态1
过一会儿,再看一下,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
#上面有些刚刚开始的时候镜像在下载中,有镜像是正常的
再看回web
从上面看到部署并没完成,因为Deployments和ReplicaSets都是基于pod的,可以看到pod只完成三分之二,看一下pod情况
3.1.2 状态2
过一会儿,发现变绿色了,就正常了
注:执行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 <none> 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 <none> <none>
ingress-nginx-admission-patch-tmdrn 0/1 Completed 2 21m 10.44.0.2 vm821 <none> <none>
ingress-nginx-controller-7fd7d8df56-wh9bf 1/1 Running 0 22m 10.44.0.1 vm821 <none> <none>
[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 <none> 80:30113/TCP,443:31657/TCP 22m
ingress-nginx-controller-admission ClusterIP 10.106.215.131 <none> 443/TCP 22m
3.2 安装一个ingress-nginx例子
为了方便观看我使用了默认的名字空间defalut,并没指定为ingress-nginx
我这里是一个master和一个节点
3.2.1 建立k8s Deployment群集,这里设置2台
#节点上添加
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<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
web: nginx18
spec:
replicas: 2
selector:
matchLabels:
web: nginx18
template:
metadata:
labels:
web: nginx18
spec:
containers:
- name: nginx
image: nginx:1.18
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /disk1/www/t1
EOF
cat nginx-deployment.yaml
kubectl apply -f nginx-deployment.yaml
3.2.2 创建k8s Service服务
#创建一个服务
cat>nginx-ser.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
name: ing-nginx
labels:
ing: nginx
spec:
type: NodePort
selector:
#查找匹配的标签的pod
web: nginx18
ports:
- protocol: TCP
#services对外端口
port: 80
#这个是容器端口
targetPort: 80
#default: 30000-32767
nodePort: 30006
externalIPs:
- 192.168.128.21
EOF
kubectl apply -f 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 <none> <none>
nginx-deployment-c4f985c59-p97j8 1/1 Running 0 118s 10.44.0.3 vm821 <none> <none>
[root@vm82 myk8s]# kubectl get svc -o wide|grep nginx|awk '{print $3}'|xargs curl
vm821 index.html
3.2.3 创建ingress-nginx实例
我这里创建一个域名叫www.hualinux.com,默认情况是访问是 域名:nodePort,为了直接使用域名对外访问,我在Service添加了一个扩展IP,这样就有2种方式方式了。
#可以直接使用扩展ip访问,如果不指定端口号默认80
externalIPs:
- 192.168.128.21:80
#创建ingress
cat>ingress.yaml<<EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
#指定空间名
#namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: www.hualinux.com
http:
paths:
- path: /
backend:
serviceName: ing-nginx
servicePort: 80
EOF
kubectl apply -f ingress.yaml
#查看一下情况
kubectl get svc -o wide
kubectl get ing -o wide
#效果如下:
[root@vm82 myk8s]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ing-nginx NodePort 10.96.192.73 192.168.128.21 80:30006/TCP 7m37s web=nginx18
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d <none>
[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 <none> CentOS Linux 8 (Core) 4.18.0-193.el8.x86_64 docker://19.3.12
vm821 Ready <none> 15d v1.18.5 192.168.3.21 <none> CentOS Linux 8 (Core) 4.18.0-193.el8.x86_64 docker://19.3.12
3.3 测试效果
上面的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,一起配合使用,至于怎么配合,你想到了吗?或者有更好的解决方案?
更多推荐
所有评论(0)