k8s上使用ConfigMap 和 Secret

使用ConfigMap 和 Secret

实验目标:

学习如何使用 ConfigMap 和 Secret 来管理应用的配置。

实验步骤:

  • 创建一个 ConfigMap 存储应用配置。
  • 创建一个 Secret 存储敏感信息(如数据库密码)。
  • 在 Pod 中挂载 ConfigMap 和 Secret,并验证应用读取配置。

今天我们来做一下分享的可练习实验中的第二个实验:使用ConfigMap 和 Secret

首先我们需要先知道ConfigMapSecret到底是什么东西???

  • ConfigMap:
    是一种用于存储非机密数据的键值对。它可以用来保存环境变量、命令行参数、配置文件等。
  • Secret:
    是一种用于存储敏感数据(如密码、令牌、密钥)的资源类型。与 ConfigMap 不同,Secret 中的数据是经过 Base64 编码的,以便提供一定的安全性。

示例场景

假设我们有一个简单的 Node.js web 应用,需要以下配置:

  • 应用程序配置(如日志级别)
  • 数据库凭证(用户名和密码)

步骤

1、创建应用程序配置的ConfigMap

首先,我们创建一个 ConfigMap,存储应用程序的配置。

yaml 复制代码
# app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "debug"
  PORT: "3000"

使用以下命令应用这个配置:

bash 复制代码
kubectl apply -f app-config.yaml

2、创建数据库凭证的Secret

接下来,我们创建一个 Secret,存储数据库的用户名和密码。

yaml 复制代码
# db-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
data:
  DB_USERNAME: YWRtaW4=  # Base64 编码的 "admin"
  DB_PASSWORD: cGFzc3dvcmQ=  # Base64 编码的 "password"

可以使用 echo -n 'admin' | base64 来生成自己的账号密码

使用以下命令应用这个配置:

bash 复制代码
kubectl apply -f db-secret.yaml

3、创建node.js应用的Dockerfile

我们需要一个简单的 Node.js 应用,读取配置和数据库凭证。创建一个 Dockerfile 来构建应用的 Docker 镜像。

bash 复制代码
# Dockerfile
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]

同时需要在项目目录中创建一个package.json文件,确保 Dockerfile 正确地复制和使用该文件

json 复制代码
{
  "name": "node-app",
  "version": "1.0.0",
  "description": "Node.js application",
  "main": "app.js",
  "dependencies": {
    "express": "^4.17.1"
  }
}

创建 app.js 以读取配置和凭证

javascript 复制代码
// app.js
const express = require('express');
const app = express();

const logLevel = process.env.LOG_LEVEL || 'info';
const port = process.env.PORT || 3000;

const dbUsername = process.env.DB_USERNAME;
const dbPassword = process.env.DB_PASSWORD;

app.get('/', (req, res) => {
  res.send(`Log Level: ${logLevel}, DB Username: ${dbUsername}`);
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});

4、构建并推送Docker 镜像

构建并推送 Docker 镜像到你的 Docker 仓库(例如 Docker Hub 或私有仓库)。

先构建镜像

bash 复制代码
docker build -t <your-docker-repo>/node-app:latest .

注意:

这里构建时会从dockerhub上拉取镜像,因为最近网络的问题被限了很多。这里我直接配置代理环境,这样构建时会快很多。具体的配置代理请参考:虚拟机开启网络代理设置

我这里可以正常访问ok

接着继续构建镜像

推送镜像到hub仓库

bash 复制代码
docker push <your-docker-repo>/node-app:latest

这里在推送时我还是遇到了网络问题,索性我直接将镜像推送到阿里云的镜像仓库,这样都在国内的情况下,速度也会很快还不会受影响。具体的操作移步: 阿里云免费仓库

言归正传,虽说已经创建好了仓库,但是由于我们构建镜像时的命名规则并未按照阿里云仓库的要求来,现在上传时还是会有一些问题,我们来修改一下

使用docker tag 命令为现有镜像添加新的标签:

bash 复制代码
docker tag qingtongqingc/node-app:latest registry.cn-hangzhou.aliyuncs.com/qingtongqingc/node-app:latest

先登录阿里云Docker Registry

bash 复制代码
docker login --username=aliyun***** registry.cn-hangzhou.aliyuncs.com

然后将新命名的镜像推送至仓库

bash 复制代码
docker push registry.cn-hangzhou.aliyuncs.com/qingtongqingc/node-app:latest

我们可以在仓库中找到刚被推送上去的镜像

5、创建kubernetes部署

现在我们创建一个 Kubernetes 部署,将 ConfigMap 和 Secret 注入到 Pod 中。

yaml 复制代码
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: node-app
  template:
    metadata:
      labels:
        app: node-app
    spec:
      containers:
      - name: node-app
        image: registry.cn-hangzhou.aliyuncs.com/qingtongqingc/node-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: LOG_LEVEL
        - name: PORT
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: PORT
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: DB_USERNAME
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: DB_PASSWORD

使用以下命令部署这个应用:

bash 复制代码
kubectl apply -f deployment.yaml

6、创建服务暴露应用

yaml 复制代码
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: node-app-service
spec:
  selector:
    app: node-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 3000
  type: LoadBalancer
 #因为我们昨天的80端口已经分给nginx服务,这里使用8080端口

使用以下命令部署这个应用:

bash 复制代码
kubectl apply -f service.yaml

验证

1、检查pods和服务状态

bash 复制代码
kubectl get pods
kubectl get services

2、访问应用

尝试从外部访问node.js程序,使用集群节点的 IP 地址和 NodePort 端口:

访问成功

通过以上步骤,你创建了一个 Kubernetes 部署,使用 ConfigMap 管理应用程序配置,使用 Secret 管理数据库凭证。你还将这些配置和凭证注入到应用程序中,并通过服务将应用暴露出来。这种方法可以有效地分离配置和代码,提升安全性和灵活性。

相关推荐
赴前尘15 小时前
k8s 部署 redis
k8s
zyplanke2 天前
Kubernetes(四):Service
云原生·容器·kubernetes·k8s
Nazi62 天前
sealos部署k8s
运维·kubernetes·k8s
伟大的大威4 天前
K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案
k8s·cpu
听说唐僧不吃肉6 天前
DevOps篇之通过GitLab CI 流水线实现k8s集群中helm应用发布
k8s·devops
java资料站9 天前
k8s集群1.20.9
k8s·kubelet
退役小学生呀13 天前
十九、云原生分布式存储 CubeFS
分布式·docker·云原生·容器·kubernetes·k8s
久绊A13 天前
Minikube win安装步骤
k8s
照物华16 天前
深入理解Kubernetes核心:标签与标签选择器实战解析
云原生·容器·kubernetes·k8s
裸奔的大金毛16 天前
K8S - NetworkPolicy的使用
容器·kubernetes·k8s