本篇文章继续给各人先容Kubernetes的实战,部署zrlog博客的项目到K8s集群,之前在进阶篇先容过该项目的搭建,详见下面两篇文章,部署项目的时间先规划,有了思路之后,按照思路去部署,这样一个地方出错了,解决一个地方的题目,不至于题目解决解决着不知道要干啥了,并且这么干团体的思路不容易出错。
【运维知识进阶篇】Tomcat快速入门(Java环境先容+Tomcat快速安装+Tomcat配置文件+Tomcat配置虚拟主机+Tomcat管理界面+Tomcat部署zrlog博客项目)_java tomcat-CSDN博客
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)_tomcat集群部署-CSDN博客
一、部署思路
1、先梳理下部署该项目到k8s的思路,再去现实操作。
2、首先我们要了解该项目,通过之前的文章我了解到该项目必要使用tomcat进行启动,必要做nfs挂载,前端还可以加上负载均衡,使用https证书去访问,我们只考虑后端的操作即可,后端把这个项目上到k8s后,提供出一个访问入口,前端的负载均衡与https证书的操作与传统的tomcat部署是一样的;
3、或者根本不必要部署nginx做负载均衡,因为k8s的service资源本身就具备负载均衡的结果。https证书也可以通过secret的情势挂载到ingress实现https证书访问网站。我们采取这个方式比较好。
4、那么首先我们明确必要准备的内容是一个zrlog的程序包,https的证书。然后去一步步去编写yaml文件即可,关于k8s的资源,我准备使用deployment部署这种无状态服务,service提供访问入口,ingress绑定证书。
二、现实操作
1、创建zrlog的文件存储空间
之前已经部署了nfs服务,创建单独目录,把程序包放到我们准备的共享目录,解压
- [root@Master231 kubernetes]# cat /etc/exports
- /koten/data/kubernetes *(rw,no_root_squash)
- /wordpress/data *(rw,no_root_squash)
- [root@Master231 kubernetes]# pwd
- /koten/data/kubernetes
- [root@Master231 kubernetes]# mkdir zrlog
- [root@Master231 kubernetes]# cp ~/zrlog-2.2.1-efbe9f9-release.war zrlog/
- [root@Master231 kubernetes]# unzip -q zrlog/zrlog-2.2.1-efbe9f9-release.war -d zrlog/
- [root@Master231 kubernetes]# rm zrlog/zrlog-2.2.1-efbe9f9-release.war
- rm: remove regular file ‘zrlog-2.2.1-efbe9f9-release.war’? y
复制代码 2、先通过docker运行,查看结果
- [root@Master231 ~]# docker run -p 8080:8080 -v /koten/data/kubernetes/zrlog:/usr/local/tomcat/webapps/ROOT --name zrlog -itd zrlog:v1
- d4a6428fc8d837d4948535fc024bae4739e488940860bde550be56f2295f1455
复制代码
3、编写deployment、service的yaml文件,部署出zrlog服务。
- [root@Master231 ~]# cat 01-zrlog-deployment-service.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: deploy-zrlog
- namespace: zrlog
- labels:
- apps: zrlog
- spec:
- replicas: 3
- selector:
- matchExpressions:
- - key: apps
- values:
- - "zrlog"
- operator: In
- template:
- metadata:
- labels:
- apps: zrlog
- spec:
- volumes:
- - name: data-zrlog
- nfs:
- server: master231
- path: /koten/data/kubernetes/zrlog
- containers:
- - name: zrlog
- image: tomcat:8
- volumeMounts:
- - name: data-zrlog
- mountPath: /usr/local/tomcat/webapps/ROOT
- ports:
- - containerPort: 8080
- ---
-
- apiVersion: v1
- kind: Service
- metadata:
- name: service-zrlog
- namespace: zrlog
- spec:
- type: NodePort
- selector:
- apps: zrlog
- ports:
- - port: 8080
- targetPort: 8080
- nodePort: 8080
- [root@Master231 ~]# kubectl create ns zrlog
- namespace/zrlog created
- [root@Master231 ~]# kubectl apply -f zrlog-deployment-service.yaml
- deployment.apps/deploy-zrlog created
- service/deploy-v1 created
- [root@Master231 ~]# kubectl get -f zrlog-deployment-service.yaml
- NAME READY UP-TO-DATE AVAILABLE AGE
- deployment.apps/deploy-zrlog 3/3 3 3 9s
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- service/deploy-v1 NodePort 10.200.175.3 <none> 8080:8080/TCP 9s
复制代码 4、通过pod所在节点的ip加8080端口,可以访问到我们的服务(此处应该是任意一个ip都可以,详见未解之谜),由于我们挂载了代码文件到nfs,以是3个副本直接访问nfs实现读取代码文件
5、部署ingress-nginx
- [root@Master231 ~]# cat 02-ingress-nginx.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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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:
- - networking.k8s.io
- resources:
- - ingresses
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - ''
- resources:
- - events
- verbs:
- - create
- - patch
- - apiGroups:
- - networking.k8s.io
- resources:
- - ingresses/status
- verbs:
- - update
- - apiGroups:
- - networking.k8s.io
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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:
- - networking.k8s.io
- resources:
- - ingresses
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - networking.k8s.io
- resources:
- - ingresses/status
- verbs:
- - update
- - apiGroups:
- - networking.k8s.io
- resources:
- - ingressclasses
- verbs:
- - get
- - list
- - watch
- - apiGroups:
- - ''
- resources:
- - configmaps
- resourceNames:
- - ingress-controller-leader
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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
- appProtocol: https
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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
- appProtocol: http
- - name: https
- port: 443
- protocol: TCP
- targetPort: https
- appProtocol: 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
- metadata:
- labels:
- helm.sh/chart: ingress-nginx-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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
- containers:
- - name: controller
- #image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6
- image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.0.0
- imagePullPolicy: IfNotPresent
- lifecycle:
- preStop:
- exec:
- command:
- - /wait-shutdown
- args:
- - /nginx-ingress-controller
- - --election-id=ingress-controller-leader
- - --controller-class=k8s.io/ingress-nginx
- - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- - --validating-webhook=:8443
- - --validating-webhook-certificate=/usr/local/certificates/cert
- - --validating-webhook-key=/usr/local/certificates/key
- 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/controller-ingressclass.yaml
- # We don't support namespaced ingressClass yet
- # So a ClusterRole and a ClusterRoleBinding is required
- apiVersion: networking.k8s.io/v1
- kind: IngressClass
- metadata:
- labels:
- helm.sh/chart: ingress-nginx-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: controller
- name: nginx
- namespace: ingress-nginx
- spec:
- controller: k8s.io/ingress-nginx
- ---
- # 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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:
- - v1
- operations:
- - CREATE
- - UPDATE
- resources:
- - ingresses
- failurePolicy: Fail
- sideEffects: None
- admissionReviewVersions:
- - v1
- clientConfig:
- service:
- namespace: ingress-nginx
- name: ingress-nginx-controller-admission
- path: /networking/v1/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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: admission-webhook
- spec:
- containers:
- - name: create
- #image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068
- image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.0
- 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
- nodeSelector:
- kubernetes.io/os: linux
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- 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-4.0.1
- app.kubernetes.io/name: ingress-nginx
- app.kubernetes.io/instance: ingress-nginx
- app.kubernetes.io/version: 1.0.0
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: admission-webhook
- spec:
- containers:
- - name: patch
- #image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068
- image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.0
- 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
- nodeSelector:
- kubernetes.io/os: linux
- securityContext:
- runAsNonRoot: true
- runAsUser: 2000
复制代码 6、编写ingress的yaml文件,把NodePort调整成ClusterIP
- [root@Master231 ~]# cat 03-ingress.yaml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: ingress-zrlog
- namespace: zrlog
- annotations:
- nginx.ingress.kubernetes.io/rewrite-target: /
- spec:
- ingressClassName: nginx
- rules:
- - host: zrlog.koten.vip
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: service-zrlog
- port:
- number: 8080
- [root@Master231 ~]# cat 01-zrlog-deployment-service.yaml
- ...
- apiVersion: v1
- kind: Service
- metadata:
- name: service-zrlog
- namespace: zrlog
- spec:
- type: ClusterIP
- selector:
- apps: zrlog
- ports:
- - port: 8080
- targetPort: 8080
- [root@Master231 ~]# kubectl apply -f 03-ingress.yaml
- [root@Master231 ~]# kubectl get ingress -A
- NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
- zrlog ingress-zrlog nginx zrlog.koten.vip 10.0.0.233 80 38m
- [root@Master231 ~]# kubectl apply -f 01-zrlog-deployment-service.yaml
复制代码 7、通过域名访问,新增电脑的hosts上剖析(C:\Windows\System32\drivers\etc下的hosts文件)
- 10.0.0.231 zrlog.koten.vip
复制代码 端口用ingress的nodeport袒暴露来的端口,也可以在部署ingress-nginx的时间去改,改成指定nodePort为80
- [root@Master231 ~]# kubectl get svc -n ingress-nginx
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- ingress-nginx-controller NodePort 10.200.199.140 <none> 80:9431/TCP,443:12175/TCP 23m
- ingress-nginx-controller-admission ClusterIP 10.200.113.50 <none> 443/TCP 23m
复制代码
此时没有证书我们用https访问是不可行的
8、在ingress上加上证书
- # 创建证书
- [root@Master231 ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout zrlog_tls.key -out zrlog_tls.crt -subj "/CN=zrlog.koten.vip/O=zrlog.koten.vip"
- # 将证书写入secret
- [root@Master231 ~]# kubectl create secret tls zrlog-tls-secret --cert=/root/zrlog_tls.crt --key=/root/zrlog_tls.key -n zrlog
- # 把刚刚编写http的ingress的yaml改成https的ingress的yaml
- [root@Master231 ~]# cat 04-ingress-https.yaml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: ingress-zrlog-https
- namespace: zrlog
- annotations:
- nginx.ingress.kubernetes.io/rewrite-target: /
- spec:
- ingressClassName: nginx
- tls:
- - hosts:
- - zrlog.koten.vip
- secretName: zrlog-tls-secret
- rules:
- - host: zrlog.koten.vip
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: service-zrlog
- port:
- number: 8080
- [root@Master231 ~]# kubectl apply -f 03-ingress.yaml
- [root@Master231 ~]# kubectl get ingress -A
- NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
- zrlog ingress-zrlog nginx zrlog.koten.vip 10.0.0.233 80, 443 39m
复制代码 按原理我们到这里就可以用域名加ingress-nginx袒暴露来的外网端口可以访问了,但是这个项目比较特别,访问的时间有重定向操作。
访问 https://zrlog.koten.vip:12175 会自动重定向到 https://zrlog.koten.vip/install 但是80端口又无法直接访问,以是我们还是把ingress-nginx的nodeport袒露的端口改成80和443
- [root@Master231 ~]# cat 02-ingress-nginx.yaml
- ...
- 277 nodePort: 80
- ...
- 283 nodePort: 443
- ...
- # 注意提前更改端口可用范围
- [root@Master231 ~]# kubectl apply -f 02-ingress-nginx.yaml
复制代码 此时可以乐成访问了,生产环境每每也让ingress-nginx的nodeport袒暴露指定的端口,不愿定是80和443,但是基本上是固定不变的,前面还用云服务负载均衡做轮询,给服务提供一个访问的入口
后续还可以把数据库弄到pod上,一个小项目就这么被拆分成微服务,上k8s了
三、题目菜单
写这篇文章的时间遇到了个题目,svc用了nodeport,按理说我通过我任意一个节点的ip加袒露的端口,都可以访问到服务,我浏览器访问的时间只能用pod所在的节点IP加端口访问到,而不是所有ip,我的kube-proxy是正常的,试了iptables和ipvs都不行,清理了iptables规则,都不行。
我在服务器上curl pod所在的节点加端口,好比我3个pod,2个在2节点,1个在3节点。我curl2节点的时间就是curl3次通2次,curl1节点就是curl3次通1次,不知道为啥这么轮询,在浏览器访问的话2,3节点都是无感知的。1节点因为没有pod调度就是咋都通不了。
末了是重装了flannel解决了该题目。
我是koten,10年运维经验,持续分享运维干货,感谢各人的阅读和关注!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |