一、Inginx-ingress介绍 简介
1.ingress简介
  在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案:

  • NodePort:最简单,用命令kubectl expose deployment [deply] --type=NodePort直接配置就可以
  • LoadBalancer:详见https://blog.csdn.net/lic95/article/details/125076060
  • Ingress:k8s推荐用nginx-ingress,下面详细介绍nginx-ingress

2.nginx-ingress 组成

  • ingress controller:将新加入的Ingress转化成Nginx的配置文件并使之生效
  • ingress服务:将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可

3.nginx-ingress工作原理
  ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。

4.可以解决什么问题

  • 动态配置服务
      如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作.
  • 减少不必要的端口暴露
      配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式

二、nginx-ingress部署配置
1.部署k8s集群
详见:https://blog.csdn.net/lic95/article/details/125044136

2.下载部署文件

mkdir -p nginx-ingress
cd nginx-ingress
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

# 因为里面的2个镜像在k8s.gcr.io上,需要科学上网才能正常下载,否则无法正常安装
k8s.gcr.io/ingress-nginx/controller:v1.2.0
k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1

# 部署下载文件
[root@master01 nginx]# kubectl apply -f deploy.yaml 
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

3.查看部署状态

[root@master01 nginx-ingress]# kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-lgxfr        0/1     Completed   0          83s
ingress-nginx-admission-patch-trwjg         0/1     Completed   1          83s
ingress-nginx-controller-686556747b-f65xn   1/1     Running     0          83s
[root@master01 nginx-ingress]# 

三、部署测试应用echoserver

# 部署2副本echoserver
kubectl create deploy echoserver --image=cilium/echoserver --replicas=2
kubectl create deploy echoserver --image=e2eteam/echoserver --replicas=2

# 查看部署情况
[root@master01 nginx-ingress]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
echoserver-8585bfb456-bktdd   1/1     Running   0          39s
echoserver-8585bfb456-dpq9l   1/1     Running   0          39s

#创建服务
[root@master01 ~]# kubectl expose deployment echoserver --port=80
service/echoserver exposed

#查看services
[root@master01 nginx-ingress]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
echoserver   ClusterIP   172.18.159.159   <none>        80/TCP    92s
kubernetes   ClusterIP   172.18.0.1       <none>        443/TCP   8h

#查看服务,正常两个hostname随机显示
curl http://172.18.159.159

#.查看nginx-ingress服务,状态为pending,原因为未部署oadBalancer或者开启NodePort
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   172.18.65.6      <pending>     80:32456/TCP,443:32350/TCP   12m
ingress-nginx-controller-admission   ClusterIP      172.18.162.225   <none>        443/TCP                      12m

四、NodePort模式在线测试
1.开启nginx-ingress NodePort端口

[root@master01 nginx-ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx

#修改LoadBalancer为NodePort,再次查看服务
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    172.18.65.6      <none>        80:32217/TCP,443:30735/TCP   24m
ingress-nginx-controller-admission   ClusterIP   172.18.162.225   <none>        443/TCP                      24m

#测试NodePort映射端口
[root@AlmaLinux-BGP ~]# curl http://192.168.3.30:32217
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

2.配置ingress策略

#生成echoserver的配置文件ingress-echoserver-test.yaml
[root@master01 nginx-ingress]# cat ingress-echoserver-test.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-echoserver-test
spec:
  rules:
  - host: echoserver.test
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: echoserver
            port:
              number: 80
  ingressClassName: nginx

#执行配置文件
[root@master01 nginx-ingress]# kubectl apply -f ingress-echoserver-test.yaml 
ingress.networking.k8s.io/ingress-echoserver-test created 

#查看ingress配置情况
[root@master01 nginx-ingress]# kubectl get ingress
NAME                      CLASS   HOSTS             ADDRESS       PORTS   AGE
ingress-echoserver-test   nginx   echoserver.test   172.18.65.6   80      20s

3.测试

#测试结果,OK
curl -H "Host: echoserver.test" http://192.168.3.30:32217

Hostname: echoserver-8585bfb456-f859x

五、LoadBalancer模式在线测试
1.修改NodePort为LoadBalancer,再次查看服务

[root@master01 nginx-ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx

#修改为NodePort为LoadBalancer,再次查看服务
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   172.18.65.6      <pending>     80:32217/TCP,443:30735/TCP   84m
ingress-nginx-controller-admission   ClusterIP      172.18.162.225   <none>        443/TCP                      84m

2.采用Layer2模式部署MetalLB负载均衡器

#部署MetalLB详见:https://blog.csdn.net/lic95/article/details/125076060

#查看部署结果
[root@master01 manifests]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   172.18.65.6      192.168.3.80   80:32217/TCP,443:30735/TCP   92m
ingress-nginx-controller-admission   ClusterIP      172.18.162.225   <none>         443/TCP                      92m

[root@master01 nginx-ingress]# kubectl get ingress
NAME                      CLASS   HOSTS             ADDRESS        PORTS   AGE
ingress-echoserver-test   nginx   echoserver.test   192.168.3.80   80      64m

3.测试

#测试结果,OK
curl -H "Host: echoserver.test" http://192.168.3.80

Hostname: echoserver-8585bfb456-f859x
Logo

开源、云原生的融合云平台

更多推荐