k8s部署node express web應用
本檔案用于梳理k8s部署node應用的程序
關于k8s的部署步驟可以參考:《k8s部署,親測有效,無坑》
-
準備專案
專案名稱 開放埠 路由1 路由2 websvr1 3000 /web1/index /web1/send websvr2 3001 /web2/index /web2/send 為了快速搭建,此處的websvr采用express的腳手架express-generator安裝:
#安裝express-generator: $ npm install express-generator -g #創建腳手架應用app $ express app #安裝依賴 $ cd app && npm install在app同級目錄編輯Dockerfile:
#指定node版本 FROM node:10.15.1 #指定作者 MAINTAINER [SCH] #將同級app檔案夾添加進入docker下指定目錄 ADD app /opt/app #指定作業目錄 WORKDIR /opt/app #指定對外埠 EXPOSE 3000 #啟動執行命令 CMD [ "nohup","npm","start", "&"]將app與同級Dockerfile一起創建檔案夾,命名為websvr1,修改app/routes/index.js路由檔案:
//此處定義了兩個get介面與一個post介面, router.get('/web1/index', function (req, res, next) { res.render('index', {title: 'Express1'}); }); router.post('/web1/getIndex', function (req, res, next) { res.send("get index1"); }); //通過websvr1向websvr2,service發起請求,用來驗證k8s,service之間的通信流程 router.get('/web1/send', function (req, res, next) { request({ url: `http://websvr2-service:3001/web2/getIndex`, method: "POST", timeout: 10000 }, (error, response, body) => { if (error) { console.log(error); res.render('index', {title: "請求失敗1"}); return } res.render('index', {title: body}); }) });另外拷貝一份websvr,將app目錄下/bin/www內的默認埠和Dockerfile對外埠統一修改為3001,壓縮命名為websvr2:
//此處定義了兩個get介面與一個post介面, router.get('/web2/index', function (req, res, next) { res.render('index', {title: 'Express2'}); }); router.post('/web2/getIndex', function (req, res, next) { res.send("get index2"); }); //通過websvr1向websvr2,service發起請求,用來驗證k8s,service之間的通信流程 router.get('/web2/send', function (req, res, next) { request({ url: `http://websvr1-service:3000/web1/getIndex`, method: "POST", timeout: 10000 }, (error, response, body) => { if (error) { console.log(error); res.render('index', {title: "請求失敗2"}); return } res.render('index', {title: body}); }) });k8s集群條件
節點名稱 IP k8s-master 172.16.66.169 k8s-node1 172.16.66.168 k8s-node2 172.16.66.170 -
創建docker鏡像
將websvr1,websvr2分別上傳至node1,node2下的/opt目錄下,并創建docker鏡像
$ cd /opt/websvr1 $ docker build -t websvr:v1 . $ cd /opt/websvr2 $ docker build -t websvr:v2 . #查看docker鏡像 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE websvr v2 2a61bbea0d63 16 seconds ago 907MB websvr v1 a3adb933da80 32 seconds ago 907MB calico/node v3.20.1 355c1ee44040 4 weeks ago 156MB calico/pod2daemon-flexvol v3.20.1 55fa5eb71e09 4 weeks ago 21.7MB calico/cni v3.20.1 e69ccb66d1b6 4 weeks ago 146MB registry.aliyuncs.com/google_containers/kube-apiserver v1.21.0 4d217480042e 6 months ago 126MB registry.aliyuncs.com/google_containers/kube-proxy v1.21.0 38ddd85fe90e 6 months ago 122MB registry.aliyuncs.com/google_containers/kube-scheduler v1.21.0 62ad3129eca8 6 months ago 50.6MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.21.0 09708983cc37 6 months ago 120MB registry.aliyuncs.com/google_containers/pause 3.4.1 0f8457a4c2ec 9 months ago 683kB coredns/coredns 1.8.0 296a6d5035e2 12 months ago 42.5MB registry.aliyuncs.com/google_containers/coredns/coredns v1.8.0 296a6d5035e2 12 months ago 42.5MB registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 13 months ago 253MB node 10.15.1 8fc2110c6978 2 years ago 897MB -
k8s部署websvr
這里使用k8s,deployment,service部署websvr
deployment:創建docker容器群,對于同一個websvr,可以創建多個相同副本,通過分配不同虛擬IP及埠進行訪問
service:當存在多個websvr容器副本后,如何通過統一的入口對多個websvr進行訪問,就需要使用到service,可以簡單理解為對多個容器副本的封裝
$ vim websvr1.yamlapiVersion: apps/v1 kind: Deployment metadata: name: websvr1-deployment spec: selector: matchLabels: app: websvr1 replicas: 3 template: metadata: labels: app: websvr1 spec: containers: - name: websvr1 image: websvr:v1 ports: - containerPort: 3000 --- apiVersion: v1 kind: Service metadata: name: websvr1-service spec: selector: app: websvr1 ports: - protocol: TCP port: 3000 targetPort: 3000$ kubectl apply -f websvr1.yaml $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES websvr1-deployment-7cb5776d76-mzx96 1/1 Running 0 3m8s 10.244.169.134 k8s-node2 <none> <none> websvr1-deployment-7cb5776d76-nzx7w 1/1 Running 0 3m8s 10.244.36.68 k8s-node1 <none> <none> websvr1-deployment-7cb5776d76-zzhdb 1/1 Running 0 3m8s 10.244.169.135 k8s-node2 <none> <none>同樣方法部署websvr2,將暴露埠改為3001:
$ vim websvr2.yamlapiVersion: apps/v1 kind: Deployment metadata: name: websvr2-deployment spec: selector: matchLabels: app: websvr2 replicas: 3 template: metadata: labels: app: websvr2 spec: containers: - name: websvr2 image: websvr:v2 ports: - containerPort: 3001 --- apiVersion: v1 kind: Service metadata: name: websvr2-service spec: selector: app: websvr2 ports: - protocol: TCP port: 3001 targetPort: 3001$ kubectl apply -f websvr2.yaml $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES websvr1-deployment-7cb5776d76-mzx96 1/1 Running 0 7m35s 10.244.169.134 k8s-node2 <none> <none> websvr1-deployment-7cb5776d76-nzx7w 1/1 Running 0 7m35s 10.244.36.68 k8s-node1 <none> <none> websvr1-deployment-7cb5776d76-zzhdb 1/1 Running 0 7m35s 10.244.169.135 k8s-node2 <none> <none> websvr2-deployment-58c8b7ffcd-57tsz 1/1 Running 0 7s 10.244.36.69 k8s-node1 <none> <none> websvr2-deployment-58c8b7ffcd-9lg4c 1/1 Running 0 7s 10.244.36.70 k8s-node1 <none> <none> websvr2-deployment-58c8b7ffcd-dgzl5 1/1 Running 0 7s 10.244.36.71 k8s-node1 <none> <none> -
驗證
對于運行在各個node節點上的pod,通過統一的serviceIP及埠進行訪問,service通過一定的負載均衡規則,分發到不同的node節點的pod上進行業務處理
$ kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 135m <none> websvr1-service ClusterIP 10.102.171.58 <none> 3000/TCP 10m app=websvr1 websvr2-service ClusterIP 10.104.188.128 <none> 3001/TCP 2m34s app=websvr2 #發現此處有剛剛創建的兩個websvr service,分別對應websvr1:3000及websvr2:3001 -
此時外網還無法訪問k8s集群內容器,接下來需要進一步部署ingress
ingress-nginx部署
Ingress-nginx version k8s supported version Alpine Version Nginx Version v0.48.1 1.21, 1.20, 1.19 3.13.5 1.20.1 v0.47.0 1.21, 1.20, 1.19 3.13.5 1.20.1 v0.46.0 1.21, 1.20, 1.19 3.13.2 1.19.6 在master及所有node執行:
# 從阿里云鏡像倉庫拉取ingress-nginx所需版本: $ docker pull registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1 # 將阿里云鏡像重新打tag命名為官方鏡像名: $ docker tag registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1 k8s.gcr.io/ingress-nginx/controller:v0.48.1 # 洗掉阿里云鏡像: $ docker rmi registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1打開ingress-nginx 0.48.1的deploy.yaml網站、將yaml內容全部復制到本地,
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/baremetal/deploy.yaml
修改本地的deploy.yaml檔案:
image: k8s.gcr.io/ingress-nginx/controller:v0.48.1@sha256:e9fb216ace49dfa4a5983b183067e97496e7a8b307d2093f4278cd550c303899 # 修改為 image: k8s.gcr.io/ingress-nginx/controller:v0.48.1外網無法打開可以使用下面保存的yaml檔案:
apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx --- # Source: ingress-nginx/templates/controller-serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx namespace: ingress-nginx automountServiceAccountToken: true --- # Source: ingress-nginx/templates/controller-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller namespace: ingress-nginx data: --- # Source: ingress-nginx/templates/clusterrole.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm name: ingress-nginx rules: - apiGroups: - '' resources: - configmaps - endpoints - nodes - pods - secrets verbs: - list - watch - apiGroups: - '' resources: - nodes verbs: - get - apiGroups: - '' resources: - services verbs: - get - list - watch - apiGroups: - extensions - networking.k8s.io # k8s 1.14+ resources: - ingresses verbs: - get - list - watch - apiGroups: - '' resources: - events verbs: - create - patch - apiGroups: - extensions - networking.k8s.io # k8s 1.14+ resources: - ingresses/status verbs: - update - apiGroups: - networking.k8s.io # k8s 1.14+ resources: - ingressclasses verbs: - get - list - watch --- # Source: ingress-nginx/templates/clusterrolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx --- # Source: ingress-nginx/templates/controller-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx namespace: ingress-nginx rules: - apiGroups: - '' resources: - namespaces verbs: - get - apiGroups: - '' resources: - configmaps - pods - secrets - endpoints verbs: - get - list - watch - apiGroups: - '' resources: - services verbs: - get - list - watch - apiGroups: - extensions - networking.k8s.io # k8s 1.14+ resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions - networking.k8s.io # k8s 1.14+ resources: - ingresses/status verbs: - update - apiGroups: - networking.k8s.io # k8s 1.14+ resources: - ingressclasses verbs: - get - list - watch - apiGroups: - '' resources: - configmaps resourceNames: - ingress-controller-leader-nginx verbs: - get - update - apiGroups: - '' resources: - configmaps verbs: - create - apiGroups: - '' resources: - events verbs: - create - patch --- # Source: ingress-nginx/templates/controller-rolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx namespace: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx --- # Source: ingress-nginx/templates/controller-service-webhook.yaml apiVersion: v1 kind: Service metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller-admission namespace: ingress-nginx spec: type: ClusterIP ports: - name: https-webhook port: 443 targetPort: webhook selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller --- # Source: ingress-nginx/templates/controller-service.yaml apiVersion: v1 kind: Service metadata: annotations: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 protocol: TCP targetPort: http - name: https port: 443 protocol: TCP targetPort: https selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller --- # Source: ingress-nginx/templates/controller-deployment.yaml apiVersion: apps/v1 #kind: Deployment #apiVersion: extensions/v1beta1 # 修改為DaemonSet型別,隨每個node節點創建和洗掉,配合污點容忍可以實作ingress-nginx高可用 kind: DaemonSet metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller namespace: ingress-nginx spec: selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller revisionHistoryLimit: 10 minReadySeconds: 0 template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller spec: dnsPolicy: ClusterFirst #開啟本機網路 hostNetwork: true containers: - name: controller image: k8s.gcr.io/ingress-nginx/controller:v0.48.1 imagePullPolicy: IfNotPresent lifecycle: preStop: exec: command: - /wait-shutdown args: - /nginx-ingress-controller - --election-id=ingress-controller-leader - --ingress-class=nginx - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller - --validating-webhook=:8443 - --validating-webhook-certificate=/usr/local/certificates/cert - --validating-webhook-key=/usr/local/certificates/key #若本機埠被占用,需要另行設定 #- --http-port=81 #- --https-port=1444 #- --status-port=18081 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE runAsUser: 101 allowPrivilegeEscalation: true env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so livenessProbe: failureThreshold: 5 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 readinessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 ports: - name: http containerPort: 80 protocol: TCP - name: https containerPort: 443 protocol: TCP - name: webhook containerPort: 8443 protocol: TCP volumeMounts: - name: webhook-cert mountPath: /usr/local/certificates/ readOnly: true resources: requests: cpu: 100m memory: 90Mi nodeSelector: kubernetes.io/os: linux serviceAccountName: ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: secretName: ingress-nginx-admission --- # Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml # before changing this value, check the required kubernetes version # https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook name: ingress-nginx-admission webhooks: - name: validate.nginx.ingress.kubernetes.io matchPolicy: Equivalent rules: - apiGroups: - networking.k8s.io apiVersions: - v1beta1 operations: - CREATE - UPDATE resources: - ingresses failurePolicy: Fail sideEffects: None admissionReviewVersions: - v1 - v1beta1 clientConfig: service: namespace: ingress-nginx name: ingress-nginx-controller-admission path: /networking/v1beta1/ingresses --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: name: ingress-nginx-admission namespace: ingress-nginx annotations: helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-nginx-admission annotations: helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook rules: - apiGroups: - admissionregistration.k8s.io resources: - validatingwebhookconfigurations verbs: - get - update --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ingress-nginx-admission annotations: helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx-admission subjects: - kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ingress-nginx-admission namespace: ingress-nginx annotations: helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook rules: - apiGroups: - '' resources: - secrets verbs: - get - create --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ingress-nginx-admission namespace: ingress-nginx annotations: helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ingress-nginx-admission subjects: - kind: ServiceAccount name: ingress-nginx-admission namespace: ingress-nginx --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml apiVersion: batch/v1 kind: Job metadata: name: ingress-nginx-admission-create namespace: ingress-nginx annotations: helm.sh/hook: pre-install,pre-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook spec: template: metadata: name: ingress-nginx-admission-create labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook spec: containers: - name: create image: docker.io/jettech/kube-webhook-certgen:v1.5.1 imagePullPolicy: IfNotPresent args: - create - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc - --namespace=$(POD_NAMESPACE) - --secret-name=ingress-nginx-admission env: - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace restartPolicy: OnFailure serviceAccountName: ingress-nginx-admission securityContext: runAsNonRoot: true runAsUser: 2000 --- # Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml apiVersion: batch/v1 kind: Job metadata: name: ingress-nginx-admission-patch namespace: ingress-nginx annotations: helm.sh/hook: post-install,post-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook spec: template: metadata: name: ingress-nginx-admission-patch labels: helm.sh/chart: ingress-nginx-3.34.0 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.48.1 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: admission-webhook spec: containers: - name: patch image: docker.io/jettech/kube-webhook-certgen:v1.5.1 imagePullPolicy: IfNotPresent args: - patch - --webhook-name=ingress-nginx-admission - --namespace=$(POD_NAMESPACE) - --patch-mutating=false - --secret-name=ingress-nginx-admission - --patch-failure-policy=Fail env: - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace restartPolicy: OnFailure serviceAccountName: ingress-nginx-admission securityContext: runAsNonRoot: true runAsUser: 2000在master執行:
$ kubectl apply -f deploy.yaml $ kubectl get pod -o wide -n ingress-nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-87rgx 0/1 Completed 0 72s 10.244.169.137 k8s-node2 <none> <none> ingress-nginx-admission-patch-hq6b6 0/1 Completed 0 72s 10.244.36.74 k8s-node1 <none> <none> ingress-nginx-controller-f7d7r 1/1 Running 0 72s 172.16.66.170 k8s-node2 <none> <none> ingress-nginx-controller-p2z5t 1/1 Running 0 72s 172.16.66.168 k8s-node1 <none> <none> #可以看到ingress已經跟隨node節點創建了兩個controller用以監聽nginx組態檔變化并更新 -
配置ingress
ingress-nginx安裝完成后,還需要配置ingress路由規則,類似nginx的路由規則:
$ vim ingressRule.yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: k8s.test.com #指定域名 http: paths: - path: /web1 #一級路由 pathType: Prefix #匹配規則 Prefix:前綴 backend: service: name: websvr1-service #指向的service port: number: 3000 #對應的service暴露的埠 - path: /web2 pathType: Prefix backend: service: name: websvr2-service port: number: 3001$ kubectl apply -f ingressRule.yaml $ kubectl describe ingress Name: my-ingress Namespace: default Address: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) Rules: Host Path Backends ---- ---- -------- k8s.scbczx.com /web1 websvr1-service:3000 (10.244.169.134:3000,10.244.169.135:3000,10.244.36.68:3000) /web2 websvr2-service:3001 (10.244.169.136:3001,10.244.36.72:3001,10.244.36.73:3001) Annotations: kubernetes.io/ingress.class: nginx Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Sync 11s nginx-ingress-controller Scheduled for sync Normal Sync 11s nginx-ingress-controller Scheduled for sync -
驗證
此時通過curl發起get請求驗證ingress-nginx路由規則
$ curl k8s.test.com/web1/index <!DOCTYPE html><html><head><title>Express1</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express1</h1><p>Welcome to Express1</p></body></html> $ curl k8s.test.com/web1/send <!DOCTYPE html><html><head><title>get index2</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>get index2</h1><p>Welcome to get index2</p></body></html> $ curl k8s.test.com/web2/index <!DOCTYPE html><html><head><title>Express2</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express2</h1><p>Welcome to Express2</p></body></html> $ curl k8s.test.com/web2/send <!DOCTYPE html><html><head><title>get index1</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>get index1</h1><p>Welcome to get index1</p></body></html>至此,k8s集群內的websvr都成功的通過公網域名進行訪問
附:在實際的專案進展中,存在一些在當前執行緒記憶體中存盤用戶登錄態的情況,比如服務器session,如果按照當前的service分發規則,很有可能導致用戶登錄session丟失的問題,那么service是否可以像nginx一樣配置分發規則,比如按照前端IP?后面會在別的檔案內單獨討論,
如有問題,歡迎指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330933.html
標籤:其他
