专栏首页用户7113604的专栏kubernetes部署应用简明demo
原创

kubernetes部署应用简明demo

当前项目基于kubernetes运行和部署,挑选了核心且基本的步骤做一个demo。

A和B两个应用,A作为server,在内部公开一个接口,返回主机名(以下srvu),B接收外部HTTP请求,并调用A的接口(以下callu)。

定义Deployment为A和B两个应用创建POD

apiVersion: apps/v1
kind: Deployment
metadata:
  name: call-deployment
  labels:
    app: call
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: call
  template:
    metadata:
      labels:
        app: call
    spec:
      containers:
      - name: call
        image: callu:1
        env:
        - name: rpc.server.host
          valueFrom:
            configMapKeyRef:
              name: myconf
              key: rpc.server.host
        - name: rpc.server.port
          valueFrom:
            configMapKeyRef:
              name: myconf
              key: rpc.server.port
        ports:
        - containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: srvu-deployment
  labels:
    app: srvu
spec:
  replicas: 2
  selector:
    matchLabels:
      app: srvu
  template:
    metadata:
      labels:
        app: srvu
    spec:
      containers:
      - name: srvu
        image: srvu:1
        ports:
        - containerPort: 15001

A应用服务工作在15001,B应用通过环境变量获取A的地址和端口号,值来源于configmap。其中host是srvu的服务名。

apiVersion: v1
kind: ConfigMap 
metadata: 
  name: myconf
data:
  rpc.server.host: srvu-service
# 数字用引号  
  rpc.server.port: "15001"

通过定义service将服务暴露出去,A只需要内部访问,所以用默认clustip即可

apiVersion: v1
kind: Service
metadata:
  name: srvu-service
spec:
  selector:
    app: srvu
  ports:
  - protocol: TCP
    port: 15001
    targetPort: 15001

此处metadata下的name的值和configmap中的host相同。

B应用需要向集群外暴露,使用不怎么推荐的node port是最简单的方式

apiVersion: v1
kind: Service
metadata:
  name: call-service
spec:
  type: NodePort
  selector:
    app: call
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 31808

部署完成后效果

在node上执行的效果

 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-998j2
 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-jtwtg
 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-998j2
 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-998j2
 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-998j2
 curl http://127.0.0.1:31808/call?key=advb
srvu-deployment-8685bd447f-jtwtg

在我的例子中使用java编写以上两个应用,打包成docker image。

在以上例子中环境变量包含'.',刚开始docker file中写的

ENTRYPOINT ["/bin/sh", "callu.sh"]

启动后无法获取到环境变量,因sh不支持,所以在做例子的时候要记得改成bash或者直接使用java等命令运行应用。

如果你想将配置挂在成文件系统上的一个文件

kubectl create configmap my-config --from-file=path/to/bar
apiVersion: v1
data:
  fcon.yml: |
    rpc.server.host=srvu-service
    rpc.server.port=15001
kind: ConfigMap
metadata:
  name: fconf
apiVersion: apps/v1
kind: Deployment
metadata:
  name: call-deployment
  labels:
    app: call
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: call
  template:
    metadata:
      labels:
        app: call
    spec:
      containers:
      - name: call
        image: callu:1
        volumeMounts:
        - name: confvol
          mountPath: "/app/serverinfo.prop"
          subPath: fcon.yml
        ports:
        - containerPort: 8080
      volumes:
      - name: confvol
        configMap:
          name: fconf

/app/serverinfo.prop就包含了fcon.yml的内容。此处必须填写subPath,否则serverinfo.prop是一个文件夹

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java ClassLoader加载class过程

    关于class loader有太多太多的文章和图来讲过程。我就不多说了。以下是我认为的一些要点。

    小金狗子
  • 一简单线程同步笔试题分享,欢迎纠错分享更多思路

    有线程:worker1、worker2 ,work1只能累加奇数、work2累加偶数,

    小金狗子
  • ReentranLock源码浅析

    常用的lock方法具体实现是在FairSync和NonfairSync。Nonfaire体现在lock时尝试直接获取锁,如果获取失败,则使用和公平锁一样通过Ab...

    小金狗子
  • SolrCloud

    SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据...

    一点博客
  • 优步司机二三事

    我这人反应从来慢半拍。优步和滴滴刚开始大战的时候,我没有赶上。去年6月开始用优步,一直用到现在。

    王树义
  • Golang URL解析

    Golang URL解析 今天利用课余时间看了一下Go语言的URL解析,于是就实践了一下,为了大家一起学习交流,故贴出来和大家一起分享,如有什么错误,请各位大神...

    李海彬
  • android开发之关闭所有的activity的方法

    当app中打开了多个activity的时候,由于进入的比较深,所以,很多app不得不让用户一步一步退回到第一个界面(MainActivity),在一步一步退回的...

    砸漏
  • Python自省与反射

    自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasat...

    宇宙之一粟
  • JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解

    DOM 是 W3C(万维网联盟)的标准。 DOM 定义了访问 HTML 和 XML 文档的标准: “W3C 文档对象模型 (DOM) 是中立于平台和语言...

    谙忆
  • 关于大数据的实战技术

    大数据范围越来越广,随着不同应用的爆发式增长,数据分析正在被更多行业企业所知晓并实践,比如互联网、金融、零售、医疗、以及制造业等。与此同时,对于统计分析系统...

    静一

扫码关注云+社区

领取腾讯云代金券