0
点赞
收藏
分享

微信扫一扫

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装


目录

​​一、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知识

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 基于云环境

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_ingress-nginx

这处简单了,拿来就用

2.2 使用 MetalLB

使用 ​​MetalLB​​ 

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_k8s ingress_02

这个需要去它的官网安装相关插件才行

2.3 NodePort service方式

可以通过 ​​NodePort service方​​式

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_k8s实现域名访问_03

上面的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管理界面

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_k8s ingress_04

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

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_hualinux_05

 从上面看到部署并没完成,因为Deployments和ReplicaSets都是基于pod的,可以看到pod只完成三分之二,看一下pod情况

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_k8s实现域名访问_06

3.1.2 状态2 

 过一会儿,发现变绿色了,就正常了

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_k8s实现域名访问_07

hualinux 进阶 1.20:反向代理ngress及ingress-nginx安装_hualinux k8s_08

注:执行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 条评论