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

转载于:https://www.cnblogs.com/nevermorewang/p/9569669.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐