前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes部署应用简明demo

kubernetes部署应用简明demo

原创
作者头像
小金狗子
修改2021-03-19 14:16:19
6270
修改2021-03-19 14:16:19
举报

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

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

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

代码语言:yaml
复制
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的服务名。

代码语言:yaml
复制
apiVersion: v1
kind: ConfigMap 
metadata: 
  name: myconf
data:
  rpc.server.host: srvu-service
# 数字用引号  
  rpc.server.port: "15001"

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

代码语言:yaml
复制
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是最简单的方式

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: call-service
spec:
  type: NodePort
  selector:
    app: call
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 31808

部署完成后效果

在node上执行的效果

代码语言:javascript
复制
 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等命令运行应用。

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

代码语言:yaml
复制
kubectl create configmap my-config --from-file=path/to/bar
代码语言:yaml
复制
apiVersion: v1
data:
  fcon.yml: |
    rpc.server.host=srvu-service
    rpc.server.port=15001
kind: ConfigMap
metadata:
  name: fconf
代码语言:javascript
复制
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是一个文件夹

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档