您的当前位置:首页正文

k8s部署nginx的三种方式小结

2024-11-07 来源:个人技术集锦

使用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进行访问
显示全文