之所以用k8s来部署应用,就是因为k8s可以灵活的控制集群规模,进行扩充或者收缩。生产上我们要配置的参数较多,命令行的方式显然不能满足需求,我们应该使用基于配置文件的方式。接下来做一个部署的demo:
-------------------------------------------------------------------------------------------------------------------------------
  场景:一个数据库,一个应用程序,数据库要暴露接口,并把数据挂载到物理机上,应用程序连接数据库,正常启动。
数据库yaml文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: db-service
labels:
name: db-service
spec:
replicas: 1
template: # template就是对pod对象的定义
metadata:
labels:
name: db-service
spec:
restartPolicy: Always
containers:
- name: db-service
image: postgres:latest
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data #容器中的路径
volumes:
- name: data
hostPath:
path: /Users/nm/Desktop/pgdata1 #物理机路径
---
apiVersion: v1
kind: Service
metadata:
name: db-service
labels:
name: db-service
spec:
type: NodePort
ports:
- nodePort: 30000 #对外端口
port: 5432 #集群内部端口
targetPort: 5432 #对应的容器端口
protocol: TCP
selector:
name: db-service
  需要注意的是各个name要统一(没理清究竟哪些要保持统一),挂载的卷,此示例是本机的写法,如果是其它机器的共享盘,应采用如下方式

程序的yaml文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: aaaa-service
labels:
name: aaaa-service
spec:
replicas: 1
template: # template就是对pod对象的定义
metadata:
labels:
name: aaaa-service
spec:
restartPolicy: Always
containers:
- name: aaaa-service
image: aaaaapp:v3
ports:
- containerPort: 80
- containerPort: 8761
- containerPort: 9080
- containerPort: 9081 volumeMounts:
- name: startscript
mountPath: /opt/config
volumes:
- name: startscript
hostPath:
path: /Users/nm/Desktop/deploy/web/config
---
apiVersion: v1
kind: Service
metadata:
name: aaaa-service
labels:
name: aaaa-service
spec:
type: NodePort
ports:
- nodePort: 30001
port: 80
name: nginx
targetPort: 80
protocol: TCP
- nodePort: 30002
port: 8761
name: eureka
targetPort: 8761
protocol: TCP
- nodePort: 31000
port: 9080
name: web
targetPort: 9080
protocol: TCP
- nodePort: 31001
port: 9081
name: ms
targetPort: 9081
protocol: TCP
selector:
name: aaaa-service
  注意,程序中访问数据库的方式:jdbc:postgresql://db-service:5432/mytest,这个db-service就是上文中数据库的service的名字,在集群中会被kube-proxy解析为具体的集群内部ip。

--------------------------------------------------
  需要吐槽的是mac上的docker for mac自带的k8s,由于docker-hyperkit这个组件的bug,仍然很难使用,会导致cpu暴涨。我本地是有三个pod,然后就卡死了:

  查了下,还挺多人有这个问题,官方的ssues也有不少人提这个bug,但,,,目前仍未修复,我的docker for mac版本是18.06.0

  k8s学习过程中,挺多的坑都是docker组件或者minikube的一些bug导致的,可能是在mac平台没怎么优化的问题吧。不得不说,这一点上,挺坑的。
------------------------------------------------
  生产环境部署完了,又碰到几个小坑:
  1、k8s不同版本的命令有差别,我本地1.10版本,起服务直接kubectl create -f 即可;服务器是1.5,需要kubectl -s  k8s的serverip:port create -f ;
    一开始不知道这个细节,还以为集群环境配错了,这个绕了一下;
  2、eureka的生产者配置,这个算是自己学艺不精留下的坑;如果服务要注册到eureka server上,供他人使用,需要eureka.instance.preferIpAddress=true;
    因为spring cloud默认是把机器名注册到eureka server了,而不是本机的ip,不配置这个,别的service从eureka拿到的实例地址是机器名称,会报host lost之类的错误(因为pod中的hosts文件里边没有配这个拿到的机器名)。
 

 

最新文章

  1. 关于自己写C++的一点风格
  2. 移动web app开发必备 - 异步队列 Deferred
  3. Perplexity Vs Cross-entropy
  4. 哈夫曼树(一)之 C语言详解
  5. 枚举 + 进制转换 --- hdu 4937 Lucky Number
  6. 转 Delphi中使用FastMM4结合View CPU避免内存泄漏
  7. .NET 强引用和弱引用
  8. Cocos2d-x中__Dictionary容器以及实例介绍
  9. iOS应用架构谈 开篇 (转)
  10. Android(java)学习笔记261:JNI之编写jni程序适配所有处理器型号
  11. 使用border-image实现类似iOS7的1px底边
  12. 浅谈Jquery的使用上篇
  13. Hibernate 乐观锁(Optimistic Locking)
  14. POJ-1915 Knight Moves (BFS)
  15. 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
  16. python实现简体中文和繁体相互转换
  17. python之import模块及包的调用
  18. 040 Http与RPC
  19. shell if [[ ]]和[ ]区别 || &&
  20. Oracle的regexp_instr函数简单用法

热门文章

  1. HTML5游戏开发进阶指南 中文pdf扫描版​
  2. IOS 防坑指南
  3. Xamarin.Forms之UserDialogs 重制版本
  4. Ajax GET
  5. CHNetRequest网络请求
  6. UI控件的位置
  7. Codeforces Round #549 (Div. 2)A. The Doors
  8. vue2.0使用ES6语法
  9. 洛谷P4724 【模板】三维凸包
  10. 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?