一、引言
1.把端口号对外暴露,通过IP+端口号进行访问
1)使用Service里面的NodePort实现
2.NodePort缺陷
1)在每个节点上都会启动端口,在访问时候通过任何节点,通过节点IP+暴露端口号实现访问
2)意味着每个端口只能使用一次,一个端口对应一个应用
3)实际访问中都是用域名,根据不同域名跳转到不同端口服务中
二、Ingress概述
通常情况下,service和pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy将其转发给相关的Pod。
Ingress为Kubernetes集群中的服务提供了入口,可以提供负载均衡、SSL终止和基于名称的虚拟主机,在生产环境中常用的Ingress有Treafik、Nginx、HAProxy、Istio等。在Kubernetes v1.1版中添加的Ingress用于从集群外部到集群内部Service的HTTP和HTTPS路由,流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上。Ingress可以配置提供服务外部访问的URL、负载均衡、终止SSL,并提供基于域名的虚拟主机。但Ingress不会暴露任意端口或协议。
三、Ingress工作流程
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。
四、Ingress控制器(官方维护)
1.官方维护Ingress控制器
为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同, Ingress 控制器不是随集群自动启动的。 基于此页面,你可选择最适合你的集群的 ingress 控制器实现。
Kubernetes 作为一个项目,目前支持和维护 AWS, GCE 和 nginx Ingress 控制器。
2.其他Ingress控制器
#1.AKS 应用程序网关 Ingress 控制器 是一个配置 Azure 应用程序网关 的 Ingress 控制器。
#2.Ambassador API 网关是一个基于 Envoy 的 Ingress 控制器。
#3.Apache APISIX Ingress 控制器 是一个基于 Apache APISIX 网关 的 Ingress 控制器。
#4.Avi Kubernetes Operator 使用 VMware NSX Advanced Load Balancer 提供第 4 到第 7 层的负载均衡。
#5.BFE Ingress 控制器 是一个基于 BFE 的 Ingress 控制器。
#6.Citrix Ingress 控制器 可以用来与 Citrix Application Delivery Controller 一起使用。
#7.Contour 是一个基于 Envoy 的 Ingress 控制器。
#8.EnRoute 是一个基于 Envoy API 网关, 可以作为 Ingress 控制器来执行。
#9.Easegress IngressController 是一个基于 Easegress API 网关,可以作为 Ingress 控制器来执行。
#10.F5 BIG-IP 的 用于 Kubernetes 的容器 Ingress 服务 让你能够使用 Ingress 来配置 F5 BIG-IP 虚拟服务器。
#11.Gloo 是一个开源的、基于 Envoy 的 Ingress 控制器,能够提供 API 网关功能,
#12.HAProxy Ingress 针对 HAProxy 的 Ingress 控制器。
#13.用于 Kubernetes 的 HAProxy Ingress 控制器 也是一个针对 HAProxy 的 Ingress 控制器。
#14.Istio Ingress 是一个基于 Istio 的 Ingress 控制器。
#15.用于 Kubernetes 的 Kong Ingress 控制器 是一个用来驱动 Kong Gateway 的 Ingress 控制器。
#16.用于 Kubernetes 的 NGINX Ingress 控制器 能够与 NGINX Web 服务器(作为代理) 一起使用。
#17.Skipper HTTP 路由器和反向代理可用于服务组装,支持包括 Kubernetes Ingress 这类使用场景, 设计用来作为构造你自己的定制代理的库。
#18.Traefik Kubernetes Ingress 提供程序 是一个用于 Traefik 代理的 Ingress 控制器。
#19.Tyk Operator 使用自定义资源扩展 Ingress,为之带来 API 管理能力。Tyk Operator 使用开源的 Tyk Gateway & Tyk Cloud 控制面。
#20.Voyager 是一个针对 HAProxy 的 Ingress 控制器。
五、安装Nginx-Ingress
1.helm安装Ingress
#1.新建ingress存放目录
[root@kubernetes-master-001 ~]# mkdir ingress && cd ingress
#2.添加官方ingress-nginx的helm仓库
[root@kubernetes-master-001 ~/ingress]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
#3.搜索仓库中已有的ingress-nginx版本信息(建议安装0.40.2以上的版本)
[root@kubernetes-master-001 ~/ingress]# helm search repo ingress-nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.0.9 1.0.5 Ingress controller for Kubernetes using NGINX a...
#4.拉取ingress-nginx的包
helm pull [repo名称/chart名称]
[root@kubernetes-master-001 ~/ingress]# helm pull ingress-nginx/ingress-nginx
#5.解压包,修改values.yaml配置文件
[root@kubernetes-master-001 ~/ingress]# tar -xf ingress-nginx-4.0.9.tgz && cd ingress-nginx
#6.修改values.yaml
# 修改镜像
# 注释掉registry,image,digest,并打开repository
repository: willdockerhub/ingress-nginx-controller
tag: "v1.0.5"
repository: jettech/kube-webhook-certgen
tag: v1.5.2
repository: mirrorgooglecontainers/defaultbackend-amd64
tag: "1.5"
#修改dns策略
dnsPolicy: ClusterFirstWithHostNet
# 使用hostNetwork,即使用宿主机上的端口80 443
hostNetwork: false
# 使用DaemonSet,将ingress部署在指定节点上
kind: DaemonSet
# 节点选择,将需要部署的节点打上ingress=true的label
nodeSelector:
kubernetes.io/os: linux
ingress: "true"
# 选择节点打label
kubectl label node node01 ingress=true
# 创建一个ingress的namespace
kubectl create ns ingress-nginx
# 创建ingress
# 如果提示cannot re-use a name that is still in use
# 则先helm uninstall ingress-nginx --namespace ingress-nginx
# 如果安装完成后无法访问其他节点日志,则需要配置hosts,将所有节点配置到hosts中即可
helm install ingress-nginx ingress-nginx -n ingress-nginx
2.直接部署安装
#1.部署ingress-nginx 比较简单,直接下载github上的 deploy.yaml 部署即可,由于网络问题镜像如果拉取失败,我们可以直接去GitHub复制这个yaml文件
[root@kubernetes-master-001 ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
#2.修改镜像地址
[root@kubernetes-master-001 ~]# sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@willdockerhub/ingress-nginx-controller:v1.0.0@' deploy.yaml
[root@kubernetes-master-001 ~]# sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@hzde0128/kube-webhook-certgen:v1.0@' deploy.yaml
#3.安装ingress-nginx
[root@kubernetes-master-001 ~]# kubectl apply -f ingress-1.0.0.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx configured
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx configured
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
ingressclass.networking.k8s.io/nginx configured
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured
serviceaccount/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission configured
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission configured
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
#4.查看ingress-nginx状态
[root@kubernetes-master-001 ~]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-fgcrk 0/1 Completed 0 20m
ingress-nginx-admission-patch-b6d96 0/1 Completed 0 20m
ingress-nginx-controller-6b64bc6f47-4sd7g 1/1 Running 0 20m
[root@kubernetes-master-001 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.107.105.141 <none> 80:31386/TCP,443:31083/TCP 20m
ingress-nginx-controller-admission ClusterIP 10.103.7.53 <none> 443/TCP 20m
六、部署示例验证
1.创建Pod
[root@kubernetes-master-001 ~]# kubectl create deployment web --image=nginx
deployment.apps/web created
[root@kubernetes-master-001 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-96d5df5c8-prps4 1/1 Running 0 44s
2.对外暴露应用
[root@kubernetes-master-001 ~]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
service/web exposed
[root@kubernetes-master-001 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d23h
web NodePort 10.106.214.3 <none> 80:30645/TCP 4d23h
3.创建Ingress规则
[root@kubernetes-master-001 ~]# vi ingress-http.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: example.ingredemo.com
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: web
port:
number: 80
[root@kubernetes-master-001 ~]# kubectl apply -f ingress-http.yaml
ingress.networking.k8s.io/example-ingress created
[root@kubernetes-master-001 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.107.105.141 <none> 80:31386/TCP,443:31083/TCP 3h55m
ingress-nginx-controller-admission ClusterIP 10.103.7.53 <none> 443/TCP 3h55m
[root@kubernetes-master-001 ~]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress <none> example.ingredemo.com 80 5s
七、Ingress-Nginx优化
上面每次部署 ingres-nginx 都随机一个nodePort ,而使用ingres-nginx访问的时候也要以 域名:端口 的形式去访问如何直接使用域名去访问呢?下面介绍hostNetwork 的方式部署Ingress-Nginx。
1.下载Ingress-Nginx
[root@kubernetes-master-001 ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
[root@kubernetes-master-001 ~]# sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@willdockerhub/ingress-nginx-controller:v1.0.0@' deploy.yaml
[root@kubernetes-master-001 ~]# sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@hzde0128/kube-webhook-certgen:v1.0@' deploy.yaml
2.使用hostNetwork
默认 ingress-nginx 随机提供 nodeport 端口,开启 hostNetwork 启用80、443端口。
修改 Deployment 下面的 spec
参数如下:
spec:
hostNetwork: true # 新增
dnsPolicy: ClusterFirst
containers:
- name: controller
image: willdockerhub/ingress-nginx-controller:v1.0.0 # 更换镜像地址
imagePullPolicy: IfNotPresent
lifecycle:
3.修改负载均衡问题
把 kind: Deployment 改为 kind: DaemonSet 模式,这样每台 node 上都有 ingress-nginx-controller pod 副本。
参数如下:
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
#kind: Deployment # 注释
kind: DaemonSet # 新增
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.1
4.修改 ingressClass 问题
如果不关心 ingressClass 或者很多没有 ingressClass 配置的 ingress 对象,
添加参数 ingress-controller --watch-ingress-without-class=true 。
args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
- --watch-ingress-without-class=true # 新增
6.部署检查ingress
#1.部署ingress
[root@kubernetes-master-001 ~]# kubectl apply -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
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
daemonset.apps/ingress-nginx-controller created
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured
serviceaccount/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
#2.部署pod
[root@kubernetes-master-001 ~]# kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-cm5h4 0/1 Completed 0 4m4s 10.244.1.97 kubernetes-node-002 <none> <none>
ingress-nginx-admission-patch-49wc7 0/1 Completed 1 4m4s 10.244.1.98 kubernetes-node-002 <none> <none>
ingress-nginx-controller-cks5x 1/1 Running 0 4m5s 192.168.13.102 kubernetes-node-002 <none> <none>
ingress-nginx-controller-cqgfb 1/1 Running 0 4m4s 192.168.13.101 kubernetes-node-001 <none> <none>
#3.node节点检查端口
[root@kubernetes-node-002 ~]# netstat -lntp |grep 443
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 70037/nginx: master
tcp6 0 0 :::8443 :::* LISTEN 70016/nginx-ingress
tcp6 0 0 :::443 :::* LISTEN 70037/nginx: master
[root@kubernetes-node-002 ~]# netstat -lntp |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 70037/nginx: master
tcp6 0 0 :::80 :::* LISTEN 70037/nginx: master
[root@kubernetes-node-001 ~]# netstat -lntp |grep 443
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 93825/nginx: master
tcp6 0 0 :::8443 :::* LISTEN 93765/nginx-ingress
tcp6 0 0 :::443 :::* LISTEN 93825/nginx: master
[root@kubernetes-node-001 ~]# netstat -lntp |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 93825/nginx: master
tcp6 0 0 :::80 :::* LISTEN 93825/nginx: master
评论