k8s 部署 TCP node应用

之前我们已经成功的将node的http应用部署到k8s集群内,但某些业务不仅仅需要http应用还需要TCP长连接应用,本文将对部署tcp应用的步骤及问题进行总结
本文需要具备一定nodejs基础,涉及框架:koa
为什么采用koa而不是express或其他web框架:koa轻量级,中间件按需加载
相关技术可参考:
centos8部署k8s:《k8s部署》
k8s部署web应用:《k8s部署 nodejs web应用,使用ingress-nginx映射公网》

  1. k8s环境
    linux: centos 8.x
    k8s:1.21
$ kubectl get node -owideNAME         STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME
k8s-master   Ready    control-plane,master   11d   v1.21.0   172.16.66.167   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.10
k8s-node1    Ready    <none>                 11d   v1.21.0   172.16.66.168   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.10
k8s-node2    Ready    <none>                 11d   v1.21.0   172.16.66.170   <none>        CentOS Linux 8   4.18.0-305.19.1.el8_4.x86_64   docker://20.10.10
  1. tcp项目准备
    微服务集群中,单个业务除了需要对外提供服务外,不同业务之间还存在通信
    比如玩家通过tcp服务连接进入我们的游戏服,此时官方通过后台web服务给该用户发放了一封邮件,此时就需要web服务通知到tcp服,那既然tcp有对外开放的接口,为什么web服不会通过tcp通信告诉tcp业务呢?
    第一,由于该端口对外开放,暴露给公网,如果有人通过该tcp端口模拟发送业务消息,会导致安全隐患,简单说,tcp不应该处理玩家操作以外的业务,比如发放奖励邮件。
    第二,由于后台操作频率很低(远远达不到tcp操作的频率),此处如果改用tcp长连接会有一定的资源浪费,http这种通知后就断开的方式被广泛用于业务通知,比如现在的三方支付(微信或支付宝)的异步通知就是通过http/https协议实现
    考虑到这种情况,我们需要在tcp业务中,集成http/https业务
$ vim app/app.js
const net = require("net");
const path = require("path");
const fs = require("fs");
const Koa = require('koa');
const router = require('koa-router')();
const tools = require('./tools/tools')class App {constructor(net) {this.env = process.argv[2] || 'dev';this.tcpPort = 10086;                       //tcp开放端口this.httpPort = 30086;                      //http开放端口this.net = net;                             //tcp实例this.app = new Koa();                       //koa实例this.server = null;//初始化this.init();}//初始化async init() {//启动tcp serverthis.tcpRun();//启动koa http serverthis.koaRun();}//tcp runtcpRun() {this.server = this.net.createServer();this.server.on('listening', () => {console.log('tcp server is listening on port', this.tcpPort);});this.server.on('connection', socket => {console.log('tcp has a new connection', socket.remoteAddress);socket.on('data', data => {data = data.toString();console.log(`client:${socket.remoteAddress}`, data);})this.server.getConnections((err, count) => {console.log(err, count);})// socket.end();// this.server.close();});this.server.on('close', () => {console.log('tcp server is now closed');});this.server.on('error', err => {console.log('Error occurred:', err.message);});this.server.listen(this.tcpPort);}//koa runkoaRun() {this.app.use(router.routes(), router.allowedMethods());//路由配置router.get('/web/login', async (ctx, next) => {ctx.body = 'ok';})this.app.listen(this.httpPort);}
}new App(net);
  1. 编写dockerfile文件并构建镜像
    在app同级文件夹创建Dockerfile文件
$ vim Dockerfile
#运行环境
FROM node:10.15.1
#作者
MAINTAINER [SCH]
#将同级app文件夹加入docker内
ADD app /opt/app
#指定工作目录
WORKDIR /opt/app
#执行语句
RUN npm install
#指定对外开放端口
EXPOSE 10086 30086
#启动命令
CMD ["nohup", "npm", "run", "dev", "&"]

在k8s-node1与k8s-node2节点构建镜像:

#构建镜像并命名为app v1版本
$ docker build -t app:v1 .#查看镜像
$ docker imagesREPOSITORY                                                TAG       IMAGE ID       CREATED         SIZE
app                                                       v1        7d462447d52e   4 days ago      899MB
calico/node                                               v3.20.1   355c1ee44040   8 weeks ago     156MB
calico/pod2daemon-flexvol                                 v3.20.1   55fa5eb71e09   8 weeks ago     21.7MB
calico/cni                                                v3.20.1   e69ccb66d1b6   8 weeks ago     146MB
k8s.gcr.io/ingress-nginx/controller                       v0.48.1   ac0e4fe3e6b0   4 months ago    279MB
registry.aliyuncs.com/google_containers/kube-proxy        v1.21.0   38ddd85fe90e   7 months ago    122MB
registry.aliyuncs.com/google_containers/pause             3.4.1     0f8457a4c2ec   10 months ago   683kB
coredns/coredns                                           1.8.0     296a6d5035e2   12 months ago   42.5MB
registry.aliyuncs.com/google_containers/coredns/coredns   v1.8.0    296a6d5035e2   12 months ago   42.5MB
node                                                      10.15.1   8fc2110c6978   2 years ago     897MB

可以看到app已经成功构建为docker 镜像

  1. 编写yaml文件部署app容器到k8s
$ vim app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deployment
spec:selector:matchLabels:app: appreplicas: 6                          #启动6个app容器副本template:metadata:labels:app: appspec:containers:- name: appimage: appports:- containerPort: 10086         #对外开放端口 10086与30086- containerPort: 30086---apiVersion: v1
kind: Service                          #使用service统一副本的入口
metadata:name: app-service
spec:selector:app: appports:- protocol: TCPname: tcpport: 10086targetPort: 10086- protocol: TCPname: httpport: 30086targetPort: 30086
$ kubectl apply -f app.yaml$ kubectl get pod -owideNAME                                     READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
app-deployment-56d8495cd8-6b4jt          1/1     Running   0          3d23h   10.244.36.91     k8s-node1   <none>           <none>
app-deployment-56d8495cd8-cphqj          1/1     Running   0          3d23h   10.244.36.92     k8s-node1   <none>           <none>
app-deployment-56d8495cd8-dtpkx          1/1     Running   0          3d23h   10.244.169.144   k8s-node2   <none>           <none>
app-deployment-56d8495cd8-q59xm          1/1     Running   0          3d23h   10.244.36.90     k8s-node1   <none>           <none>
app-deployment-56d8495cd8-vphbn          1/1     Running   0          3d23h   10.244.169.145   k8s-node2   <none>           <none>
app-deployment-56d8495cd8-w4g2g          1/1     Running   1          3d23h   10.244.36.89     k8s-node1   <none>           <none>

此时已经成功部署app到两个节点内

  1. 部署ingress规则
$ vim app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: app-ingressnamespace: defaultannotations:kubernetes.io/ingress.class: "nginx"nginx.ingress.kubernetes.io/affinity: "cookie"nginx.ingress.kubernetes.io/affinity-mode: "persistent"nginx.ingress.kubernetes.io/session-cookie-name: "route"
spec:rules:- host: k8s.test.com            #指定域名http:paths:- path: /tcp                  #一级路由        pathType: Prefix            #匹配规则 Prefix:前缀backend:service:name: app-service        #指向的serviceport:number: 30086          #对应的service暴露的端口
$ kubectl apply -f app-ingress.yaml

此时我们已经将http30086端口开放对外,后面如果该业务只用于接收内部请求,可以通过阿里云安全组或linux防火墙对该端口的请求IP进行管控

  1. 部署tcp-ingress tcp配置参数
$ vim tcp.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: ingress-nginx
data:10086: "default/app-service:10086"  #端口名:"ns名/service名:端口"
$ kubectl apply -f tcp.yaml
  1. 修改ingress-controller配置
    在args添加- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
$ ingress.yaml
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
#kind: Deployment
#apiVersion: extensions/v1beta1
# 修改为DaemonSet类型,随每个node节点创建和删除,配合污点容忍可以实现ingress-nginx高可用
kind: DaemonSet
metadata:labels:helm.sh/chart: ingress-nginx-3.34.0app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/version: 0.48.1app.kubernetes.io/managed-by: Helmapp.kubernetes.io/component: controllername: ingress-nginx-controllernamespace: ingress-nginx
spec:selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controllerrevisionHistoryLimit: 10minReadySeconds: 0template:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controllerspec:dnsPolicy: ClusterFirst#开启本机网络hostNetwork: truecontainers:- name: controllerimage: k8s.gcr.io/ingress-nginx/controller:v0.48.1imagePullPolicy: IfNotPresentlifecycle:preStop:exec:command:- /wait-shutdownargs:- /nginx-ingress-controller- --election-id=ingress-controller-leader- --ingress-class=nginx- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller- --validating-webhook=:8443- --validating-webhook-certificate=/usr/local/certificates/cert- --validating-webhook-key=/usr/local/certificates/key- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
$ kubectl apply -f ingress.yaml

此时我们已经将10086端口通过ingress-nginx配置对外开放,在本地执行tcp连接测试连接到
k8s.scbczx.com:10086已经成功访问
若有不正确,欢迎指出

k8s 部署 TCP node应用相关推荐

  1. k8s部署dashboard

    1.dashboard概述 Dashboard是基于网页的Kubernetes用户界面.您可以使用Dashboard将容器应用部署到Kubernetes集群中,也可以对容器应用排错,还能管理集群资源. ...

  2. docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...

  3. 【云原生 | Kubernetes 系列】1个POD2个container实现Wordpress K8s部署

    1. Wordpress架构 2. 构建wordpress镜像 2.1 构建nginx-base-wordpress镜像 Dockerfile FROM harbor.intra.com/baseim ...

  4. 记一次阿里云k8s部署-测试存储

    记一次阿里云k8s部署 阿里云资源准备 服务器 ip 角色 资源 192.168.1.160 master1 2核4G 192.168.1.161 master2 2核4G 192.168.1.162 ...

  5. 原生K8S部署pig微服务项目

    原生K8S部署pig微服务项目 简介 项目地址:码云 Pig微服务项目 基于 Spring Cloud 2021 .Spring Boot 2.7. OAuth2 的 RBAC 权限管理系统 基于数据 ...

  6. k8s部署redis集群

    K8S部署Redis Cluster集群 kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis ...

  7. 【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战

    上一篇博文介绍了如何独立部署一个高可用的Flink集群,本篇介绍如何用Native k8s去部署高可用的Flink 集群.本篇介绍的集群构建在AWS上,和构建在自己的服务器相比,主要区别在文件系统的选 ...

  8. k8s部署weave scope可视化工具

    Weave Scope 是一款 Docker 和 Kubernetes 的可视化监控工具.它提供了自上而下的应用程序视图以及整个基础架构视图,用户可以轻松对分布式的容器化应用进行实时监控和问题诊断,以 ...

  9. K8S部署工具:KubeOperator安装部署

    K8S部署工具:KubeOperator安装部署 硬件要求⚓︎ 最小化配置 角色 CPU核数 内存 系统盘 数量 部署机 4 8G 100G 1 Master 4 8G 100G 1 Worker 4 ...

最新文章

  1. 目前研制量子计算机,18个量子比特纠缠究竟是什么水平? 量子计算机离我们还有多远?...
  2. C语言运算符优先级和口诀(转)
  3. golang 多行字符串 字符串太长分行写
  4. 3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果
  5. 高擎信息安全大旗,打造“互联网+”新服务模式
  6. iOS截取视频预览图,截图方向错误的解决
  7. C语言汉诺塔问题的递归算法
  8. 浅谈软件项目中的需求分析与需求管理
  9. 大数据hadoop组件下载、windows环境搭建、官方文档查看详细步骤
  10. 数据库异常用户sa登录失败_轻松解决SQLserver2014出现“用户sa登录失败 错误18456”的问题-网络教程与技术 -亦是美网络...
  11. 论坛网站进行帖子保存php,PHPwind论坛专用采集器
  12. ssb的matlab仿真,线性调制AM、DSB、SSB的MATLAB仿真代码
  13. 测试工程师的能力分类
  14. python replace 空格数据处理
  15. 【解决】CSS下拉菜单不会显示的问题
  16. 如何正确地学习Java
  17. hive(一) hive背景知识介绍-数据仓库技术简介
  18. 2015北京宇信易诚科技面试题
  19. Arm汇编寻址方式工作模式
  20. FOMO3D的超万倍奖金,自导自演or黑天鹅事件?

热门文章

  1. 关于ShareSDK的图文分享
  2. conda配置python混合开发环境一站式入门【全平台】
  3. vim插件——vim-surround
  4. 《Nature-Inspired Metaheuristic Algorithms》—— Random Walk
  5. 苹果手机计算机隐藏应用,超实用!15个苹果手机的隐藏功能,不看你手机就白买了!...
  6. Sublime Text3批量更改文件内容
  7. matlab绘制四棱台,几何画板怎么画正四棱台
  8. python打印pdf文件_Python静默打印PDF到特定的打印机
  9. 微信网页版营销软件 防撤回 自动同意加好友
  10. 测试-答对5道题的人是天才,答对4道的是帅才,答对3道的是将才,答对2道的是奇才,答对1道的是人才