跳转至

Kubernetes 暴露应用


2020-04-28 by dongnan

开始之前

在前面的三篇文章中,至此我们已经准备好了K8S集群环境。

接下来我们将以在K8S集群运行一个真实的项目为目标,依次介绍项目所使用的K8S资源对象。

这个项目是一个典型的Web系统,使用 Java Spring Boot框架开发,需要使用 MySqlRedis数据库、NFS共享存储(多个Pod容器间共享文件)。

由于K8S环境部署在阿里云上,所以这里使用了阿里云提供的 RDS-MysqlRDS-Redis 数据库服务、NAS(NFS) 网络附加存储等中间件产品,对于K8S集群来说,我们需要将这些服务映射为K8S的资源对象。

项目使用的K8S的资源对象包括:

环境

测试的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 命名空间,并关联相同NameSpaceyyi-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 控制器才能生效使用。
  • ingressServicePod 等对象是Kubernetes实战项目三个重要组件。

参考

回到页面顶部