部署环境:k8s_v1.20.2和ingress-nginx-controller-v1.0.0,DaemonSet+HostNetwork
【K8s】服务暴露插件ingress-controller部署指南(二)介绍了Deployment+NodePort模式的Service部署。
目录
一、了解ingress功能及原理
二、kubernetes发布服务的服务类型
三、准备容器化部署的yaml文件及镜像
准备yaml文件
准备镜像
四、部署ingress-nginx-controller
五、测试
六、参考
七、说在最后
虽然service或者pod都可以直接通过NodePort将端口直接映射到Node节点,但是大量pod使用映射方式无疑会带来巨大的管理压力,大范围使用非标端口会造成管理困难,Node节点映射太多端口也会带来安全隐患。
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。
Kubernetes ServiceTypes 允许指定你所需要的 Service 类型,默认是 ClusterIP。
Type 的取值以及行为如下:
说明: 你需要使用 kube-dns 1.7 及以上版本或者 CoreDNS 0.0.8 及以上版本才能使用 ExternalName 类型。
你也可以使用 Ingress 来暴露自己的服务。 Ingress 不是一种服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中,因为它可以在同一IP地址下公开多个服务。
本例中选用ClusterIP方式发布ingress-controller,并且直接将ingress-controller的Port 80/443端口映射到Node节点
Kubernetes 作为一个项目,目前支持和维护 AWS, GCE 和 nginx Ingress 控制器。
其它支持的控制器请参阅Ingress 控制器
这里使用的是DaemonSet+HostNetwork模式,如使用Deployment+NodePort模式的Service部署,这一章节请参阅【K8s】服务暴露插件ingress-controller部署指南(二)
github官方地址
image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068
官方deploy.yaml文件中的imgae地址均为境外,本文提供了dockerhub的下载地址。(感谢群友帮忙下载,由本人上传至dockerhub)
docker pull serenade11/ingress-nginx-controller:v1.0.0
docker pull serenade11/kube-webhook-certgen:v1.0
下载后在deploy.yaml文件的image项填写对应的路径。
kubectl apply –f deploy.yaml
部署完成,两个ingress-nginx-admission-* Pod是completed状态。
根据Node数量生成的ingress-nginx-controller-* Pod为Running状态。
Node节点查看监听端口,发现80和443端口已经处于监听状态。
netstat –lntp
在本地pc的hosts文件增加静态域名解析:NodeIP nginx.k8s.com
浏览器访问nginx.k8s.com,回显如下图,在ingress-controller找不到后端pod时,即显示该页面。
创建一个Pod
vim nginx.yaml
---
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-controller
spec:
replicas: 1
selector:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: serenade11/nginx:curl
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: ClusterIP
selector:
name: nginx
kubectl apply -f nginx.yaml
kubectl get pod
此时一个nginx的pod和service已经创建完成
但是还需要创建一个ingress用于指定使用ingress-controller代理访问该Pod
指定访问域名为nginx.k8s.com。
vim nginx-ingress.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-service
spec:
rules:
- host: "nginx.k8s.com"
http:
paths:
- pathType: ImplementationSpecific
path:
backend:
service:
name: nginx-service
port:
number: 80
kubectl apply -f nginx.yaml
回到PC机访问ngxin.k8s.com发现页面没变,清除缓存访问依然无效,
查看ingress-controller的Pod日志。
kubectl logs -f ingress-nginx-controller-6ngqs -n ingress-nginx
提示ingress资源未指定IngressClass。
查看官方提供的deploy中确实有创建IngressClass,但是指定了namespace:ingress-nginx
于是将该部分内容复制出来,用于在default空间也创建一个IngressClass。
vi ingressclass_default.yaml
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.1
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.0.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: nginx-default
namespace: nginx
spec:
controller: k8s.io/ingress-nginx
kubectl apply -f ingressclass_default.yaml
修改nginx-ingress.yaml,指定ingressClassName使用刚才创建的class:nginx-default
spec:
ingressClassName: nginx-default
rules:
apply一下yaml文件
kubectl apply –f nginx-ingress.yaml
查看ingress状态,确认Address字段已经显示NodeIP。
在PC浏览器重新访问ngxin.k8s.com,已经可以显示。
kubernetes docs
yaml文件查找及使用
ingress-controller部署模式
ingress-controller部署
大家参阅中有疑问的欢迎一起讨论,在讨论中共同成长!