当前项目基于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是一个文件夹
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。