之所以用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文件里边没有配这个拿到的机器名)。