在Kubernetes集群中部署nginx,并确保它们正确配置为生成日志
在生产环境中,在Kubernetes集群中部署nginx,并确保它们正确配置为生成日志。nginx提供服务。 除了上面的Deployment,PersistentVolumeClaim,Service配置 还可以配置Ingress,以从Internet访问nginx服务。 进一步配置Ingress以添加TLS加密或路由请求
1 配置Deployment
部署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目录中提供持久存储。
1.1 mysql与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端口的
2 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:1.17
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-log-pvc
3 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-log-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
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:
该示例中的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