
Ini adalah catatan singkat tentang cara mengemas aplikasi vue.js di Dockerfile dan kemudian menjalankannya dalam wadah di kubernetes'e.
Apa yang
Saya menulis sebuah program kecil yang menghasilkan nomor NodePort gratis. Sebenarnya, dia tidak melakukan sesuatu yang sangat berguna, tetapi Anda tidak perlu mencari port, dan untuk bersenang-senang, lihat bagaimana hal ini dapat dilakukan.
Mulai
Seluruh proyek terdiri dari dua bagian - frontend dan server. Front-end meminta nodePort dari server, dan sisi server menemukan beberapa gratis melalui kubernetes api.
Sebenarnya, agar ini berfungsi di buruh pelabuhan, Anda perlu mengekstrak beberapa variabel dari aplikasi, seperti alamat kubernetes api, port, token, dll.
Ini terlihat seperti ini:
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)
Katakanlah semuanya telah teruji dan aplikasi kita berfungsi.
Buat gambar buruh pelabuhan
Mereka yang bekerja dengan vue.js tahu bahwa ada banyak semua jenis file, yang semuanya diperlukan, saya tidak tahu, tetapi harus dilihat. Tetapi berkat kenyataan bahwa ada yang namanya vue-cli, semuanya bisa sangat sederhana. Sekarang kami kemas semuanya:
npm run build
Setelah itu, kita akan memiliki folder "dist" dan file "index.html" di "k8s-nodeport-gen / client". Dan untuk pekerjaan kita hanya membutuhkan mereka. Secara teori, agar frontend berfungsi, Anda memerlukan semacam server http. Tetapi dalam kasus ini, ada juga backend, yang juga harus berfungsi. Oleh karena itu, dalam kasus saya, sebagai server http, simpul.js express akan berfungsi.
File-file tersebut nantinya akan berada di folder k8s-nodeport-gen / public. Untuk melakukan ini, tambahkan opsi ke server / index.js
app.use(express.static(__dirname + '/public'))
Sekarang Anda memiliki file yang diuraikan, Anda dapat membuat Dockerfile. Kami dari frontend hanya perlu membuat file untuk folder "dist". Untuk melakukan ini, kita akan menggunakan benda bermodel baru seperti multistage build .
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
Yaitu, di wadah pertama, jalankan "npm run build", dan di wadah kedua, salin file dari "dist" ke "publik". Pada akhirnya, kami mendapatkan gambar sebesar 95mb.
Sekarang kami memiliki gambar buruh pelabuhan yang telah saya unggah ke hub.docker.com .
Luncurkan
Sekarang kita ingin menjalankan gambar ini di kubernetes'e, di samping itu, kita perlu token yang dapat melihat port mana yang sudah digunakan melalui api kubernetes.
Untuk melakukan ini, Anda harus membuat akun server , peran (Anda dapat menggunakan yang sudah ada) dan rolebinding (Saya tidak tahu cara menerjemahkan dengan benar).
Saya sudah memiliki peran "melihat" cluster di dalam cluster
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]
Sekarang buat akun dan rolebinding
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: ""
Sekarang kami memiliki akun, dan dia memiliki token. Namanya tertulis di akun:
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
Sekarang Anda hanya perlu menulis deploy, service, ingress untuk halaman tersebut. Mari kita mulai:
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
Ada dua hal yang perlu diperhatikan: "serviceAccountName: portng-service-get" dan token untuk kubernetes, atau lebih tepatnya, cara saya menambahkannya.
Sekarang mari kita menulis layanan:
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
Dan masuknya, untuk itu Anda harus memiliki pengendali masuknya diinstal
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
Semuanya, tetap hanya mengunggah file ke server dan menjalankannya.
Semua ini dapat diluncurkan baik sebagai wadah buruh pelabuhan dan bahkan tanpa itu, tetapi bagian dengan akun di kubernetes'e masih harus melalui.
Sumber:
Gambar buruh pelabuhan di hub.docker.com
Git repositori di github.com
Seperti yang Anda lihat, tidak ada yang istimewa dalam artikel ini, tetapi bagi sebagian orang saya pikir ini akan menarik.