使用kubernetes来部署nginx服务,nginx一般是作为服务的入口,其在kubernetes的部署方式也大致相似,我将其分为三种----直接部署、使用数据卷部署、使用ConfigMap部署。个人建议使用ConfigMap部署。
直接部署
这种方式就是直接将nginx复制到容器内部,将其制作为镜像,之后进行部署,优点吗?不知道。缺点在每次更新配置文件时,需要重新制作经镜像
部署步骤
前提:需要有自己的nginx配置文件
- 拉去nginx官方镜像,建议选择稳定版(stable)
$ docker pull nginx:1.22.0
- 编写Dockerfile
FROM nginx:1.22.0 # 删除官方nginx镜像默认的配置 RUN rm -rf /etc/nginx/conf.d/default.conf # 将nginx.conf(自己的nginx配置)添加到默认配置目录下 # 注意:nginx.conf需要与Dockerfile在同一目录 ADD ./nginx.conf /etc/nginx/conf.d/
- 构建自己的nginx镜像
# 在Dockerfile所在目录执行,v1.0.0是新构建nginx镜像的tag $ docker build -t nginx:v1.0.0 .
- 编写nginx-service-deployment.yaml
apiVersion: v1 kind: Service metadata: labels: app: nginx-servie name: nginx-service # 命名空间,没有可以删除,默认是default namespace: hello-world spec: ports: # 对外暴露的端口 - nodePort: 30013 port: 80 protocol: TCP targetPort: 80 selector: app: nginx-pod # NodePort类型可以对外暴露端口 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: hello-world spec: replicas: 1 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod namespace: hello-world spec: containers: # 镜像名称 - image: nginx:v1.0.0 name: nginx ports: - containerPort: 80 resources: {}
- 执行yaml文件
$ kubectl apply -f nginx-service-deployment.yaml
- 通过nodeIp+nodePort进行访问
使用数据卷部署
这种方式是通过将nginx的配置文件以数据卷的形式挂载出来,修改nginx配置文件,只需要修改挂载出来的文件,同时删除pod即可。缺点是需要数据卷做支撑,如nfs等,如果使用pv、pvc,还需要配置pv、pvc文件,在集群模式下不要使用host进行挂载,测试时可以使用;优点是部署好后改动小。
部署步骤
前提:需要有nginx的配置文件,并且配置好nfs共享
- 配置nfs共享,将nginx配置文件共享出来,略
注意:挂载的方式只支持文件夹挂载不支持文件挂载,不仅是在nfs配置中,容器的配置中也是一样的 - 编写nginx-service-deployment.yaml,示例不适用pv、pvc
apiVersion: v1 kind: Service metadata: labels: app: nginx-service name: nginx-service # 命名空间,没有可以删除,默认是default namespace: hello-world spec: ports: # 对外暴露的端口 - nodePort: 30013 port: 80 protocol: TCP targetPort: 80 selector: app: nginx-pod # NodePort类型可以对外暴露端口 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: hello-world spec: replicas: 1 selector: matchLabels: app: nginx-pod strategy: {} template: metadata: labels: app: nginx-pod namespace: hello-world spec: containers: - image: nginx:1.22.0 name: nginx ports: - containerPort: 80 resources: {} volumeMounts: - name: nginx-config mountPath: "/etc/nginx/conf.d/" volumes: - name: nginx-config nfs: # 共享的目录 path: "/opt/nginx/" server: xxx.xxx.xxx.xxx
- 执行yaml文件
$ kubectl apply -f nginx-service-deployment.yaml
- 通过nodeIp+nodePort进行访问
使用ConfigMap进行部署
这种方式是通过ConfigMap的方式将nginx的配置文件挂载出来,修改nginx的配置文件时,只需要修改ConfigMap,同时删除就的pod即可。缺点是配置文件时只读文件,如果对文件有特殊要求的不行;优点是改动小,操作简单。
部署步骤
- 编写nginx-configmap.yaml
这里写了一个简单的例子,访问/hello-world/进行跳转
apiVersion: v1 kind: ConfigMap metadata: name: nginx-configmap namespace: hello-world data: default.conf: | server { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
- 编写nginx-service-deployment.yaml
apiVersion: v1 kind: Service metadata: labels: app: nginx-service name: nginx-service # 命名空间,没有可以删除,默认是default namespace: hello-world spec: ports: # 对外暴露的端口 - nodePort: 30013 port: 80 protocol: TCP targetPort: 80 selector: app: nginx-pod # NodePort类型可以对外暴露端口 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: hello-world spec: replicas: 1 selector: matchLabels: app: nginx-pod strategy: {} template: metadata: labels: app: nginx-pod namespace: hello-world spec: containers: - image: nginx:1.22.0 name: nginx ports: - containerPort: 80 resources: {} volumeMounts: - name: nginx-config mountPath: "/etc/nginx/conf.d/" readOnly: true volumes: - name: nginx-config configMap: name: nginx-configmap
- 执行yaml文件
$ kubectl apply -f nginx-configmap.yaml $ kubectl apply -f nginx-service-deployment.yaml
- 通过nodeIp+nodePort进行访问