ingress实现外部访问k8s
IngressKubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress。Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。Ingress 是什么?Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。下面是一个将所有流量都发送
Ingress
Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress。
Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。
Ingress 是什么?
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。
使用Ingress的好处:
端口管理。减少不必要端口暴露,便于管理。
所有的请求,通过Ingress对应的IP:PORT进入,过滤/转发/负载均衡到相应的service/pod。
NodePort会在每个node上暴露对应的port,不便管理。
环境准备
你必须安装 Ingress 控制器 才能使用 Ingress。
你需要先安装 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。
1.创建deployment
[root@master k8s]# vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
---
kind: Service
apiVersion: v1
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@master k8s]# vim httpd.yaml
metadata:
name: httpd
spec:
replicas: 3
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: default-http-backend #创建一个默认的service,当访问ingress地址找不到时访问默认地址,否则ingress会报错!!!
namespace: kube-system
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
2.部署Ingress
2.1 下载Ingress文件
[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml
2.2 修改yaml文件
[root@master yaml]# vim deploy.yaml
......
spec:
hostNetwork: true #本地网络访问
dnsPolicy: ClusterFirst
containers:
- name: controller
image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
imagePullPolicy: IfNotPresent
......
# kubectl apply -f deploy.yaml
2.3 查看
namespace为ingress-nginx
[root@master k8s]# kubectl get pod -o wide -n ingress-nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-cmkfl 0/1 Completed 0 33m 10.244.2.9 node3 <none> <none>
ingress-nginx-admission-patch-rndpw 0/1 Completed 0 33m 10.244.1.8 node1 <none> <none>
ingress-nginx-controller-5f7f7f888f-29lnm 1/1 Running 0 32m 10.244.1.9 node1 <none> <none>
3.基于httpd的访问
3.1 创建对应的Ingress规则
[root@master k8s]# vim ingress-httpd.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: www.sjxt.com
http:
paths:
- path: /nginx
backend:
serviceName: nginx-svc
servicePort: 80
- path: /httpd
backend:
serviceName: httpd-svc
servicePort: 80
3.2 查看对应规则的详细信息
[root@master k8s]# kubectl describe ingresses web-ingress
Name: web-ingress
Namespace: default
Address: 192.168.80.192
Default backend: default-http-backend:80 (<none>) #此处有坑,对应前面httpd.yaml里要增加default-http-backend服务
Rules:
Host Path Backends
---- ---- --------
www.sjxt.com
/nginx nginx-svc:80 (10.244.1.3:80,10.244.2.3:80,10.244.3.5:80)
/httpd httpd-svc:80 (10.244.1.4:80,10.244.2.4:80,10.244.3.6:80)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------#此处有坑,前面报没有default-http-backend服务时不会创建这两个events,httpd.yaml增加增加default-http-backend后需要将ingress-httpd.yaml delete再apply
Normal CREATE 36m nginx-ingress-controller Ingress default/web-ingress
Normal UPDATE 35m nginx-ingress-controller Ingress default/web-ingress
3.4 访问
[root@master k8s]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
web-ingress <none> www.sjxt.com 192.168.80.192 80 61m
www.sjxt.com为ingress中rules配置的hosts
ingress也是pod,k8s_POD_ingress-nginx-controller在192.168.80.192节点,可以通过污点限制在固定的node
PS:有DNS的话可以设置解析,没有的话必须在host文件下添加域名解析才可访问
windows:C:\Windows\System32\drivers\etc\
linux:/etc/hosts
[root@client ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.192 wwww.ingress.com
[root@master k8s]# kubectl get svc -n ingress-nginx #30605端口为访问域名+的端口
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.105.104.184 <none> 80:30605/TCP,443:31251/TCP 61m
ingress-nginx-controller-admission ClusterIP 10.96.69.199 <none> 443/TCP 61m
参考:
https://blog.csdn.net/weixin_45191791/article/details/109956817
https://www.orchome.com/1452
更多推荐
所有评论(0)