Kubernetes 使用configmap挂载卷给Pod内的nginx容器,并且实现nginx的代理服务

目录

实验:使用configmap挂载卷给Pod内的nginx容器

1、创建nginx.conf配置文件(必须由nginx镜像里的nginx.conf修改而来,防止出现配置不相似的情况出现,导致访问不了nginx网页)

2、通过nginx.conf文件创建configmap容器(注意nginx.conf文件必须在该目录下)

3、查看创建的configmap和它的详细资料

4、根据configmap创建nginx-deployment.yaml文件

5、运行nginx-deployment.yaml,创建Pod

6、创建Service发布nginx容器服务,创建nginx-service.yaml文件

7、运行nginx-service.yaml,创建Pod

8、验证访问

实验:使用Configmap将nginx容器变为代理服务器,使集群内访问集群外边的资源通过nginx tcp代理。

1、使用nginx-config.yaml文件创建Configmap

2、搭建nginx容器,调用Configmap更新nginx的配置文件(添加入网口的标签):

3、运行 nginx-deployment2.yaml,搭建Pod

4、运行 nginx-service2.yaml,搭建Service服务

5、运行nginx-service2.yaml 和 nginx-service3.yaml, 搭建Service服务

6、验证访问:


实验:使用configmap挂载卷给Pod内的nginx容器

1、创建nginx.conf配置文件(必须由nginx镜像里的nginx.conf修改而来,防止出现配置不相似的情况出现,导致访问不了nginx网页)

(base) root@sd-cluster-04:/etc/nginx# cat nginx.conf 
# claylpf test

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
(base) root@sd-cluster-04:/etc/nginx# 

2、通过nginx.conf文件创建configmap容器(注意nginx.conf文件必须在该目录下)

(base) root@sd-cluster-04:/etc/nginx# kubectl create configmap nginx-config --from-file=nginx.conf -n testns

3、查看创建的configmap和它的详细资料

(base) root@sd-cluster-04:/etc/nginx# kubectl get configmap nginx-config -n testns #查看是否成功运行
NAME           DATA   AGE
nginx-config   1      77s


(base) root@sd-cluster-04:/etc/nginx# kubectl describe configmap/nginx-config -n testns  # 查看详细信息
Name:         nginx-config
Namespace:    testns
Labels:       <none>
Annotations:  <none>

Data
====
nginx.conf:
----
# claylpf test

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Events:  <none>
(base) root@sd-cluster-04:/etc/nginx# 

4、根据configmap创建nginx-deployment.yaml文件

(base) root@sd-cluster-04:/etc/nginx# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: testns
spec:
  replicas: 1
  selector:
    matchLabels:
      app: clay-nginx
  template:
    metadata:
      labels:
        app: clay-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
        - name: nginx-config-volume
          configMap:
            name: nginx-config
            items:
            - key: nginx.conf
              path: nginx.conf     
(base) root@sd-cluster-04:/etc/nginx# 

代码解释:

这是一个 Kubernetes Deployment 的 YAML 文件,用于定义一个部署配置。以下是逐行解释该文件的内容:

1. `apiVersion: apps/v1`: 这一行指定了 Kubernetes API 的版本,以及使用的资源类型是 Deployment。

2. `kind: Deployment`: 指定了资源的种类,这是一个部署 (Deployment)。

3. `metadata:`: 定义资源的元数据,包括名称和命名空间。

   - `name: nginx-deployment`: 部署的名称是 "nginx-deployment"。
   - `namespace: testns`: 部署所属的命名空间是 "testns"。

6. `spec:`: 定义了部署的规格,包括副本数、选择器以及 Pod 模板。

   - `replicas: 1`: 指定了要运行的副本数量,这里是 1 个。
   
   - `selector:`: 选择器用于确定要管理的 Pod 集合。

     - `matchLabels:`: 指定了需要匹配的标签。

       - `app: clay-nginx`: 匹配标签中含有 "app: clay-nginx" 的 Pod。

   - `template:`: 定义了要创建的 Pod 模板。

     - `metadata:`: 定义 Pod 模板的元数据,包括标签。

       - `labels:`: 指定了 Pod 的标签,这里是 "app: clay-nginx"。

     - `spec:`: 定义了 Pod 的规格。

       - `containers:`: 定义了容器列表。

         - `name: nginx`: 定义容器的名称为 "nginx"。
         - `image: nginx:1.24`: 指定容器使用的镜像,这里使用的是 Nginx 版本 1.24。
         - `ports:`: 定义容器的端口配置。

           - `containerPort: 80`: 容器监听的端口是 80。

         - `volumeMounts:`: 定义了卷挂载配置,将卷挂载到容器内。

           - `name: nginx-config-volume`: 指定挂载卷的名称,这个名称将与下面定义的卷匹配。
           - `mountPath: /etc/nginx/nginx.conf`: 指定挂载的路径在容器内的位置。
           - `subPath: nginx.conf`: 指定在卷中的子路径。

       - `volumes:`: 定义了卷的配置。

         - `name: nginx-config-volume`: 定义了一个名为 "nginx-config-volume" 的卷。
         - `configMap:`: 指定卷的类型为 ConfigMap。

           - `name: nginx-config`: 指定 ConfigMap 的名称,这个名称将与集群中的 ConfigMap 匹配。
           - `items:`: 指定要从 ConfigMap 中提取的键值对。

             - `key: nginx.conf`: 指定键的名称。
             - `path: nginx.conf`: 指定将键的值映射到容器内的路径。

这个配置文件描述了一个部署,它将创建一个 Pod,其中运行一个名为 "nginx" 的容器,该容器使用 Nginx 1.24 镜像,并将一个名为 "nginx-config-volume" 的 ConfigMap 挂载到容器内的 `/etc/nginx/nginx.conf` 路径上。这样,Nginx 容器将使用 ConfigMap 中的配置文件来配置其行为。

5、运行nginx-deployment.yaml,创建Pod

(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-deployment.yaml 

(base) root@sd-cluster-04:/etc/nginx# kubectl get pods -o wide -n testns
NAME                                READY   STATUS        RESTARTS   AGE    IP             NODE            NOMINATED NODE   READINESS GATES
es-cluster-0                        0/1     Terminating   0          62d    10.244.5.163   sd-cluster-02   <none>           <none>
mysql-deployment-66c4d975f5-zm4sz   1/1     Running       0          5d1h   10.244.0.212   sd-cluster-04   <none>           <none>
nginx-deployment-67fb5f6db7-9ltlb   1/1     Running       0          21m    10.244.1.254   sd-cluster-05   <none>           <none>
redis-deployment-f7d7dd455-xk7h8    1/1     Running       0          5d     10.244.0.215   sd-cluster-04   <none>           <none>
(base) root@sd-cluster-04:/etc/nginx# 

6、创建Service发布nginx容器服务,创建nginx-service.yaml文件

(base) root@sd-cluster-04:/etc/nginx# cat nginx-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: testns
  labels:
    app: clay-nginx
spec:
  type: NodePort
  selector:
    app: clay-nginx  
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31273
(base) root@sd-cluster-04:/etc/nginx# 

逐行解释:

这是一个 Kubernetes Service 的 YAML 文件,用于创建一个服务资源。以下是逐行解释该文件的内容:

1. `apiVersion: v1`: 这一行指定了 Kubernetes API 的版本,以及使用的资源类型是 Service。

2. `kind: Service`: 指定了资源的种类,这是一个服务 (Service)。

3. `metadata:`: 定义了服务的元数据,包括名称、命名空间和标签。

   - `name: nginx-service`: 服务的名称是 "nginx-service"。
   - `namespace: testns`: 服务所属的命名空间是 "testns"。

   - `labels:`: 为服务添加标签。

     - `app: clay-nginx`: 将标签 "app: clay-nginx" 添加到服务上。

6. `spec:`: 定义了服务的规格,包括服务类型、选择器和端口配置。

   - `type: NodePort`: 指定了服务的类型为 NodePort,这意味着服务将暴露到每个节点的指定端口上。

   - `selector:`: 选择器用于确定哪些 Pod 属于这个服务。

     - `app: clay-nginx`: 匹配标签中含有 "app: clay-nginx" 的 Pod。

   - `ports:`: 定义了服务监听的端口配置。

     - `protocol: TCP`: 指定了端口的传输协议是 TCP。

     - `port: 80`: 服务监听的端口号是 80。

     - `targetPort: 80`: 服务将流量转发到后端 Pod 的端口号是 80。

     - `nodePort: 31273`: 如果服务类型是 NodePort,这个配置项指定了节点上用于访问服务的端口号。在这个例子中,服务将在节点上的端口 31273 上监听,从而可以通过节点的 IP 地址和该端口访问该服务。

这个配置文件描述了一个服务,它会将流量从节点的端口 31273 转发到匹配标签 "app: clay-nginx" 的后端 Pod 上的端口 80。这种服务类型通常用于在外部网络上访问 Kubernetes 集群中的服务。

7、运行nginx-service.yaml,创建Pod

(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-service.yaml 

(base) root@sd-cluster-04:/etc/nginx# kubectl get service -o wide -n testns
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
mysql-service   NodePort   10.96.132.123   <none>        3306:30859/TCP   5d    app=mysql
nginx-service   NodePort   10.96.87.157    <none>        80:31273/TCP     65m   app=clay-nginx
redis-service   NodePort   10.96.10.164    <none>        6379:30026/TCP   5d    app=redis
(base) root@sd-cluster-04:/etc/nginx# 

8、验证访问

首先访问容器内的配置文件是否发生更改:

再次访问浏览器,产科nginx的Web服务是否发布 

实验:使用Configmap将nginx容器变为代理服务器,使集群内访问集群外边的资源通过nginx tcp代理。

1、使用nginx-config.yaml文件创建Configmap

(base) root@sd-cluster-04:/etc/nginx# cat nginx-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: testns
data:
  nginx.conf: | 
    user  nginx;
    worker_processes  auto;

    events {
        worker_connections  1024;
    }

    stream {
        upstream hive {
            server 192.168.1.209:3306;    
        }
   
    server {
        listen 8888;
        proxy_pass hive;
        }
    }
 
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;

        keepalive_timeout  65;

        #gzip  on;

        include /etc/nginx/conf.d/*.conf;
    }
(base) root@sd-cluster-04:/etc/nginx# 

 代码解释:(使用了nginx的代理功能)

这是一个名为 `nginx-config` 的 Kubernetes ConfigMap 配置,用于存储 Nginx 的配置文件内容。让我逐行解释这个配置文件的各个部分:

1. `user nginx;`: 设置 Nginx 进程运行的用户为 `nginx`。

2. `worker_processes auto;`: 设置 Nginx 使用的工作进程数量自动适应可用的 CPU 内核数。

3. `events { ... }`: 在这个块中,定义了 Nginx 事件模块的配置。通常用于配置 Nginx 如何处理客户端连接和网络事件。

   - `worker_connections 1024;`: 设置每个工作进程可以同时处理的最大连接数为 1024。

4. `stream { ... }`: 这是一个 Nginx 流块,通常用于配置 TCP/UDP 代理或负载均衡。在这里,定义了一个名为 `hive` 的上游服务器,它将流量代理到 `192.168.1.209` 的 `3306` 端口。这似乎是将流量代理到 MySQL 服务器。

   - `server { ... }`: 定义了一个监听在 `8888` 端口的流服务器块,该服务器将传入的流量代理到名为 `hive` 的上游服务器。

5. `http { ... }`: 这是一个 Nginx HTTP 块,用于配置 HTTP 服务器。

   - `include /etc/nginx/mime.types;`: 引用了 MIME 类型文件,用于指定文件扩展名与 MIME 类型之间的映射关系。

   - `default_type application/octet-stream;`: 设置默认的 MIME 类型为 `application/octet-stream`,如果无法确定具体的文件类型时将使用该类型。

   - `log_format main '...';`: 定义了日志格式,该格式用于记录访问日志信息。

   - `access_log /var/log/nginx/access.log main;`: 配置了访问日志文件的位置和使用的日志格式。

   - `sendfile on;`: 启用文件传输,加快文件传输速度。

   - `keepalive_timeout 65;`: 设置客户端保持连接的超时时间。

   - `include /etc/nginx/conf.d/*.conf;`: 包含了 `/etc/nginx/conf.d/` 目录下的其他配置文件。

总之,这个配置文件定义了一个 Nginx 服务器,该服务器通过 `8888` 端口接受流量,并将流量代理到名为 `hive` 的上游服务器,而该上游服务器似乎是一个 MySQL 服务器。此外,该配置文件还包括了一些 HTTP 服务器的配置,例如访问日志、MIME 类型映射等。这个配置文件的具体功能可能需要根据实际需求来确定。

创建Configmap:

(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-config.yaml 
configmap/nginx-config created

2、搭建nginx容器,调用Configmap更新nginx的配置文件(添加入网口的标签):

(base) root@sd-cluster-04:/etc/nginx# cat nginx-deployment2.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: testns
  labels:
    zone: fjy
    nodetype: inward
spec:
  replicas: 1
  selector:
    matchLabels:
      app: clay-nginx
      zone: fjy
      nodetype: inward
  template:
    metadata:
      labels:
        app: clay-nginx
        zone: fjy
        nodetype: inward
    spec:
      containers:
      - name: nginx
        image: nginx:1.24
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
        - name: nginx-config-volume
          configMap:
            name: nginx-config
            items:
            - key: nginx.conf
              path: nginx.conf     
(base) root@sd-cluster-04:/etc/nginx# 

3、运行 nginx-deployment2.yaml,搭建Pod

(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-deployment2.yaml 
deployment.apps/nginx-deployment created

查看Pod:

(base) root@sd-cluster-04:/etc/nginx# kubectl get pods -o wide -n testns
NAME                                READY   STATUS        RESTARTS   AGE     IP             NODE            NOMINATED NODE   READINESS GATES
es-cluster-0                        0/1     Terminating   0          64d     10.244.5.163   sd-cluster-02   <none>           <none>
mysql-deployment-66c4d975f5-zm4sz   1/1     Running       0          6d22h   10.244.0.212   sd-cluster-04   <none>           <none>
nginx-deployment-859449b97-bp4fz    1/1     Running       0          6m33s   10.244.0.82    sd-cluster-04   <none>           <none>
redis-deployment-f7d7dd455-xk7h8    1/1     Running       0          6d22h   10.244.0.215   sd-cluster-04   <none>           <none>

查看标签: 

(base) root@sd-cluster-04:/etc/nginx# kubectl get pods -n testns --show-labels
NAME                                READY   STATUS        RESTARTS   AGE     LABELS
es-cluster-0                        0/1     Terminating   0          64d     app=es-cluster,chart=elasticsearch,controller-revision-hash=es-cluster-7c77895f7f,heritage=Helm,release=es-cluster,statefulset.kubernetes.io/pod-name=es-cluster-0
mysql-deployment-66c4d975f5-zm4sz   1/1     Running       0          6d22h   app=mysql,pod-template-hash=66c4d975f5
nginx-deployment-859449b97-xd7x8    1/1     Running       0          19s     app=clay-nginx,nodetype=inward,pod-template-hash=859449b97,zone=fjy
redis-deployment-f7d7dd455-xk7h8    1/1     Running       0          6d21h   app=redis,pod-template-hash=f7d7dd455

4、运行 nginx-service2.yaml,搭建Service服务

(base) root@sd-cluster-04:/etc/nginx# cat nginx-service2.yaml   # service2用于发布8888端口
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-2
  namespace: testns
  labels:
    app: clay-nginx
    zone: fjy
    nodetype: inward
spec:
  type: NodePort
  selector:
    app: clay-nginx  
  ports:
    - protocol: TCP
      port: 8888
      targetPort: 8888
      nodePort: 31275
(base) root@sd-cluster-04:/etc/nginx# cat nginx-service3.yaml   # service3用于发布80端口
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: testns
  labels:
    app: clay-nginx
    zone: fjy
    nodetype: inward
spec:
  type: NodePort
  selector:
    app: clay-nginx  
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31273
(base) root@sd-cluster-04:/etc/nginx# 

5、运行nginx-service2.yaml 和 nginx-service3.yaml, 搭建Service服务

(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-service2.yaml 
service/nginx-service-2 created
(base) root@sd-cluster-04:/etc/nginx# kubectl apply -f nginx-service3.yaml 
service/nginx-service-3 created

查看Service:

(base) root@sd-cluster-04:/etc/nginx# kubectl get service -o wide -n testns
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
mysql-service     NodePort   10.96.132.123   <none>        3306:30859/TCP   6d21h   app=mysql
nginx-service     NodePort   10.96.44.105    <none>        80:31273/TCP     28m     app=clay-nginx
nginx-service-2   NodePort   10.96.77.236    <none>        8888:31275/TCP   28m     app=clay-nginx
redis-service     NodePort   10.96.10.164    <none>        6379:30026/TCP   6d21h   app=redis

6、验证访问:

访问nginx的代理服务:

访问mysql的代理服务:

修改的部分: