k8s上使用ConfigMap 和 Secret

news2024/11/22 11:02:09

使用ConfigMap 和 Secret

实验目标:
学习如何使用 ConfigMap 和 Secret 来管理应用的配置。

实验步骤:

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

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

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

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

示例场景

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

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

步骤

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

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

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

kubectl apply -f app-config.yaml

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

# 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 来生成自己的账号密码

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

kubectl apply -f db-secret.yaml

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

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

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

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

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

// 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 或私有仓库)。

先构建镜像

docker build -t <your-docker-repo>/node-app:latest .

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

我这里可以正常访问ok
在这里插入图片描述
接着继续构建镜像
在这里插入图片描述
推送镜像到hub仓库

docker push <your-docker-repo>/node-app:latest

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

在这里插入图片描述

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

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

docker tag qingtongqingc/node-app:latest registry.cn-hangzhou.aliyuncs.com/qingtongqingc/node-app:latest

先登录阿里云Docker Registry

docker login --username=aliyun***** registry.cn-hangzhou.aliyuncs.com

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

docker push registry.cn-hangzhou.aliyuncs.com/qingtongqingc/node-app:latest

我们可以在仓库中找到刚被推送上去的镜像
在这里插入图片描述

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

# 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

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

kubectl apply -f deployment.yaml

6、创建服务暴露应用

# 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端口

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

kubectl apply -f service.yaml

验证

1、检查pods和服务状态

kubectl get pods
kubectl get services

在这里插入图片描述

2、访问应用
尝试从外部访问node.js程序,使用集群节点的 IP 地址和 NodePort 端口:
在这里插入图片描述
访问成功

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

youlai-boot项目的学习—工程构建与运行

开发环境 系统:mac OS Ventura 13.2.1 终端: item2 Homebrew: 4.3.5 IDE: IntelliJ IDEA 2024.1.1 (Ultimate Edition) 代码分支 仓库&#xff1a;https://gitee.com/youlaiorg/youlai-boot.git 分支&#xff1a; master commit: 9a753a2e94985ed4cbbf214156ca035082e02723 …

【工作】计算机行业相关的十六类工作简介

本文简单介绍了计算机行业相关的工作类别&#xff0c;共16种&#xff0c;包括常见招聘要求与平均工资。平均工资信息来源&#xff1a;米国企业点评职场社区glassdoor&#xff08;https://www.glassdoor.com/index.htm&#xff09; &#xff08;一&#xff09;软件工程师 软件…

FreeRtos-13资源管理

一、临界资源是什么 要独占式地访问临界资源,有3种方法: 1.公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。 谁要跟我抢,我就灭掉谁: 2.中断要跟我抢?我屏蔽中断 3.其他任务要跟我抢?我禁止调度器,不运行任务切换 二、暂停调度器…

STM32高级控制定时器(STM32F103):计数模式

目录 概述 1 计数模式介绍 2 加计数模式 2.1 加计数模式介绍 2.2 计数序列案例 3 减计数模式 3.1 减计数模式介绍 3.2 应用实例 4 居中对齐模式&#xff08;向上/向下计数&#xff09; 4.1 功能介绍 4.2 应用实例 概述 本文主要介绍STM32F10X定时器计数功能的相关知…

【iOS】自定义cell及其复用机制

文章目录 cell的复用注册非注册两者的区别 自定义cell cell的复用 当用户滚动 UITableView 或 UICollectionView 时,只有少量可见的 cell 会被实际创建和显示。对于那些暂时不可见的 cell,系统会将它们缓存起来以备将来复用。这就是所谓的 cell 复用机制。 为什么需要cell的复…

深度神经网络——深度学习中的 RNN 和 LSTM 是什么?

引言 自然语言处理和人工智能聊天机器人领域许多最令人印象深刻的进步都是由 递归神经网络&#xff08;RNN&#xff09; 和长短期记忆&#xff08;LSTM&#xff09;网络。 RNN 和 LSTM 是特殊的神经网络架构&#xff0c;能够处理顺序数据&#xff0c;即按时间顺序排列的数据。…

插入排序-C语言版本

前言 插入排序是很重要的排序&#xff0c;著名的希尔排序就是从插入排序演变过来的&#xff0c;所以我们需要并且很多时候有些面试也是会面试插入排序的&#xff0c;所以需要好好捋清楚插入排序的逻辑是什么 插入排序gif 插入排序单趟实现 1&#xff0c;插入排序我们需要假设最…

【高端精品】最新手机版微信小程序(拼多多+京东)全自动操作项目

现代互联网经济的发展带来了新型的盈利方式&#xff0c;通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;为商家带来增的流量&#xff0c;同时为使用者带来利润。这种盈利方式无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被系统自动收集。…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

记录一个flink跑kafka connector遇到的问题

【报错】 D:\Java\jdk1.8.0_231\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar56647:D:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\bin" -Dfile.encodingUTF-8 -classpath D:\Java\jdk1.8.0_231\jre\lib\cha…

ubuntu搭建java开发环境IDEA版

一.安装 OpenJDK 更新包列表&#xff1a; sudo apt update安装 OpenJDK&#xff1a; 你可以选择安装不同版本的 OpenJDK&#xff0c;例如 11 或 17&#xff0c;这个是安装 OpenJDK 11 的命令&#xff1a; sudo apt install openjdk-11-jdk验证安装&#xff1a; 安装完成后…

C++ 59 之 纯虚函数和抽象类

#include <iostream> #include <string> using namespace std;class Cal { // 类中有纯虚函数&#xff0c;这个类也叫做抽象类&#xff0c;无法实现实例化 public:int m_a;int m_b;// 虚函数// virtual int getRes(){// return 0;// }// 纯虚函数 作用和虚函数…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

【Unity】如何做一个很平滑的行人动画,且可以根据行人速度动态调整动画速度?

首先我们定一下不同速度对应的行人动作状态&#xff0c;设计为四种状态&#xff1a; 静止站立Stand&#xff1a;0~maxStandSpeed走路Walk&#xff1a;minWalkSpeed~maxWalkSpeed慢跑Jog&#xff1a;minJogSpeed~maxJogSpeed快跑Run&#xff1a;大于MinRunSpeed 我们可以使用A…

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…

用户态协议栈02-arp reply实现

在上一节DODK的UDP收发中发送udp包的时候&#xff0c;需要向物理机的arp表中添加一个静态的arp记录。这在生产环境中显然是不可以的。在内核的协议栈中&#xff0c;会将自己的ip和mac在局域网中进行广播&#xff0c;并且记录其他电脑的ip和mac。在需要发送数据包的时候&#xf…

6月15号作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0…

18. 《C语言》——【Nice2016年校招笔试题引发的思考】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

证明 泊松分布 的期望和方差

泊松分布 泊松分布&#xff08;Poisson Distribution&#xff09;是描述在固定时间间隔内某事件发生次数的概率分布&#xff0c;特别适用于稀有事件的统计。假设随机变量 ( X ) 表示在时间间隔 ( t ) 内某事件发生的次数&#xff0c;并且该事件在单位时间内发生的平均次数为 (…

牛客练习题打卡(06-15)

run方法线程执行体 .start方法开启多线程 在java中 &#xff0c; 整数类型默认int,带小数默认double ; 如果要指定长整型加L&#xff1b;如果要指定为单精度加F ; 在java中&#xff0c;重载要求方法名相同&#xff0c; 参数列表必须不同&#xff08;个数不同、或类型不同、参数…