在Kubernetes集群中部署nginx,并确保它们正确配置为生成日志

在生产环境中,在Kubernetes集群中部署nginx,并确保它们正确配置为生成日志。nginx提供服务。 除了上面的Deployment,PersistentVolumeClaim,Service配置 还可以配置Ingress,以从Internet访问nginx服务。 进一步配置Ingress以添加TLS加密或路由请求

部署nginx:在Kubernetes集群中部署nginx,并确保它们正确配置为生成日志。请提供一个生产环境的完整配置示例。 以下是一个示例,其中nginx实例是3个副本的Deployment:


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
        volumeMounts:
        - name: nginx-logs
          mountPath: /var/log/nginx
        env:
        - name: "NGINX_LOG_FORMAT"
          value: '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time'
      volumes:
      - name: nginx-logs
        persistentVolumeClaim:
          claimName: nginx-logs-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-logs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在这个示例中,您首先使用Deployment模板部署nginx容器,并将其配置为挂载到/var/log/nginx目录。在容器内,您可以设置环境变量以指定nginx生成的日志格式。然后,您创建了一个名为nginx-logs-pvc的PersistentVolumeClaim,以便在挂载到容器的/var/log/nginx目录中提供持久存储。

		
	ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
		  - name: nginx
        image: nginx:
        volumeMounts:
        - name: nginx-logs
          mountPath: /var/log/nginx
      volumes:
      - name: nginx-logs
        hostPath:
          path: /var/log/nginx
		  ```		
2种方式的区别在哪里?
首先这两种方式是不同的。
第一种方式:

用于定义MySQL数据库的存储。
定义了一个名为mysql-persistent-storage的存储卷,该卷在容器内映射到/var/lib/mysql目录。
定义了一个名为mysql的容器,该容器使用MySQL镜像并将数据存储在该卷中。
第二种方式:

用于定义nginx的日志存储。
定义了一个名为nginx-logs的存储卷,该卷在容器内映射到/var/log/nginx目录。
定义了一个名为nginx的容器,该容器使用nginx镜像并将日志存储在该卷中。
总的来说,第一种方式用于存储MySQL数据库,而第二种方式用于存储nginx的日志。在生产环境中,这些数据需要持久保存,以防止数据丢失。因此,使用持久存储卷对于确保生产数据的安全是很重要的。

### 扩容 nginx日志pvc
扩容 PersistentVolumeClaim 的方法通常是以下两步:

修改 PersistentVolumeClaim 的请求容量,例如从1Gi增加到2Gi

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-log-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi ```Text only

应用修改:

		
kubectl apply -f <file-name>.yaml
```Text only
		
修改完成后,Kubernetes会自动分配新的容量,并在下一次容器重启时加载。但是,具体的操作可能因存储后端和环境而异。因此,请确保检查具体的存储后端文档,以确保您的解决方案是正确的。

##

一个在生产环境中配置Kubernetes集群以部署并访问Nginx服务的Deployment PersistentVolumeClaim Service  Ingress示例:是80端口的

apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports:

  • name: http port: 80 targetPort: 80 type: ClusterIP

#在生产环境中,你可以通过这种方式配置Nginx服务: Deployment和Service配置80端口,然后Ingress配置80和443端口,以实现访问Nginx服务的80和443端口的功能。 #该示例中的Ingress配置仅暴露了Nginx服务的80端口和443端口。因此,容器中的Nginx需要同时配置80和443端口以支持http和https请求 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / certmanager.k8s.io/cluster-issuer: letsencrypt-prod spec: tls:

  • hosts:
    • nginx.example.com secretName: tls-secret rules:
  • host: nginx.example.com http: paths:
    • path: / pathType: Prefix backend: service: name: nginx-service port: name: http
  • host: nginx.example.com http: paths:
    • path: / pathType: Prefix backend: service: name: nginx-service port: name: https

apiVersion: v1 kind: Secret metadata: name: tls-secret type: kubernetes.io/tls data: tls.crt: tls.key:

		  
该示例中的Ingress配置仅暴露了Nginx服务的80端口和443端口。因此,容器中的Nginx需要同时配置80和443端口以支持http和https请求。 Deployment和Service配置80端口,然后Ingress配置80和443端口,以实现访问Nginx服务的80和443端口的功能。
这里,我们通过配置Ingress来支持TLS加密,使用nginx-tls-secret秘密对网站的请求进行加密,并对网址进行路由。
这里使用了一个TLS秘密以配置TLS加密。您应该将证书和私钥用base64编码后替换为实际数据。
请注意,您需要为您的域创建证书,并将证书作为秘密存储在Kubernetes集群中。您还需要确保您的域名绑定到Kubernetes集群中的Ingress IP。

## 自动Https证书签发
如需要自动Https证书签发(letsencrypt的证书)
可以使用Cert-Manager进行自动Https证书签发。下面是一个使用Cert-Manager进行自动Https证书签发的配置示例:

apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: # You must replace this email address with your own. email: example@example.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx

			  
在Ingress的配置中引用该ClusterIssuer,如下

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-example annotations: nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/issuer: “letsencrypt-prod” spec: tls:

  • hosts:
    • example.com secretName: example-com-tls rules:
  • host: example.com http: paths:
    • path: / pathType: Prefix backend: service: name: internal-service port: name: https

随机文章