
这是关于如何将vue.js应用程序打包到Dockerfile中然后在kubernetes'e的容器中运行它的简短说明。
是什么
我写了一个小程序 ,生成一个免费的NodePort编号。 实际上,她并没有做任何特别有用的事情,但是您不必费力寻找端口,因此,为了好玩,请看看如何做到这一点。
已开始
整个项目由两部分组成-前端和服务器。 前端询问服务器的nodePort,服务器端通过kubernetes api找到一些免费的端口。
实际上,要使其在Docker中起作用,您需要从应用程序中提取一些变量,例如地址kubernetes api,端口,令牌等。
看起来像这样:
k8s-nodeport-gen/server/index.js: var k8sInfo = { url: process.env.K8SURL, port: process.env.K8SPORT, timeout: process.env.K8STIMEOUT || '30', respath: process.env.RESSPATH || '/api/v1/services', token: process.env.K8STOKEN, nodePortStart: process.env.K8SPORTSTART || '30000', nodePortEnd: process.env.K8SPORTEND || '32000' } app.listen(process.env.PORT || 8081)
假设所有内容都经过测试,我们的应用程序可以正常工作。
创建一个Docker镜像
那些使用vue.js的人知道,有很多各种各样的文件,它们都是我所需要的,但我不知道,但是需要看到它们。 但是由于存在诸如vue-cli之类的事实,所以所有内容都可以非常简单地打包。 现在,我们打包所有内容:
npm run build
之后,在“ k8s-nodeport-gen / client”中将有“ dist”文件夹和文件“ index.html”。 对于工作,我们只需要它们。 也就是说,从理论上讲,要使前端工作,您需要某种http服务器。 但是在这种情况下,还有一个后端也应该起作用。 因此,就我而言,作为http服务器,node.js express将可以工作。
这些文件稍后将位于k8s-nodeport-gen / public文件夹中。 为此,将选项添加到server / index.js
app.use(express.static(__dirname + '/public'))
现在您已经解析了文件,您可以创建一个Dockerfile。 我们从前端只需要为“ dist”文件夹创建文件。 为此,我们将使用新的东西作为多阶段构建 。
FROM node:10-alpine AS base COPY client /portgen/client COPY server /portgen/server WORKDIR /portgen RUN cd client && npm i && npm run build FROM node:10-alpine WORKDIR /portgen COPY server/index.js /portgen/index.js COPY server/package.json /portgen/package.json COPY
也就是说,在第一个容器中,运行“ npm run build”,在第二个容器中,将文件从“ dist”复制到“ public”。 最后,我们得到了95mb的图像。
现在我们有一个docker镜像,我已经上传到hub.docker.com 。
发射
现在,我们要在kubernetes'e中运行该映像,此外,我们需要一个令牌,该令牌可以通过kubernetes api查看哪些端口已在使用中。
为此,您需要创建一个服务器帐户 ,一个角色(可以使用现有帐户 )和角色绑定(我不知道如何正确翻译)。
我已经在群集中具有“查看”群集角色
ceku@ceku1> kubectl describe clusterrole view Name: view Labels: kubernetes.io/bootstrapping=rbac-defaults Annotations: rbac.authorization.kubernetes.io/autoupdate=true PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- bindings [] [] [get list watch] configmaps [] [] [get list watch] endpoints [] [] [get list watch] events [] [] [get list watch] limitranges [] [] [get list watch] namespaces [] [] [get list watch] namespaces/status [] [] [get list watch] persistentvolumeclaims [] [] [get list watch] pods [] [] [get list watch] pods/log [] [] [get list watch] pods/status [] [] [get list watch] replicationcontrollers [] [] [get list watch] replicationcontrollers/scale [] [] [get list watch] replicationcontrollers/status [] [] [get list watch] resourcequotas [] [] [get list watch] resourcequotas/status [] [] [get list watch] serviceaccounts [] [] [get list watch] services [] [] [get list watch] daemonsets.apps [] [] [get list watch] deployments.apps [] [] [get list watch] deployments.apps/scale [] [] [get list watch] replicasets.apps [] [] [get list watch] replicasets.apps/scale [] [] [get list watch] statefulsets.apps [] [] [get list watch] horizontalpodautoscalers.autoscaling [] [] [get list watch] cronjobs.batch [] [] [get list watch] jobs.batch [] [] [get list watch] daemonsets.extensions [] [] [get list watch] deployments.extensions [] [] [get list watch] deployments.extensions/scale [] [] [get list watch] ingresses.extensions [] [] [get list watch] networkpolicies.extensions [] [] [get list watch] replicasets.extensions [] [] [get list watch] replicasets.extensions/scale [] [] [get list watch] replicationcontrollers.extensions/scale [] [] [get list watch] networkpolicies.networking.k8s.io [] [] [get list watch] poddisruptionbudgets.policy [] [] [get list watch]
现在创建一个帐户并进行角色绑定
account_portng.yml:
apiVersion: v1 kind: ServiceAccount metadata: name: portng-service-get namespace: internal labels: k8s-app: portng-service-get kubernetes.io/cluster-service: "true"
rolebindng_portng.yml:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: internal name: view labels: k8s-app: portng-service-get kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile subjects: - kind: ServiceAccount name: portng-service-get namespace: kube-system apiGroup: "" roleRef: kind: ClusterRole name: view apiGroup: ""
现在我们有一个帐户,他有一个令牌。 其名称写在帐户中:
ceku@ceku1 /a/r/aditointernprod.aditosoftware.local> kubectl get serviceaccount portng-service-get -n internal -o yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2018-08-02T07:31:54Z labels: k8s-app: portng-service-get kubernetes.io/cluster-service: "true" name: portng-service-get namespace: internal resourceVersion: "7270593" selfLink: /api/v1/namespaces/internal/serviceaccounts/portng-service-get uid: 2153dfa0-9626-11e8-aaa3-ac1f6b664c1c secrets: - name: portng-service-get-token-vr5bj
现在,您只需要为页面编写deploy,service,ingress。 让我们开始:
deploy_portng.yml
apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1 kind: Deployment metadata: namespace: internal name: portng.server.local spec: replicas: 1 template: metadata: labels: app: portng.server.local spec: serviceAccountName: portng-service-get containers: - name: portgen image: de1m/k8s-nodeport-gen env: - name: K8SURL value: ceku.server.local - name: K8SPORT value: '6443' - name: K8STIMEOUT value: '30' - name: RESSPATH value: '/api/v1/services' - name: K8SPORTSTART value: '30000' - name: K8SPORTEND value: '32000' - name: PORT value: '8080' args: - /bin/sh - -c - export K8STOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) && node /portgen/index.js
有两件事要注意:“ serviceAccountName:portng-service-get”和kubernetes的令牌,或者更确切地说,是我添加它的方式。
现在让我们编写一个服务:
svc_portng.yml
apiVersion: v1 kind: Service metadata: name: portng-server-local namespace: internal spec: ports: - name: http port: 8080 targetPort: 8080 selector: app: portng.server.local
和入口,为此,您必须安装一个入口控制器
ingress_portng.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: portng.aditosoftware.local namespace: internal annotations: kubernetes.io/ingress.class: "internal" spec: rules: - host: portng.server.local http: paths: - path: / backend: serviceName: portng-server-local servicePort: 8080
一切,仅保留将文件上传到服务器并运行。
所有这一切都可以作为docker容器启动,甚至没有它也可以启动,但是kubernetes'e中具有帐户的部分仍然必须通过。
资源:
位于hub.docker.com的Docker映像
github.com上的Git存储库
如您所见,本文没有什么特别之处,但是对于某些人来说,这会很有趣。