案例
为了实验方便,创建如下图所示的模型
创建pod
创建配置文件
创建配置文件
vim tomcat-nginx.yaml
按 i 键
复制粘贴下面内容:
apiVersion: apps/v1
kind: Deployment # 第一个控制器配置
metadata:
name: nginx-deployment # 控制器名
namespace: test
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: nginx-pod # 该控制器 控制 下面 标签是 app: nginx-pod 的pod
template: # pod 模板,是对pod的配置
metadata:
labels:
app: nginx-pod # 指定标签
spec:
containers:
- name: nginx
image: nginx:1.17.1 # nginx 镜像
ports:
- containerPort: 80 # 容器端口
---
apiVersion: apps/v1
kind: Deployment # 第二个控制器配置
metadata:
name: tomcat-deployment # 控制器名
namespace: test
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: tomcat-pod # 该控制器 控制 下面 标签是 app: tomcat-pod 的pod
template: # pod 模板,是对pod的配置
metadata:
labels:
app: tomcat-pod # 指定标签
spec:
containers:
- name: tomcat
image: tomcat:8.5-jre10-slim # tomcat镜像,使用此版本有首页
ports:
- containerPort: 8080 # 容器端口
---
apiVersion: v1
kind: Service # service 配置
metadata:
name: nginx-service
namespace: test
spec:
selector:
app: nginx-pod # 选择 上面 标签是 app: nginx-pod 的 pod
clusterIP: None # service的固定ip,不写就随机分配
type: ClusterIP # 网络类型,只能集群内访问
ports:
- port: 80 # service 端口
targetPort: 80 # 转发给 pod 的端口
---
apiVersion: v1
kind: Service # service 配置
metadata:
name: tomcat-service
namespace: test
spec:
selector:
app: tomcat-pod # 选择 上面 标签是 app: tomcat-pod 的 pod
clusterIP: None # service的固定ip,不写就随机分配
type: ClusterIP # 网络类型,只能集群内访问
ports:
- port: 8080 # service 端口
targetPort: 8080 # 转发给 pod 的端口
按 esc,:wq 保存退出
创建
kubectl create -f tomcat-nginx.yaml
查看
kubectl get svc -n test
执行结果如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP None <none> 80/TCP 48s
tomcat-service ClusterIP None <none> 8080/TCP 48s
Http代理
Ingress规则编写
创建ingress-http.yaml
vim ingress-http.yaml
按 i 键
复制粘贴下面内容:
apiVersion: extensions/v1beta1
kind: Ingress # 配置 Ingress
metadata:
name: ingress-http # Ingress 名字
namespace: test # 所在命名空间
spec:
rules:
- host: nginx.myserver # 域名,必须指定
http: # 使用 http 协议
paths:
- path: / # 上下文,访问 http://nginx.myserver:端口
backend:
serviceName: nginx-service # 将请求转发给上面 service 名字是 nginx-service 的 pod
servicePort: 80 # 该 service 端口
- host: tomcat.myserver # 域名,必须指定
http: # 使用 http 协议
paths:
- path: / # 上下文,访问 http://tomcat.myserver:端口
backend:
serviceName: tomcat-service # 将请求转发给上面 service 名字是 tomcat-service 的 pod
servicePort: 8080 # 该 service 端口
创建 Ingress
kubectl create -f ingress-http.yaml
执行结果如下表示成功:
ingress.extensions/ingress-http created
查看 Ingress
kubectl get ing ingress-http -n test
执行结果如下:
NAME HOSTS ADDRESS PORTS AGE
ingress-http nginx.myserver,tomcat.myserver 10.108.196.2 80 14s
解释:
HOSTS是*,这里没有配置域名,所以显示8ports是80,因为上面配置 Ingress 中,是 http 的配置,所以显示80
查看详情
kubectl describe ing ingress-http -n test
执行结果:
Name: ingress-http
Namespace: test
Address: 10.108.196.2
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
nginx.myserver
/ nginx-service:80 (10.244.1.24:80,10.244.2.10:80,10.244.2.11:80)
tomcat.myserver
/ tomcat-service:8080 (10.244.1.23:8080,10.244.1.25:8080,10.244.2.12:8080)
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-http","namespace":"test"},"spec":{"rules":[{"host":"nginx.myserver","http":{"paths":[{"backend":{"serviceName":"nginx-service","servicePort":80},"path":"/"}]}},{"host":"tomcat.myserver","http":{"paths":[{"backend":{"serviceName":"tomcat-service","servicePort":8080},"path":"/"}]}}]}}
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal UPDATE 6m47s (x2 over 3h18m) nginx-ingress-controller Ingress test/ingress-http
解释:
访问
http://nginx.myserver:ingress 的 service端口,就将请求转发给nginx-service:80 (10.244.1.24:80,10.244.2.10:80,10.244.2.11:80)访问
http://tomcat.myserver:ingress 的 service端口/tomcatser,就将请求转发给tomcat-service:80 (10.244.1.23:8080,10.244.1.25:8080,10.244.2.12:8080)
修改hosts文件
必须通过域名才能访问服务,所以要修改 windows 的 hosts 文件,增加下面配置:
# 访问该域名,是访问 master 服务器
192.168.58.101 nginx.myserver
# 访问该域名,是访问 node1 服务器
192.168.58.102 tomcat.myserver
访问
在本地电脑上访问:
http://nginx.myserver:32099 访问nginx服务
http://tomcat.myserver:32099 访问tomcat服务
提示: 32099 是 ingress 的 service端口,可通过下面命令查看:
kubectl get svc -n ingress-nginx
