帮酷LOGO
0 0 评论
文章标签:Docker  COM  Kubernetes  DOCK  DOC  Docker Compose  流程  Compose  

介绍

在本教程中,你将使用kompose将组合服务转换为Kubernetes 对象,你将使用kompose作为起点提供的对象定义,以确保安装程序以Kubernetes期望的方式使用SecretsServicespersistentVolumeClaims,在本教程结束时,你将拥有一个单实例Node.js应用程序,并在Kubernetes集群上运行MongoDB数据库。

前提条件

启用了基于角色的访问控制(RBAC )的Kubernetes 110+集群,安装在本地计算机或开发服务器上的kubectl命令行工具,并配置为连接到群集,Docker安装在本地计算机或开发服务器上。

步骤1-安装kompose

开始使用kompose,导航到项目的GitHub版本页面在本文中,将此链接粘贴到下面的curl命令中,以下载最新版本的kompose :


curl -L https://github.com/kubernetes/kompose/releases/download/v1.18.0/kompose-linux-amd64 -o kompose

使二进制可执行文件成为:


chmod +x kompose

移动到你的PATH


sudo mv ./kompose /usr/local/bin/kompose

要验证是否已正确安装,你可以进行版本检查:


kompose version

如果安装成功,你将看到如下所示的输出:


Output1.18.0 (06a2e56)

步骤2-克隆和打包应用程序

要在Kubernetes中使用应用程序,我们需要克隆项目代码并打包应用程序,以便kubelet服务能够提取镜像。

将存储库克隆到名为 node_project


git clone https://github.com/do-community/node-mongo-docker-dev.git node_project

导航到 node_project 目录:


cd node_project

一个 node_project

项目目录包含一个Dockerfile,说明如何构建应用程序镜像,现在构建镜像,以便可以将它推送到Docker Hub帐户并在Kubernetes设置中使用它。

使用命令,使用-t标志构建镜像,它允许你用自己定义的名称来标记它node-kubernetes 或者你自己选择的名称:


docker build -t your_dockerhub_username/node-kubernetes .

命令中的.指定生成上下文是当前目录。

需要一到两分钟才能生成镜像,完成后,检查你的镜像:


docker images

你将看到以下输出:


OutputREPOSITORY TAG IMAGE ID CREATED SIZE
your_dockerhub_username/node-kubernetes latest 9c6f897e1fbc 3 seconds ago 90MB
node 10-alpine 94f3c8956482 12 days ago 71MB

接下来,登录到你在先决条件中创建的Docker-Hub帐户:


docker login -u your_dockerhub_username 

出现提示时,输入你的Docker-Hub帐户密码,以这种方式登录将在你的用户目录中创建一个~/.docker/config.json文件,并使用Docker-Hub凭据。

将应用程序镜像推送到Docker-Hub docker push命令,记住替换 your_dockerhub_username 使用你自己的Docker-Hub用户名:


docker push your_dockerhub_username/node-kubernetes

下一步将是将你的应用程序服务定义转换为Kubernetes对象。

步骤3-使用kompose将Compose服务转换为Kubernetes对象

这里的Docker Compose文件称为docker-compose.yaml,它定义了运行服务的定义,组合中的服务是一个正在运行的容器,服务定义包含有关每个容器镜像如何运行的信息,在这一步中,使用kompose创建yaml文件,将这些定义转换为Kubernetes对象,这些文件将包含描述它所需状态的Kubernetes对象的规范。

首先,我们需要修改docker-compose.yaml文件中的一些定义来处理Kubernetes ,

使用nano或你喜爱的编辑器打开文件:


nano docker-compose.yaml

nodejs应用程序服务的当前定义如下所示:

~/node_project/docker-compose.yaml

...
services:
 nodejs:
 build:
 context: .
 dockerfile: Dockerfile
 image: nodejs
 container_name: nodejs
 restart: unless-stopped
 env_file: .env
 environment:
 - MONGO_USERNAME=$MONGO_USERNAME
 - MONGO_PASSWORD=$MONGO_PASSWORD
 - MONGO_HOSTNAME=db
 - MONGO_PORT=$MONGO_PORT
 - MONGO_DB=$MONGO_DB 
 ports:
 -"80:8080"
 volumes:
 - .:/home/node/app
 - node_modules:/home/node/app/node_modules
 networks:
 - app-network
 command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js
...

对你的服务定义进行以下编辑:

使用你 node-kubernetes 镜像而不是本地Dockerfile ,将容器restart策略从unless-stopped更改为always,删除volumes列表和command指令,

完成的服务定义现在将如下所示:

~/node_project/docker-compose.yaml

...
services:
 nodejs:
 image: your_dockerhub_username/node-kubernetes
 container_name: nodejs
 restart: always
 env_file: .env
 environment:
 - MONGO_USERNAME=$MONGO_USERNAME
 - MONGO_PASSWORD=$MONGO_PASSWORD
 - MONGO_HOSTNAME=db
 - MONGO_PORT=$MONGO_PORT
 - MONGO_DB=$MONGO_DB 
 ports:
 -"80:8080"
 networks:
 - app-network
...

接下来,向下滚动到db服务定义,在这里,进行以下编辑:

将服务的restart策略更改为always

db服务定义现在将如下所示:

~/node_project/docker-compose.yaml

...
 db:
 image: mongo:4.1.8-xenial
 container_name: db
 restart: always
 environment:
 - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
 - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
 volumes: 
 - dbdata:/data/db 
 networks:
 - app-network
... 

最后,在文件的底部,从顶级volumes键中删除node_modules卷,

~/node_project/docker-compose.yaml

...
volumes:
 dbdata:

编辑完成后保存并关闭文件。

在本教程中,我们.env添加到.gitignore文件,以确保它不会复制到版本控制,因此,我们需要现在重新创建它。

创建文件:


nano .env

kompose将使用此文件为应用程序创建ConfigMap ,但是,我们只添加MONGO_DB数据库名称和MONGO_PORT,而不是将nodejs服务定义中的所有变量分配给服务定义,

将下列端口和数据库名称信息添加到.env文件,如果你愿意,可以随意重命名你的数据库:

~/node_project/.env

MONGO_PORT=27017
MONGO_DB=sharkinfo

编辑完成后保存并关闭文件。

现在你已经准备好使用对象规范创建文件了,你可以:

基于yaml文件中的服务定义创建文件,其中包含,使用kompose up直接创建Kubernetes对象,使用kompose convert -c创建helm图表,

现在,我们把服务定义转换为yaml文件,然后添加和修改文件kompose创建的文件。

使用以下命令将服务定义转换为yaml文件:


kompose convert

你还可以使用-f标志来命名特定或多个组合文件。

运行此命令后,kompose将输出有关已创建文件的信息:


OutputINFO Kubernetes file"nodejs-service.yaml" created 
INFO Kubernetes file"db-deployment.yaml" created 
INFO Kubernetes file"dbdata-persistentvolumeclaim.yaml" created 
INFO Kubernetes file"nodejs-deployment.yaml" created 
INFO Kubernetes file"nodejs-env-configmap.yaml" created 

步骤4-创建Kubernetes的秘密

为了使应用程序能够按照我们期望的方式运行,我们需要对kompose创建的文件进行一些修改,

手动创建密码的第一步是将你的用户名和密码转换为Base64,一种可以统一传输数据的编码方案。

转换你的数据库用户名:


echo -n 'your_database_username' | base64

记下在输出中看到的值。

接下来,转换你的密码:


echo -n 'your_database_password' | base64

注意输出中的值,也注意到。

打开一个文件以获取密码:


nano secret.yaml

注意:Kubernetes对象是使用Yaml典型定义,它严格禁止制表符,需要两个空格进行缩进,如果要检查yaml文件的格式,可以使用Linter或用和--validate标志测试语法的正确性:


kubectl create -f your_yaml_file.yaml --dry-run --validate=true

通常,在使用kubectl创建资源之前验证语法是一个好主意。

在文件中添加以下代码以创建使用刚创建的值定义MONGO_USERNAMEMONGO_PASSWORD的密码,

~/node_project/secret.yaml

apiVersion: v1
kind: Secret
metadata:
 name: mongo-secret
data:
 MONGO_USERNAME: your_encoded_username
 MONGO_PASSWORD: your_encoded_password

我们把Secret对象命名为 mongo-secret

完成编辑后保存并关闭此文件,如你对.env文件所做的,确保将secret.yaml添加到.gitignore文件中,以保持版本控制不受限制。

编写secret.yaml后,下一步将确保应用程序和数据库窗格都使用我们添加到文件中的值,先向应用程序部署中添加对密钥的引用。

打开名为nodejs-deployment.yaml的文件:


nano nodejs-deployment.yaml

文件规范容器包括以下环境变量定义的env密钥:

~/node_project/nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
 spec:
 containers:
 - env:
 - name: MONGO_DB
 valueFrom:
 configMapKeyRef:
 key: MONGO_DB
 name: nodejs-env
 - name: MONGO_HOSTNAME
 value: db
 - name: MONGO_PASSWORD
 - name: MONGO_PORT
 valueFrom:
 configMapKeyRef:
 key: MONGO_PORT
 name: nodejs-env
 - name: MONGO_USERNAME

我们需要向这里列出的MONGO_USERNAMEMONGO_PASSWORD变量添加引用,以便应用程序能够访问这些值,不包括configMapKeyRef键来指向nodejs-env ConfigMap,就像用MONGO_DBMONGO_PORT值,我们包括一个secretKeyRef键指向值,mongo-secret 秘密。

将以下机密引用添加到MONGO_USERNAMEMONGO_PASSWORD变量:

~/node_project/nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
 spec:
 containers:
 - env:
 - name: MONGO_DB
 valueFrom:
 configMapKeyRef:
 key: MONGO_DB
 name: nodejs-env
 - name: MONGO_HOSTNAME
 value: db
 - name: MONGO_PASSWORD
 valueFrom:
 secretKeyRef:
 name: mongo-secret
 key: MONGO_PASSWORD
 - name: MONGO_PORT
 valueFrom:
 configMapKeyRef:
 key: MONGO_PORT
 name: nodejs-env
 - name: MONGO_USERNAME
 valueFrom:
 secretKeyRef:
 name: mongo-secret
 key: MONGO_USERNAME

编辑完成后保存并关闭文件。

接下来,我们向db-deployment.yaml文件中添加相同的值。

打开文件进行编辑:


nano db-deployment.yaml

在此文件中,我们为以下变量添加对密钥的引用: MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORDmongo映像使这些变量可用,以便你可以修改数据库实例的初始化,在admin身份验证数据库中,MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD共同创建一个root用户,并确保在数据库容器启动时启用。

MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD变量下,添加对Secret 的引用:

~/node_project/db-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
 spec:
 containers:
 - env:
 - name: MONGO_INITDB_ROOT_PASSWORD
 valueFrom:
 secretKeyRef:
 name: mongo-secret
 key: MONGO_PASSWORD 
 - name: MONGO_INITDB_ROOT_USERNAME
 valueFrom:
 secretKeyRef:
 name: mongo-secret
 key: MONGO_USERNAME
 image: mongo:4.1.8-xenial
...

编辑完成后保存并关闭文件。

步骤5-创建数据库服务和应用程序初始化容器

打开一个文件来定义数据库服务的规格:


nano db-service.yaml 

将下面的代码添加到文件以定义服务:

~/node_project/db-service.yaml

apiVersion: v1
kind: Service
metadata:
 annotations: 
 kompose.cmd: kompose convert
 kompose.version: 1.18.0 (06a2e56)
 creationTimestamp: null
 labels:
 io.kompose.service: db
 name: db
spec:
 ports:
 - port: 27017
 targetPort: 27017
 selector:
 io.kompose.service: db
status:
 loadBalancer: {}

编辑完成后保存并关闭文件。

接下来,在nodejs-deployment.yaml中的containers数组中添加一个初始容器字段,要了解更多关于其他用例的信息,请参阅正式文档

打开nodejs-deployment.yaml文件:


nano nodejs-deployment.yaml

在和containers数组之间,我们向一个容器添加一个initContainers字段,该容器将轮询db服务。

portsresources字段下面添加以下代码,并在nodejscontainers数组中的restartPolicy之上添加以下代码:

~/node_project/nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
 spec:
 containers:
 ...
 name: nodejs
 ports:
 - containerPort: 8080
 resources: {}
 initContainers:
 - name: init-db
 image: busybox
 command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']
 restartPolicy: Always
... 

此时,使用工具来轮询与db服务关联的Pod是否在端口27017上接受TCP连接。

初始化容器运行完成; 在例子中,这意味着node应用程序容器将不会启动直到数据库容器运行并接受端口27017,无论数据库容器的确切位置如何,db服务定义都允许保证这个功能,这是可变的。

编辑完成后保存并关闭文件。

步骤6-修改PersistentVolumeClaim并公开应用程序前端

在运行应用程序之前,我们做两个最后的更改,以确保将正确配置数据库存储,并确保可以使用LoadBalancer公开应用程序前端。

首先,修改在PersistentVolumeClaim中创建的kompose中定义的storage

要使用PersistentVolumeClaims,必须创建并配置storageClass以提供存储资源,

我们可以通过键入以下命令来检查:


kubectl get storageclass

如果你正在使用DigitalOcean群集,则会看到以下输出:


OutputNAME PROVISIONER AGE
do-block-storage (default) dobs.csi.digitalocean.com 76m

如果你不使用DigitalOcean集群,你需要创建一个StorageClass并配置你选择的provisioner,有关如何执行这个操作的详细信息,请参阅正式文档

当kompose创建dbdata-persistentvolumeclaim.yaml时,它将storageresource设置为不符合provisioner的最小大小要求的大小,

打开dbdata-persistentvolumeclaim.yaml


nano dbdata-persistentvolumeclaim.yaml

1Gi替换storage值:

~/node_project/dbdata-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 creationTimestamp: null
 labels:
 io.kompose.service: dbdata
 name: dbdata
spec:
 accessModes:
 - ReadWriteOnce
 resources:
 requests:
 storage: 1Gi
status: {}

完成后保存并关闭文件。

接下来,打开nodejs-service.yaml


nano nodejs-service.yaml

在服务规范中,将LoadBalancer指定为服务type

~/node_project/nodejs-service.yaml

apiVersion: v1
kind: Service
...
spec:
 type: LoadBalancer
 ports:
...

创建nodejs服务时,会自动创建负载均衡器,为我们提供一个外部IP,我们可以访问应用程序。

编辑完成后保存并关闭文件。

准备好所有文件后,就可以开始和测试应用程序了。

步骤7-启动和访问应用程序

是时候创建Kubernetes对象并测试应用程序是否按预期工作了。

为了创建我们定义的对象,使用和-f标志,这将允许指定kompose创建的文件,


kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml

你将看到以下输出表明已经创建了对象:


Outputservice/nodejs created
deployment.extensions/nodejs created
configmap/nodejs-env created
service/db created
deployment.extensions/db created
persistentvolumeclaim/dbdata created
secret/mongo-secret created

要检查你的Pods是否正在运行,请键入:


kubectl get pods

如果使用多个命名空间,请确保在运行此命令时包含-n标志,以及命名空间名称。

db容器启动且应用程序初始化容器正在运行时,你将看到以下输出:


OutputNAME READY STATUS RESTARTS AGE
db-679d658576-kfpsl 0/1 ContainerCreating 0 10s
nodejs-6b9585dc8b-pnsws 0/1 Init:0/1 0 10s

一旦容器运行,应用程序和数据库容器已经启动,你将看到以下输出:


OutputNAME READY STATUS RESTARTS AGE
db-679d658576-kfpsl 1/1 Running 0 54s
nodejs-6b9585dc8b-pnsws 1/1 Running 0 54s

RunningSTATUS指示你的pod绑定到节点,并且与这些容器关联的容器正在运行,READY表示在一个窗格中运行多少个容器,有关详细信息,请参阅有关Pod生命周期的文档

备注: 如果在STATUS列中看到意外的阶段,请记住,你可以使用以下命令对Pods进行故障排除:


kubectl describe pods your_pod
kubectl logs your_pod

运行容器后,现在可以访问应用程序,要获取LoadBalancer的IP,请键入:


kubectl get svc

你将看到以下输出:


OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 10.245.189.250 <none> 27017/TCP 93s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 25m12s
nodejs LoadBalancer 10.245.15.56 your_lb_ip 80:30729/TCP 93s

nodejs服务关联的EXTERNAL_IP是你可以访问应用程序的IP地址,如果在EXTERNAL_IP列中看到<pending>状态,这意味着你的负载均衡器仍然在创建。

在该列中看到一个IP后,在浏览器中导航到它: http://your_lb_ip

点击获取 Shark Info按钮,你将看到一个带有输入表单的页面,你可以在其中输入shark名称和描述:

在这种形式中,添加你所选择的Shark,为了演示,我们将添加 Megalodon Shark 到Shark的名字字段 Ancient 对于Shark字符字段:

点击提交按钮,你将看到一个页面,其中显示了该Shark信息:

现在,你可以在Kubernetes集群上运行带有MongoDB数据库的Node js应用程序的单实例设置。



文章标签:COM  DOC  Docker  DOCK  流程  Compose  Kubernetes  Docker Compose  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语