一、储存机密信息

  Secret 是 Kubernetes 内的一种资源类型,可以用它来存放一些机密信息(密码,token,密钥等)。信息被存入后,我们可以使用挂载卷的方式挂载进我们的 Pod 内。当然也可以存放docker私有镜像库的登录名和密码,用于拉取私有镜像。

一)Opaque 类型

  Opaque 类型一般拿来存放密码,密钥等信息,存储格式为 base64。我们可以通过命令行和配置文件两种方式来创建Secret资源。

1)命令行方式

kubectl create secret generic mysql-account --from-literal=username=zaking--from-literal=password=123456
kubectl get secret
//编辑值
kubectl edit secret account
//输出yaml格式
kubectl get secret account -o yaml
//输出json格式
kubectl get secret account -o json
//对Base64进行解码
echo MTIzNDU2 | base64 -d

2)配置文件创建

  创建一个mysql-account.yml文件:

apiVersion: v1
kind: Secret
metadata:
name: mysql-account
stringData:
username: root
password: root
type: Opaque

  然后:

kubectl apply -f mysql-account.yaml
secret/mysql-account created
kubectl get secret mysql-account -o yaml

二)私有镜像库认证

1)命令行创建

kubectl create secret docker-registry private-registry \
--docker-username=[用户名] \
--docker-password=[密码] \
--docker-email=[邮箱] \
--docker-server=[私有镜像库地址]
//查看私有库密钥组
kubectl get secret private-registry -o yaml
echo [value] | base64 -d

2)配置文件创建

vi private-registry-file.yaml
apiVersion: v1
kind: Secret
metadata:
name: private-registry-file
data:
.dockerconfigjson: eyJhdXRocyI6eyJodHRwczo
type: kubernetes.io/dockerconfigjson
kubectl apply -f ./private-registry-file.yaml
kubectl get secret private-registry-file -o yaml

三)使用

1)Volume 挂载

  通过存储卷的方式挂载进去,添加文件并书写内容如下:

apiVersion: apps/v1  #API 配置版本
kind: Deployment #资源类型
metadata:
name: user-v1 #资源名称
spec:
minReadySeconds: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: user-v1 #告诉deployment根据规则匹配相应的Pod进行控制和管理,matchLabels字段匹配Pod的label值
+ replicas: 1 #声明一个 Pod,副本的数量
template:
metadata:
labels:
app: user-v1 #Pod的名称
spec: #组内创建的 Pod 信息
+ volumes:
+ - name: mysql-account
+ secret:
+ secretName: mysql-account
containers:
- name: nginx #容器的名称
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3 #使用哪个镜像
+ volumeMounts:
+ - name: mysql-account
+ mountPath: /mysql-account
+ readOnly: true
ports:
- containerPort: 80 #容器内映射的端口

  执行命令:

kubectl describe pods  user-v1-b88799944-tjgrs
kubectl exec -it user-v1-b88799944-tjgrs -- ls /root 

2)环境变量注入

  修改之前的deployment-user-v1.yaml文件:

apiVersion: apps/v1  #API 配置版本
kind: Deployment #资源类型
metadata:
name: user-v1 #资源名称
spec:
minReadySeconds: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: user-v1 #告诉deployment根据规则匹配相应的Pod进行控制和管理,matchLabels字段匹配Pod的label值
replicas: 1 #声明一个 Pod,副本的数量
template:
metadata:
labels:
app: user-v1 #Pod的名称
spec: #组内创建的 Pod 信息
volumes:
- name: mysql-account
secret:
secretName: mysql-account
containers:
- name: nginx #容器的名称
+ env:
+ - name: USERNAME
+ valueFrom:
+ secretKeyRef:
+ name: mysql-account
+ key: username
+ - name: PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: mysql-account
+ key: password
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3 #使用哪个镜像
volumeMounts:
- name: mysql-account
mountPath: /mysql-account
readOnly: true
ports:
- containerPort: 80 #容器内映射的端口

  然后:

kubectl apply -f deployment-user-v1.yaml
kubectl get pods
kubectl describe pod user-v1-5f48f78d86-hjkcl
kubectl exec -it user-v1-688486759f-9snpx -- env | grep USERNAME

3)Docker 私有库认证

  这种方法只能用来配置私有镜像库认证。添加文件,vi v4.yaml:

image: [仅有镜像库地址]/[镜像名称]:[镜像标签]

  

kubectl apply -f v4.yaml
kubectl get pods
kubectl describe pods [POD_NAME]
+imagePullSecrets:
+ - name: private-registry-file
containers:
- name: nginx
kubectl apply -f v4.yaml

二、服务发现

  服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。

  Pod 的 IP 常常是漂移且不固定的,所以我们要使用 Service 这个神器来将它的访问入口固定住。可以利用 DNS 的机制给每个 Service 加一个内部的域名,指向其真实的IP。在Kubernetes中,对 Service 的服务发现,是通过一种叫做 CoreDNS 的组件去实现的。

  coreDNS 是使用 Go 语言实现的一个DNS服务器

  • -n 按命名空间过滤
  • -l 按标签过滤
  • -o wide 输出额外信息。对于Pod,将输出Pod所在的Node名
kubectl -n kube-system get all  -l k8s-app=kube-dns -o wide

  kubectl exec 的作用是可以直接在容器内执行Shell脚本

  • 命令格式:kubectl exec -it [PodName] -- [Command]
  • -i:即使没有连接,也要保持标准输入保持打开状态。一般与 -t 连用。
  • -t:分配一个伪TTY(终端设备终端窗口),一般与 -i 连用。可以分配给我们一个Shell终端
kubectl get pods
kubectl get svc
kubectl exec -it user-v1-688486759f-9snpx -- /bin/sh
curl http://service-user-v2

  kubernetes namespace(命名空间)是 kubernetes 里比较重要的一个概念。在启动集群后,kubernetes 会分配一个默认命名空间,叫default。不同的命名空间可以实现资源隔离,服务隔离,甚至权限隔离。因为我们在之前创建的服务,都没有指定 namespace ,所以我们的服务都是在同一个 namespace default下。在同 namespace 下的规则,我们只需要直接访问 http://ServiceName:Port 就可以访问到相应的 Service。不同 namespace 下的规则是 [ServiceName].[NameSpace].svc.cluster.local。ServiceName 就是我们创建的 Service 名称,NameSpace 则是命名空间。如果你没有命名空间,则这个值为 default。

curl http://service-user-v2.default.svc.cluster.local

  

三、统一管理服务环境变量

  Kubernetes Secret 的主要作用是来存放密码,密钥等机密信息。对于环境变量的配置:例如你的数据库地址,负载均衡要转发的服务地址等信息。这部分内容使用 Secret 显然不合适,打包在镜像内耦合又太严重。这里,我们可以借助 Kubernetes ConfigMap 来配置这项事情。ConfigMap 是 Kubernetes 的一种资源类型,我们可以使用它存放一些环境变量和配置文件。信息存入后,我们可以使用挂载卷的方式挂载进我们的 Pod 内,也可以通过环境变量注入。和 Secret 类型最大的不同是,存在 ConfigMap 内的内容不会加密。

一)创建

  创建的方式有很多种,我们下面来一一试一下:

1、命令行创建

kubectl create configmap [config_name] --from-literal=[key]=[value]
kubectl create configmap mysql-config --from-literal=MYSQL_HOST=192.168.1.172 --from-literal=MYSQL_PORT=3306

  需要注意,configmap 的名称必须是全小写,特殊符号只能包含 '-' 和 '.'。可以用下面的这个正则表达式校验下看看符不符合规则:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')。

kubectl get cm
kubectl describe cm mysql-config

2、配置清单创建

  创建一个mysql-config-file.yaml文件:

apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config-file
data:
MYSQL_HOST: "192.168.1.172"
MYSQL_PORT: "3306"
  • kind 的值为 ConfigMap,代表声明一个 ConfigMap 类型的资源
  • metadata.name 代表是该 configmap 的名称
  • data 是存放数据的地方,数据格式为 key:value
kubectl apply -f ./mysql-config-file.yaml
kubectl describe cm mysql-config-file

3、文件创建

kubectl create configmap [configname] --from-file=[key]=[file_path]
  • --from-file代表一个文件
  • key是文件在 configmap 内的 key
  • file_path 是文件的路径

  添加env.config文件:

HOST: 192.168.0.1
PORT: 8080
kubectl create configmap env-from-file --from-file=env=./env.config
configmap/env-from-file created
kubectl get cm env-from-file -o yaml

4、目录创建

  也可以直接将一个目录下的文件整个存入进去。

kubectl create configmap [configname] --from-file=[dir_path]

mkdir env && cd ./env
echo 'local' > env.local
echo 'test' > env.test
echo 'prod' > env.prod kubectl create configmap env-from-dir --from-file=./ kubectl get cm env-from-dir -o yaml

二)使用方式

1、环境变量注入

  

containers:
- name: nginx #容器的名称
+ env:
+ - name: MYSQL_HOST
+ valueFrom:
+ configMapKeyRef:
+ name: mysql-config
+ key: MYSQL_HOST
kubectl apply -f ./v1.yaml
//kubectl exec -it [POD_NAME] -- env | grep MYSQL_HOST
kubectl exec -it user-v1-744f48d6bd-9klqr -- env | grep MYSQL_HOST
kubectl exec -it user-v1-744f48d6bd-9klqr -- env | grep MYSQL_PORT
      containers:
- name: nginx #容器的名称
env:
+ envFrom:
+ - configMapRef:
+ name: mysql-config
+ optional: true
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3 #使用哪个镜像
volumeMounts:
- name: mysql-account
mountPath: /mysql-account
readOnly: true
ports:
- containerPort: 80 #容器内映射的端口

2、存储卷挂载

  存储卷挂载会将 configmap 里内容中的每个 key 和 value,以独立文件方式以外部挂载卷方式挂载进去( key 是文件名,value 是文件内容)。

  • 在 Pod 层面声明一个外部存储卷

    • name 为存储卷名称
    • configMap 代表存储卷的文件来源
    • configMap.name 要填入要加载的 configMap 名称
  • 在容器镜像层面配置存储卷
    • name 的值来源于第一步配置的 name 值
    • mountPath 为要挂载的目录
    • readonly 则代表文件是不是只读
  template:
metadata:
labels:
app: user-v1 #Pod的名称
spec: #组内创建的 Pod 信息
volumes:
- name: mysql-account
secret:
secretName: mysql-account
+ - name: envfiles
+ configMap:
+ name: env-from-dir
containers:
- name: nginx #容器的名称
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: mysql-account
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: mysql-account
key: password
envFrom:
- configMapRef:
name: mysql-config
optional: true
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3 #使用哪个镜像
volumeMounts:
- name: mysql-account
mountPath: /mysql-account
readOnly: true
+ - name: envfiles
+ mountPath: /envfiles
+ readOnly: true
ports:
- containerPort: 80 #容器内映射的端口
kubectl apply -f deployment-user-v1.yaml
kubectl get pods
kubectl describe pod user-v1-79b8768f54-r56kd
kubectl exec -it user-v1-744f48d6bd-9klqr -- ls /envfiles

  可以借助 volumes.configMap.items[] 字段来配置多个 item 项。

 spec:   #组内创建的 Pod 信息
volumes:
- name: mysql-account
secret:
secretName: mysql-account
- name: envfiles
configMap:
name: env-from-dir
+ items:
+ - key: env.local
+ path: env.local

四、污点与容忍

  • 在 Kubernetes 中, Pod 被部署到 Node 上面去的规则和逻辑是由 Kubernetes 的调度组件根据 Node 的剩余资源,地位,以及其他规则自动选择调度的
  • 但前端和后端往往服务器资源的分配都是不均衡的,甚至有的服务只能让特定的服务器来跑
  • 在这种情况下,我们选择自动调度是不均衡的,就需要人工去干预匹配选择规则了
  • 这时候,就需要在给 Node 添加一个叫做污点的东西,以确保 Node 不被 Pod 调度到
  • 当你给 Node 设置一个污点后,除非给 Pod 设置一个相对应的容忍度,否则 Pod 才能被调度上去。这也就是污点和容忍的来源
  • 污点的格式是 key=value,可以自定义自己的内容,就像是一组 Tag 一样
  • Node_Name 为要添加污点的 node 名称
  • key 和 value 为一组键值对,代表一组标示标签
  • NoSchedule 则为不被调度的意思,和它同级别的还有其他的值:PreferNoSchedule 和 NoExecute
kubectl taint nodes [Node_Name] [key]=[value]:NoSchedule
//添加污点
kubectl taint nodes node1 user-v4=true:NoSchedule
//查看污点
kubectl describe node node1
kubectl describe node master
Taints: node-role.kubernetes.io/master:NoSchedule
vi deployment-user-v4.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-v4
spec:
minReadySeconds: 1
selector:
matchLabels:
app: user-v4
replicas: 1
template:
metadata:
labels:
app: user-v4
spec:
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3
ports:
- containerPort: 80
kubectl apply -f deployment-user-v4.yaml
  • 给 Pod 设置容忍度

    • 想让 Pod 被调度过去,需要在 Pod 一侧添加相同的容忍度才能被调度到
    • 给 Pod 设置一组容忍度,以匹配对应的 Node 的污点
    • key 和 value 是你配置 Node 污点的 key 和 value
    • effect 是 Node 污点的调度效果,和 Node 的设置项也是匹配的
    • operator 是运算符,equal 代表只有 key 和 value 相等才算数。当然也可以配置 exists ,代表只要 key 存在就匹配,不需要校验 value 的值
vi deployment-user-v4.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-v4
spec:
minReadySeconds: 1
selector:
matchLabels:
app: user-v4
replicas: 1
template:
metadata:
labels:
app: user-v4
spec:
+ tolerations:
+ - key: "user-v4"
+ operator: "Equal"
+ value: "true"
+ effect: "NoSchedule"
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3
ports:
- containerPort: 80
# 修改Node污点
kubectl taint nodes node1 user-v4=1:NoSchedule --overwrite
# 删除Node污点
kubectl taint nodes node1 user-v4-
# 在Master上部署pod
kubectl taint nodes node1 user-v4=true:NoSchedule
kubectl describe node node1
kubectl describe node master
vi deployment-user-v4.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-v4
spec:
minReadySeconds: 1
selector:
matchLabels:
app: user-v4
replicas: 1
template:
metadata:
labels:
app: user-v4
spec:
+ tolerations:
+ - key: "node-role.kubernetes.io/master"
+ operator: "Exists"
+ effect: "NoSchedule"
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v3
ports:
- containerPort: 80
 kubectl apply -f deployment-user-v4.yaml

《前端运维》五、k8s--4机密信息存储与统一管理服务环境变量的更多相关文章

  1. 《前端运维》五、k8s--3灰度发布、滚动更新与探针

    一.灰度发布 灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高.原因是金丝雀对瓦斯气体很敏感.灰度发布的做法是:会在现存旧应用的基 ...

  2. 《前端运维》五、k8s--1安装与基本配置

    一.k8s基础概念与安装 k8s,即kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统.详细的描述就不多说了,官网有更详细的内容.简单来说,k8s,是一个可以操作多台机器调度部署镜 ...

  3. Linux运维五:定时任务crond服务

    一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...

  4. Liunx运维(五)-信息显示与搜索文件命令

    文档目录: 一.uname:显示系统信息 二.hostname:显示或设置系统的主机名 三.dmesg:系统启动异常诊断 四.stat:显示文件或文件系统状态 五.du:统计磁盘空间使用情况 六.da ...

  5. 《前端运维》一、Linux基础--04Shell变量

    这一篇文章,我们就要开始学习正式的Shell语言部分的内容.那在开始之前,我们回忆一下,javascript语言,大体都包含了哪些内容?比如数据类型(对象.字符串.数值),数据结构(对象.数组).运算 ...

  6. 《前端运维》一、Linux基础--05Shell运算符

    今天我们来学习下Shell运算符,Shell跟其他的编程语言一样,也支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 那下面,我们就一一来学习一下这些运算符. ...

  7. 《前端运维》三、Docker--2其他

    一.制作DockerFile docker的镜像类似于用一层一层的文件组成.inspect命令可以查看镜像或容器的的信息,其中Layers就是镜像的层文件,只读不能修改,基于镜像创建的容器会共享这些层 ...

  8. 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

    一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...

  9. 《前端运维》二、Nginx--1基本概念及安装

    一.Nginx基本概念 简单来说,Nginx就是一个代理服务器,什么是代理服务器呢?也就是当我们访问服务器的时候,请求不会直接请求到服务器,中间会有个代理,代理会预先于服务器处理这些请求,最后由代理决 ...

  10. python自动化运维五:pexpect

    p { margin-bottom: 0.25cm; line-height: 120% } a:link { } pexpect是expect的封装,可以实现ssh,ftp,passwd,telne ...

随机推荐

  1. docker 安装启动jenkins 以及问题剖析

    docker 安装启动jenkins 以及问题剖析   首先,你环境必须要有docker,我这里是自己本地虚拟机Vmware,我的虚拟机时linux centos7的 .如果你不知怎么安装虚拟机和命令 ...

  2. JSON——简介

    JSON--简介    JSON--基础语法    JSON--json数据与java对象的转换       // 将java对象转为json字符串 User user = new User(1,&q ...

  3. 如何用VMWARE创建一个Linux虚拟机

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们都是需要接触Linux服务器的,一般部署应用都是部署在Linux服务器上的~ 但一般的服务器要么需要购买,要么只是公司里的,那么有没有免费的L ...

  4. 【赵渝强老师】Oracle存储过程中的out参数

    一.什么是存储过程 Oracle存储过程可以说是一个记录集吧,它是由一些PL/SQL语句组成的代码块,这些PL/SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取 ...

  5. C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  6. 2023年6月墨天轮中国图数据库排行榜:TGS 开新局,创邻和字节多点突破露锋芒

    鸿鹄不坠青云志,鲲鹏展翅九万里. 2023年 墨天轮中国图数据库流行度排行 已经火热出炉,本月中国图数据库排行榜共有31个数据库参与排名,相比今年1月新增3个数据库.本月图数据库榜单前十变动较大:Tu ...

  7. Android复习(二)应用资源——>可绘制对象资源

    可绘制对象资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 getDrawable(int) 等 API 检索,或应用到拥有 android:drawable 和 android:icon  ...

  8. redis的主从复制master/slaver

    什么是Redis的复制 ​ 就是我们常说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 复制原理 Slave启动成 ...

  9. Windows10关闭系统自动更新--专业版

    当你正在跑项目,cpu负荷,内存负荷,这时候Windows服务模块没有人情味滴突然来个更新撑爆你的磁盘读写,那感觉简直炸锅 像这样: 什么?加个固态就好了 你要是上了固态,就不应该看到这篇文章,相见即 ...

  10. CSS动画(动态导航栏)

    1.项目简介 一个具有创意的导航菜单不仅能为你的大作业增色,还能展示你的技术实力.本文将分享一系列常用于期末大作业的CSS动画导航效果,这些效果不仅外观酷炫,而且易于实现.我们提供了一键复制的代码,让 ...