k8s部署nginx的三种方式

创作时间:2022-08-09
更新时间:2023-03-13 | 更新内容:修改deploy.yaml文件中service对pod的选择label;修改nfs的挂载路径为路径不能为文件,容器挂载路径不能为文件;更新nginx-configmap中default.conf的内容 | 感谢:西瓜蓬蓬
如遇到问题请联系。

使用kubernetes来部署nginx服务,nginx一般是作为服务的入口,其在kubernetes的部署方式也大致相似,我将其分为三种----直接部署、使用数据卷部署、使用ConfigMap部署。个人建议使用ConfigMap部署。

直接部署

这种方式就是直接将nginx复制到容器内部,将其制作为镜像,之后进行部署,优点吗?不知道。缺点在每次更新配置文件时,需要重新制作经镜像

部署步骤

前提:需要有自己的nginx配置文件

  1. 拉去nginx官方镜像,建议选择稳定版(stable)
$ docker pull nginx:1.22.0
  1. 编写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/
  1. 构建自己的nginx镜像
# 在Dockerfile所在目录执行,v1.0.0是新构建nginx镜像的tag
$ docker build -t nginx:v1.0.0 .
  1. 编写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: {}
  1. 执行yaml文件
$ kubectl apply -f nginx-service-deployment.yaml
  1. 通过nodeIp+nodePort进行访问

使用数据卷部署

这种方式是通过将nginx的配置文件以数据卷的形式挂载出来,修改nginx配置文件,只需要修改挂载出来的文件,同时删除pod即可。缺点是需要数据卷做支撑,如nfs等,如果使用pv、pvc,还需要配置pv、pvc文件,在集群模式下不要使用host进行挂载,测试时可以使用;优点是部署好后改动小。

部署步骤

前提:需要有nginx的配置文件,并且配置好nfs共享

  1. 配置nfs共享,将nginx配置文件共享出来,略
    注意:挂载的方式只支持文件夹挂载不支持文件挂载,不仅是在nfs配置中,容器的配置中也是一样的
  2. 编写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
  1. 执行yaml文件
$ kubectl apply -f nginx-service-deployment.yaml
  1. 通过nodeIp+nodePort进行访问

使用ConfigMap进行部署

这种方式是通过ConfigMap的方式将nginx的配置文件挂载出来,修改nginx的配置文件时,只需要修改ConfigMap,同时删除就的pod即可。缺点是配置文件时只读文件,如果对文件有特殊要求的不行;优点是改动小,操作简单。

部署步骤

  1. 编写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;
        }
    }

  1. 编写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
  1. 执行yaml文件
$ kubectl apply -f nginx-configmap.yaml
$ kubectl apply -f nginx-service-deployment.yaml
  1. 通过nodeIp+nodePort进行访问
Kubernetes中,您可以使用以下三种方式部署Nginx: 1. 使用Deployment和Service:这是最常见的部署方式,它使用Deployment控制器来管理Pod的创建和伸缩,并使用Service将流量路由到Pod。以下是一个示例配置: Deployment配置(nginx-deployment.yaml): ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 ``` Service配置(nginx-service.yaml): ```yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer ``` 使用命令部署: ``` kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-service.yaml ``` 2. 使用Helm Chart:Helm是Kubernetes的包管理工具,可以简化应用程序的部署和管理。您可以使用Helm Chart来部署Nginx。以下是一个示例配置: 创建Helm Chart: ``` helm create nginx-chart ``` 编辑Chart配置文件(values.yaml): ```yaml replicaCount: 3 image: repository: nginx tag: latest pullPolicy: IfNotPresent service: name: nginx-service type: LoadBalancer port: 80 ``` 安装Helm Chart: ``` helm install nginx nginx-chart ``` 3. 使用Kubernetes Ingress:Ingress是Kubernetes集群中的一个API对象,它充当流量入口,并将流量路由到不同的服务。您可以使用Ingress来部署Nginx,并通过Ingress规则配置路由。以下是一个示例配置: 创建Ingress资源(nginx-ingress.yaml): ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress spec: rules: - host: example.com http: paths: - pathType: Prefix path: / backend: service: name: nginx-service port: number: 80 ``` 使用命令部署: ``` kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-ingress.yaml ``` 请注意,这些示例仅提供了基本的部署配置。根据您的需求,您可能需要进行其他配置,例如使用持久声明(Persistent Volume Claim)来存储Nginx日志文件或自定义Nginx配置等。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值