k8s是一个容器利用的根底运行环境,那么对于初学者来说,如何在k8s上部署本人的利用呢?本文介绍几种最简略的,适宜初学者理解部署过程的几种办法:

  • 通过kubectl apply间接部署
  • 通过helm部署
    kubectl apply适宜部署单个Pod,如果Pod较多,部署构造比较复杂,就须要应用编排来实现。Helm是当下最适宜做K8s利用部署的编排工具,通过Helm能够申明一组Pod,由一个Helm包部署一整个应用程序。

本文不介绍Helm的装置了,大家能够自行搜寻。

通过Helm部署利用

创立Helm包

~ helm create jflyfoxCreating jflyfoxhelm 包中的目录构造如下:jflyfox/├── .helmignore   # Contains patterns to ignore when packaging Helm charts.├── Chart.yaml    # Information about your chart├── values.yaml   # The default values for your templates├── charts/       # Charts that this chart depends on└── templates/    # The template files    └── tests/    # The test files

间接删除templates中的所有文件(个别是没用的测试文件或者demo),间接创立本人的template即可。

申明DB

~ touch templates/db.yamlapiVersion: v1kind: Servicemetadata:  name: mysqlspec:  ports:  - port: 3306  selector:    app: mysql  clusterIP: None---apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata:  name: mysqlspec:  selector:    matchLabels:      app: mysql  replicas: 1  template:    metadata:      labels:        app: mysql    spec:      containers:      - image: mysql:5.6        name: mysql        imagePullPolicy: Always        env:          # Use secret in real usage        - name: MYSQL_ROOT_PASSWORD          value: password        resources:          limits:            cpu: "1"            memory: 512Mi          requests:            cpu: "1"            memory: 512Mi        ports:        - containerPort: 3306          name: mysql

如上所示,该template用来创立一个mysql,并通过service代理。

申明tomcat

再创立一个tomcat,如下:

web的部署蕴含以下镜像:

  1. jflyfox-db: 这个镜像里只蕴含数据库脚本
  2. jflyfox-web: 这个镜像里只蕴含war文件
  3. busy-box: 用来执行shell命令
  4. mysql : 用来执行sql初始化
  5. tomcat: 用来运行war包程序

web部署还蕴含两个共享的volume,即app-volume和db-volume,这两个volume都是用空目录申明的,只是为了实现tomcat容器和mysql容器可能读取到jflyfox-db和jflyfox-web中的数据库文件和war文件。

web的部署过程:

  1. 执行initContainer容器:

    1. sql-copy: 拷贝sql文件到共享目录
    2. web-init : 拷贝war包到共享目录
    3. init-mysql: 期待mysql服务启动(由db.yaml启动的pod)
    4. sql-init : 执行初始化sql
  2. 启动tomcat容器
~ touch templates/web.yamlapiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata:  name: webspec:  selector:    matchLabels:      app: web  replicas: 1  template:    metadata:      labels:        app: web    spec:      initContainers:      - image: registry.bingosoft.net/cmp/jfyfox-db:1.0        name: sql-copy        resources:          limits:            cpu: "0.5"            memory: 256Mi          requests:            cpu: "0.5"            memory: 256Mi        command: ['cp','/install/mysql.sql','/data']        volumeMounts:        - mountPath: /data          name: db-volume      - image: registry.bingosoft.net/cmp/jflyfox-web:2.0        name: web-init        resources:          limits:            cpu: "0.5"            memory: 256Mi          requests:            cpu: "0.5"            memory: 256Mi        command: ['cp','/install/jflyfox.war','/app']        volumeMounts:        - mountPath: /app          name: app-volume      - name: init-mysql        image: busybox:1.31        resources:          limits:            cpu: "0.5"            memory: 256Mi          requests:            cpu: "0.5"            memory: 256Mi        command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql; sleep 2; done;']      - image: mysql:5.6        name: sql-init        resources:          limits:            cpu: "0.5"            memory: 256Mi          requests:            cpu: "0.5"            memory: 256Mi        command: ['sh','-c','mysql -u root -h mysql -ppassword  < /data/mysql.sql']        volumeMounts:        - mountPath: /data          name: db-volume      containers:      - image: registry.bingosoft.net/library/tomcat:8-jdk8        name: tomcat        imagePullPolicy: Always        resources:          limits:            cpu: "1"            memory: 512Mi          requests:            cpu: "1"            memory: 512Mi        volumeMounts:        - mountPath: /usr/local/tomcat/webapps          name: app-volume        ports:        - containerPort: 8080      volumes:      - name: app-volume        emptyDir: {}      - name: db-volume        emptyDir: {}

Helm 打包

yaml编写实现后,须要打包为helm包:

~ helm package jflyfoxjflyfox-0.1.0.tgz

Helm部署

~ helm install jflyfox-0.1.0.tgz jflyfoxWARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /Users/jason/.kube/configWARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /Users/jason/.kube/configNAME: jflyfox-0.1.0.tgzLAST DEPLOYED: Thu Jun 17 14:26:39 2021NAMESPACE: defaultSTATUS: deployedREVISION: 1TEST SUITE: None

各位能够参考这个最简略的web利用的部署思路,筹备sql包和war包,开始k8s的的第一个容器部署吧!

常见问题

  1. 数据库为什么不做长久化?

    这里只是一个入门demo,次要解释如何实现一个最简略的web利用的部署,不是生产级别的利用部署计划,不引入太简单的内容。

  2. tomcat和war包为什么不放在一起?

    个别war包是常常变动的,tomcat是始终不变的,做成两个容器镜像的益处是利用镜像足够小,不须要冗余文件。并且通过镜像治理war包,能够很好的建设版本治理。

  3. 部署helm的时候呈现谬误:missing key "meta.helm.sh/release-name": must be set to

    个别是因为以后namespace下有抵触的资源,例如service,deployment,或者pod,清理掉再试,或者创立一个全新的命名空间用来部署。