二十、服务发布Ingress
Ingress
Kubernetes使用了一个Ingress策略定义和一个具体提供转发服务的Ingress Controller,两者结合,实现了基于灵活Ingress策略定义的服务路由功能。如果是对Kubernetes集群外部的客户端提供服务,那么IngressController实现的是类似于边缘路由器(Edge Router)的功能。需要注意的是,Ingress只能以HTTP和HTTPS提供服务,对于使用其他网络协议的服务,可以通过设置Service的类型(type)为NodePort或LoadBalancer对集群外部的客户端提供服务。
Ingress为Kubernetes集群中的服务提供了入口,可以提供负载均衡、SSL终止和基于名称(域名)的虚拟主机、应用的灰度发布等功能,在生产环境中常用的Ingress控制器有Treafik、Nginx、HAProxy、Istio等。
一、 Ingress Controller 安装
官方安装文档:https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters
两种方式:
A. 官方手册,用裸金属方式,helm安装。但是镜像地址需要修改image的地址。
自己部署管理的kubernetes,建议使用helm安装。
B. 使用提供的文件
本次采用第二种方式安装
开始安装
[root@k8s-master01 Pra]#kubectl create -f deploy-nginx.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
[root@k8s-master01 Pra]#kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-mpsc9 0/1 Completed 0 64s
ingress-nginx-admission-patch-k4gpl 0/1 Completed 0 64s
ingress-nginx-controller-674f66cf96-hznf4 1/1 Running 0 64s# 看见controller 变成1/1就完成了。
二、使用域名发布 K8s 的服务
创建一个 web 服务:
# kubectl create deploy nginx --image=registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
暴露服务:
# kubectl expose deploy nginx --port 80 --name my-service
创建 Ingress:
[root@k8s-master01 Pra] # vim web-ingress.yaml
apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须使用 v1
kind: Ingress
metadata:name: nginx-ingress # ingress的名称,要见名知意
spec:ingressClassName: nginx # 关于ingress的描述,表述用的nginx的controller rules: # 下面的一些规则- host: nginx.test.com # 基于域名的访问,域名配置,可以不写,匹配* *.bar.comhttp:paths: # 相当于nginx的lacation配合,同一个host可以配置多个path- backend:service:name: my-service # service的名称port:number: 80 # service的端口号path: /pathType: ImplementationSpecific# 带 - 的可以重复,意识是可以有多个
生成yaml文件:
[root@k8s-master01 Pra]#kubectl create -f web-ingress.yaml
ingress.networking.k8s.io/nginx-ingress created
[root@k8s-master01 Pra]#kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx nginx.test.com 80 11s# 查看用的什么控制器,可以看见,此处用的nginx controller
[root@k8s-master01 Pra]#kubectl get ingressclasses
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 65m
查看结果
[root@k8s-master01 Pra]#kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.96.56.221 <none> 80:30784/TCP,443:32602/TCP 22h
ingress-nginx-controller-admission ClusterIP 10.96.103.51 <none> 443/TCP 22h# 可以看见 ingress-nginx的命名空间内的ingress-nginx-controller service,端口指向80:30784
注意:不是ingress-nginx-controller的CLUSTER-IP地址,因为访问不到。也不是kubectl get ingress
结果的地址。是任意一台宿主机的地址。因为ingress-nginx-controller的类型是NodePort。
ingress-nginx-controller的类型是NodePort
主机添加dns解析
任意一台宿主机地址 + nginx.test.com
web登录访问,正常
三、Ingress相关配置解释
1、pathType解释
1). Exact(精确匹配)
-
定义