目录

一、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 暴露给外界的三种方法NodePortLoadBalancerExternalName

  • 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,一起配合使用,至于怎么配合,你想到了吗?或者有更好的解决方案?

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐