乐趣区

关于kubernetes:K8s通过Helm部署入门

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 的部署蕴含以下镜像:

  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.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 的的第一个容器部署吧!

常见问题

  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,清理掉再试,或者创立一个全新的命名空间用来部署。

退出移动版