k8s 是一个容器利用的根底运行环境,那么对于初学者来说,如何在 k8s 上部署本人的利用呢?本文介绍几种最简略的,适宜初学者理解部署过程的几种办法:
- 通过 kubectl apply 间接部署
- 通过 helm 部署
kubectl apply
适宜部署单个 Pod,如果 Pod 较多,部署构造比较复杂,就须要应用编排来实现。Helm 是当下最适宜做 K8s 利用部署的编排工具,通过 Helm 能够申明一组 Pod,由一个 Helm 包部署一整个应用程序。
本文不介绍 Helm 的装置了,大家能够自行搜寻。
通过 Helm 部署利用
创立 Helm 包
~ helm create jflyfox
Creating jflyfox
helm 包中的目录构造如下: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.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: mysql
spec:
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.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: web
spec:
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 jflyfox
jflyfox-0.1.0.tgz
Helm 部署
~ helm install jflyfox-0.1.0.tgz jflyfox
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /Users/jason/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /Users/jason/.kube/config
NAME: jflyfox-0.1.0.tgz
LAST DEPLOYED: Thu Jun 17 14:26:39 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST 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,清理掉再试,或者创立一个全新的命名空间用来部署。