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 管理数据库凭证。你还将这些配置和凭证注入到应用程序中,并通过服务将应用暴露出来。这种方法可以有效地分离配置和代码,提升安全性和灵活性。

相关推荐
ShirleyWang0125 天前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
spider_xcxc5 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
ShirleyWang0125 天前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s
ShirleyWang0125 天前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
XUHUOJUN9 天前
AKS 不是安装在 Windows Server 上,而是运行在 Windows Server 之上的 Azure 平台能力
windows·架构·k8s·azure local·azure stack
Geek-Chow9 天前
Connecting kubectl to a Private EKS Cluster Over an Internal Domain
kubernetes·k8s·aws
spider_xcxc11 天前
Docker Compose 容器通信详解:同一个 Compose 文件才能互通吗?
docker·容器·k8s·容器化·容器网络
欢醉16 天前
k8s调用服务异常cannot allocate memory
kubernetes·k8s
万里侯19 天前
GitOps 漂移检测:集群里改了配置,Git 还以为一切正常
微服务·容器·k8s
spider_xcxc20 天前
云上网络基石(阿里云):深入解读阿里云VPC及其应用生态
网络·阿里云·云计算·k8s·运维开发·虚拟化