Kubernetes 暴露应用
2020-04-28 by dongnan
开始之前
在前面的三篇文章中,至此我们已经准备好了K8S
集群环境。
接下来我们将以在K8S
集群运行一个真实的项目为目标,依次介绍项目所使用的K8S
资源对象。
这个项目是一个典型的Web
系统,使用 Java Spring Boot
框架开发,需要使用 MySql
、Redis
数据库、NFS
共享存储(多个Pod
容器间共享文件)。
由于K8S
环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-Mysql
、RDS-Redis
数据库服务、NAS(NFS)
网络附加存储等中间件产品,对于K8S
集群来说,我们需要将这些服务映射为K8S
的资源对象。
项目使用的K8S
的资源对象包括:
- PV&PVC,用于Pod数据卷(NFS)。
- Pod (volumeMounts、readinessProbe),挂载数据卷、健康检查。
- Secret,存储机密数据。
- Service,服务-外部域名(ExternalName)。
- NetworkPolicy,网络策略。
- LimitRange,限制资源。
- Ingress 暴露应用。
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
目标
通过 Ingress 访问K8S内部的应用 这篇文章使用Ingress
访问K8S
集群内部的应用。
本篇文章作为实战项目中的最后部分,同样地使用ingress
暴露部署的Web
应用程序。
举个栗子
Yaml文档
定义 Ingress
对象:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
namespace: yyi-prod
name: prod-yyi
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "prd-yyi"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
spec:
rules:
- host: yyi.xyc.com
http:
paths:
- path: /
backend:
serviceName: yyi-server-svc
servicePort: 80
这个 ingress
对象做了以下规定:
ingress
对象属于yyi-prod
命名空间,并关联相同NameSpace
的yyi-server-svc
SVC。- 对于多个后端
Pod
容器,采用cookie
植入的会话保持的方式,保证请求始转发到相同的后端Pod
容器。 - 对于上游的
Pod
容器,设置了Ingress
控制器的连接、发送、读取等超时参数。 - 访问域名
yyi.xyc.com
控制器会将请求发送到yyi-server-svc
服务关联的Pod
(只是关联,请求并不通过SVC
)。
创建 Ingress
kubectl apply -f yii-ingress.yaml
验证
查看 Ingress
详细信息:
kubectl -n yyi-prod describe ingresses. prod-yyi
Name: prod-yyi
Namespace: yyi-prod
Address: 172.19.xxx.223
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
yyi.xyc.com
/ yyi-server-svc:80 (172.18.68.120:80)
Annotations:
#...省略
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/proxy-connect-timeout: 300
nginx.ingress.kubernetes.io/proxy-read-timeout: 600
nginx.ingress.kubernetes.io/proxy-send-timeout: 600
nginx.ingress.kubernetes.io/session-cookie-expires: 172800
nginx.ingress.kubernetes.io/session-cookie-max-age: 172800
Events: <none>
在集群外部成功访问项目系统:
curl -IL -H "Host:yyi.xyc.com" -k https://39.98.xx.1xx
HTTP/2 200
date: Fri, 15 May 2020 03:12:18 GMT
content-type: text/html; charset=utf-8
content-length: 944
set-cookie: prod-yyi=1639537939.598.9512.607559; Expires=Fri, 17-May-20 03:12:18 GMT; Max-Age=172800; Path=/; HttpOnly
last-modified: Thu, 01 Apr 2020 07:00:43 GMT
etag: "60dxxx1b-3b0"
xcontent-type-options: nosniff
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
accept-ranges: bytes
set-cookie: SERVERID=28d8a11321xxxa9b8c67ba385754|16395xx938|16395xx938;Path=/
小结
ingress
是暴露从集群外部到集群内服务的HTTP/HTTPS
路由规则。ingress
对象资源要基于Ingress
控制器才能生效使用。ingress
、Service
、Pod
等对象是Kubernetes
实战项目三个重要组件。