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的部署蕴含以下镜像:
- jflyfox-db: 这个镜像里只蕴含数据库脚本
- jflyfox-web: 这个镜像里只蕴含war文件
- busy-box: 用来执行shell命令
- mysql : 用来执行sql初始化
- tomcat: 用来运行war包程序
web部署还蕴含两个共享的volume,即app-volume和db-volume,这两个volume都是用空目录申明的,只是为了实现tomcat容器和mysql容器可能读取到jflyfox-db和jflyfox-web中的数据库文件和war文件。
web的部署过程:
执行initContainer容器:
- sql-copy: 拷贝sql文件到共享目录
- web-init : 拷贝war包到共享目录
- init-mysql: 期待mysql服务启动(由db.yaml启动的pod)
- sql-init : 执行初始化sql
- 启动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的的第一个容器部署吧!
常见问题
数据库为什么不做长久化?
这里只是一个入门demo,次要解释如何实现一个最简略的web利用的部署,不是生产级别的利用部署计划,不引入太简单的内容。
tomcat和war包为什么不放在一起?
个别war包是常常变动的,tomcat是始终不变的,做成两个容器镜像的益处是利用镜像足够小,不须要冗余文件。并且通过镜像治理war包,能够很好的建设版本治理。
部署helm的时候呈现谬误:
missing key "meta.helm.sh/release-name": must be set to
个别是因为以后namespace下有抵触的资源,例如service,deployment,或者pod,清理掉再试,或者创立一个全新的命名空间用来部署。