首页 > 其他分享 >12、应用配置--特殊卷ConfigMap和Secret

12、应用配置--特殊卷ConfigMap和Secret

时间:2023-03-11 18:32:48浏览次数:49  
标签:ConfigMap 12 name -- nginx secret K8s root

应用配置

特殊卷(ConfigMap和Secret)
ConfigMap
Secret
都是用来实现去为我们的容器化运行的应用提供配置接口

配置接口:基于docker运行应用,对于日常工作来说,有些不便
如:基于nginx的image,运行nginx容器,修改nginx配置文件
配置文件如何修改:进入交互式接口,编辑配置文件,重载配置文件

如果nginx实例运行多个,都需要修改配置文件,常用方式有两个
1、重新打镜像,改好配置文件焙进镜像中。
2、共享存储制成的卷:把对应的配置文件放在卷上,让卷在容器启动时关联到容器的文件系统当中,从而通过卷加载配置文件,中心化配置,放在外置的存储服务上,让每个实例基于同一个镜像启动的时候,通过卷加载配置信息。如果有多环境,只需要多做几个卷,只要是同一个环境下的pod,就加载同一个配置下的文件,但k8s对外部存储存在强依赖,如微服务状态下对应的卷有很多,比较麻烦。

k8s为了解决对外部存储的强依赖问题,可以把etcd的存储能力中的一部分抽象出来,作为卷接口可被pod关联使用,此卷不依赖任何第三方的外部存储服务,仅仅是用到了API-server抽象出来的etcd提供的存储能力,就能把配置信息提供出来,让pod能基于卷接口的形式加载配置信息,这就是ConfigMap特殊卷的作用,也解决了容器化运行应用时遇到的问题。如上述1-2问题

配置应用两种方式:
配置容器应用的化接口除了提供配置文件之外,也可以使用环境变量来配置
环境变量:云原生应用(轻量级的微服务应用)
配置文件:传统应用(java开发的大单体)
ConfigMap和Secret基本概念
ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷
◼ ConfigMap用于为容器中的应用提供配置数据以定制程序的行为,而敏感的配置信息,例如密钥、证书等则通常由Secret来配置
◼ ConfigMap和Secret将相应的配置信息保存于资源对象中,而后在Pod对象上支持以存储卷的形式将其挂载并加载相关的配置,从而降低了配置与镜像文件的耦合关系,提高了镜像复用能力
◼ Kubernetes借助于ConfigMap对象实现了将配置文件从容器镜像中解耦,从而增强了工作负载的可移植性,使其配置更易于更改和管理,并避免了将配置数据硬编码到Pod配置清单中
此二者都属于名称空间级别,只能被同一名称空间中的Pod引用

基本概念总结:
ConfigMap和Secret
卷插件:configMap和secret
资源类型:一等公民
名称空间级别的资源,只能用于配置同一名称空间中的Pod中的容器化应用
如何定义ConfigMap和Secret
ConfigMap和Secret资源都是数据承载类的组件,并不需要Controller支持。是Kubernetes API的标准资源类型,是一等公民
◼ 主要负责提供key-value格式的数据项,其值支持
◆单行字符串:常用于保存环境变量值,或者命令行参数等
◆多行字串:常用于保存配置文件的内容
如:
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-confs
data:
PORT: "8080" #单行字串:key:value,保存简单的配置信息
myserver-status.cfg: | #多行字串 |前面为key
location /nginx-status {#基于key,缩进范围内的内容,对应的是多行字串的配置信息,保存复杂的配置文件内容
stub_status on;
access_log off;
}
因为没有复杂的Controller支持,并没有对应的spec字段,而是直接使用data字段嵌入一个又一个的键值来定义
具体定义如下:

◼ 资源规范中不使用spec字段,而是直接使用特定的字段嵌套定义key-value数据
◆ConfigMap支持使用data或binaryData字段嵌套一至多个键值数据项
◆Secret支持使用data或stringData(非base64编码的明文格式)字段嵌套一至多个键值数据项
◼ 从Kubernetes v1.19版本开始,ConfigMap和Secret支持使用immutable字段创建不可变实例

ConfigMap

创建ConfigMap对象
创建ConfigMap对象的方法有两种
◼ 命令式命令
◆ 字面量:kubectl create configmap NAME --from-literal=key1=value1
◆ 从文件加载:kubectl create configmap NAME --from-file=[key=]/PATH/TO/FILE
◆ 从目录加载: kubectl create configmap NAME --from-file=/PATH/TO/DIR/
◼ 配置文件
◆命令式:kubectl create -f
◆声明式:kubectl apply -f

提示:基于文件内容生成时,可以使用命令式命令以dry-run模式生成并保存

coredns配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system #kube-system名称空间下,由kubeadm部署k8s的时候,自动为coredns声明配置
data:
Corefile: | #coredns是怎么作为dns为服务器提供服务的
.:53 { #监听在53号端口上
errors
health {
lameduck 5s #如火热做健康状态监测
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa { #为哪个域做反向、正向名称解析
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153 #如何完成自己不理解的名称转发
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
查看ConfigMap定义
[root@K8s-master01 manifeste]#kubectl get cm -n kube-system (ConfigMap可简写成cm)
NAME DATA AGE
coredns 1 6d9h
extension-apiserver-authentication 6 6d9h
kube-proxy 2 6d9h
kube-root-ca.crt 1 6d9h
kubeadm-config 1 6d9h
kubelet-config 1 6d9h

输出详细的cm格式打印现存的cm定义
如:
[root@K8s-master01 manifeste]#kubectl get cm kube-proxy -n kube-system -o yaml
可发现有两个键值,每个键值队形的都是多行字串
其中config.conf有个非常重要的字段mode,他决定了kube-proxy在服务于service时,是工作于ipvs模式,还是iptables模式。
示例一:定义ConfigMap的办法:命令行加载配置:通过ConfigMap的形式为demoapp的应用提供监听端口、host
[root@K8s-master01 manifeste]#kubectl create configmap demoapp-cfg --from-literal=port="8080" --from-literal=host="127.0.0.1"
configmap/demoapp-cfg created
[root@K8s-master01 manifeste]#kubectl get cm
NAME DATA AGE
demoapp-cfg 2 52s
查看资源规范格式
[root@K8s-master01 manifeste]#kubectl get cm demoapp-cfg -o yaml
apiVersion: v1 #核心资源群组
data: #数据
host: 127.0.0.1 #对应的键值,单行字串
port: "8080" #对应的键值,单行字串
kind: ConfigMap
metadata: #对象元数据名称
creationTimestamp: "2022-11-13T12:32:57Z"
name: demoapp-cfg #名称空间
namespace: default
resourceVersion: "485465"
uid: 5c0be4b8-e43c-4065-8083-c6be29892e08
示例二:定义ConfigMap的办法:文件中加载配置
[root@K8s-master01 chapter6]#ls nginx-conf.d/
myserver.conf myserver-gzip.cfg myserver-status.cfg
[root@K8s-master01 chapter6]#cat nginx-conf.d/*
server { #server的定义
listen 8080;
server_name www.ik8s.io;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}
gzip on; #gzip的定义,指定为哪些资源类型做压缩
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
location /nginx-status { #打开内建的stats页面的定义
stub_status on;
access_log off;
}

用上面的文件进行加载(=后面为键名,键名可定义,如:--from-file=gzip.cfg=myserver-gzip.cfg)
[root@K8s-master01 nginx-conf.d]#kubectl create cm nginx-cfg --from-file=myserver.conf --from-file=gzip.cfg=myserver-gzip.cfg
configmap/nginx-cfg created
查看cm
[root@K8s-master01 nginx-conf.d]#kubectl get cm nginx-cfg -o yaml
apiVersion: v1
data: #多行字串
gzip.cfg: | #可看到键名被修改
gzip on;
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
myserver.conf: |
server {
listen 8080;
server_name www.ik8s.io;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-13T13:16:06Z"
name: nginx-cfg
namespace: default
resourceVersion: "490956"
uid: b3e900f0-a594-458c-826a-ed5e79ab171b
生成cm框架
[root@K8s-master01 nginx-conf.d]#kubectl create cm nginx-cfg --from-file=myserver.conf --from-file=gzip.cfg=myserver-gzip.cfg --dry-run=client -o yaml > configmap-nginx-cfg.yaml
查看内容
[root@K8s-master01 nginx-conf.d]#cat configmap-nginx-cfg.yaml
apiVersion: v1
data:
gzip.cfg: |
gzip on;
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
myserver.conf: |
server {
listen 8080;
server_name www.ik8s.io;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}
kind: ConfigMap
metadata:
creationTimestamp: null
name: nginx-cfg
不需要用可以删除
[root@K8s-master01 nginx-conf.d]#kubectl delete configmap nginx-cfg
configmap "nginx-cfg" deleted

如果把这个目录下的所有文件都创建成键,放到同一个ConfigMap中
[root@K8s-master01 chapter6]#kubectl create configmap nginx-cfg --from-file=nginx-conf.d/
configmap/nginx-cfg created
自动把该目录下的所有文件的名创建成对应的键,文件内容作为对应的值来使用

查看
[root@K8s-master01 chapter6]#kubectl get cm nginx-cfg -o yaml
apiVersion: v1
data:
configmap-nginx-cfg.yaml: |
apiVersion: v1
data:
gzip.cfg: |
gzip on;
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
myserver.conf: |
server {
listen 8080;
server_name www.ik8s.io;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}
kind: ConfigMap
metadata:
creationTimestamp: null
name: nginx-cfg
myserver-gzip.cfg: |
gzip on;
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
myserver-status.cfg: |
location /nginx-status {
stub_status on;
access_log off;
}
myserver.conf: |
server {
listen 8080;
server_name www.ik8s.io;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-13T13:29:14Z"
name: nginx-cfg
namespace: default
resourceVersion: "492631"
uid: bde4db23-1f1e-484f-81e1-7bf351158453
从目录加载是不能自定义key的名
如何在pod上引用ConfigMap对象,以便于加载ConfigMap之内的配置数据
ConfigMap资源对象中以key-value保存的数据,在Pod中引用的方式通常有两种
◼ 环境变量
◆引用ConfigMap对象上特定的key,以valueFrom赋值给Pod上指定的环境变量
◆在Pod上使用envFrom一次性导入ConfigMap对象上的所有key-value,key(也可以统一附加特定前缀)即为环境变量名,value自动成为相应的变量值
◼ configMap卷
◆在Pod上将ConfigMap对象引用为存储卷,而后整体由容器mount至某个目录下
⚫ key转为文件名,value即为相应的文件内容
◆在Pod上定义configMap卷时,仅引用其中的部分key,而后由容器mount至目录下
◆在容器上仅mount configMap卷上指定的key
在Pod上配置使用ConfigMap示例

通过环境变量引用

apiVersion: v1
kind: Pod
metadata:
name: configmaps-env-demo
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: demoapp
env:
- name: PORT
valueFrom: #值来自另一个资源
configMapKeyRef: #资源为configMap,使用configMapKeyRef
name: demoapp-config #configMap的名字
key: demoapp.port #指明引用卷的名字,此值被赋予给PORT环境变量
optional: false #表示该键值是否可选。如果不是可选,configMap不存在,键不存在那么pod初始化会失败
- name: HOST
valueFrom:
configMapKeyRef:
name: demoapp-config
key: demoapp.host
optional: true #configMap不存在或者configMap存在,键不存在的时候,不会导致初始化完成不了

通过存储卷引用

apiVersion: v1
kind: Pod
metadata:
name: configmaps-volume-demo
spec:
containers:
- image: nginx:alpine
name: nginx-server
volumeMounts:
- name: ngxconfs
mountPath: /etc/nginx/conf.d/ #挂载路径,意味着此目录下引用的nginx-config-files里面的每一个键就
readOnly: true 成为这个目录下一个文件名,键值就成问文件内容,自动完成对应nginx额外提
volumes: 供配置文件。
- name: ngxconfs #指定卷名
configMap: #引用的configMap资源名
name: nginx-config-files
optional: false #不是可选,必须要有对应的键
环境变量引用与通过存储卷引用的区别
环境变量:由于通过环境变量赋值,pod在初始化的那一刻,从指定的configmap文件中读出来的键值是什么就是什么,改不了,哪怕改了configmap,也对pod没有影响,因为加载是一次性的,在pod初始化的时候一次性的引用对应的值,以后即便configmap改变,我们的pod对此也一无所知
存储卷:而使用卷方式引用的时候,有好处,由于他是被暴露到容器文件系统内部作为一个对应的文件来访问的,所以如果configmap当中的配置信息改变了,他也会被pod所察觉,如果pod中的容器支持自动周期性加载更新配置信息的话,那他就可以实时生效,nginx不支持自动加载变更的配置信息,需要手动加载。各种云原生运用基本都能做到,监视自己的配置文件,配置文件时间戳变了,一定会重新自动加载。如:envoy
实例运用configmap

环境变量引用

[root@K8s-master01 chapter6]#cat configmaps-env-demo.yaml 
#如何在一个配置文件中加载两个资源:如下所示:---顶格写,表示资源分割符
---
apiVersion: v1
kind: ConfigMap #定义ConfigMap
metadata:
name: demoapp-config #ConfigMap名字
namespace: default
data:
demoapp.port: "8080" #指明port
demoapp.host: 0.0.0.0 #监听IP地址为本机所有可用地址
---
apiVersion: v1
kind: Pod
metadata:
name: configmaps-env-demo
namespace: default
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: demoapp
env:
- name: PORT #使用环境变量的方式来引用
valueFrom:
configMapKeyRef: #使用configMapKeyRef
name: demoapp-config
key: demoapp.port
optional: false
- name: HOST
valueFrom:
configMapKeyRef:
name: demoapp-config
key: demoapp.host
optional: true
如果不引用port,默认监听80端口

创建并查看
[root@K8s-master01 chapter6]#kubectl apply -f configmaps-env-demo.yaml
configmap/demoapp-config created
pod/configmaps-env-demo created
[root@K8s-master01 chapter6]#kubectl get pods
NAME READY STATUS RESTARTS AGE
configmaps-env-demo 1/1 Running 0 41m
[root@K8s-master01 chapter6]#kubectl get cm
NAME DATA AGE
demoapp-cfg 2 134m
demoapp-config 2 40m
kube-root-ca.crt 1 6d12h
nginx-cfg 4 78m
交互式进入
[root@K8s-master01 chapter6]#kubectl exec configmaps-env-demo -- netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
删除pod
[root@K8s-master01 chapter6]#kubectl delete -f configmaps-env-demo.yaml
configmap "demoapp-config" deleted
pod "configmaps-env-demo" deleted
kubectl delete pods NAME --force --grace-period=0(强制立即删除pod,生产中不要用)

更改configmaps-env-demo.yaml 文件中的host 为127.0.0.1后再次创建pod,并查看监听地址是否改变
[root@K8s-master01 chapter6]#kubectl exec configmaps-env-demo -- netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
由于通过环境变量赋值,pod在初始化的那一刻,从指定的configmap文件中读出来的键值是什么就是什么,改不了,哪怕改了configmap,也对pod没有影响,因为加载是一次性的,在pod初始化的时候一次性的引用对应的值,以后即便configmap改变,我们的pod对此也一无所知,除非重建pod

基于存储卷引用

[root@K8s-master01 chapter6]#cat configmaps-volume-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
name: configmaps-volume-demo
namespace: default
spec:
containers:
- image: nginx:alpine
name: nginx-server
volumeMounts:
- name: ngxconfs
mountPath: /etc/nginx/conf.d/
readOnly: true
volumes:
- name: ngxconfs
configMap:
name: nginx-config-files
optional: false
第一步:创建configmap
[root@K8s-master01 chapter6]#kubectl create configmap nginx-config-files --from-file=nginx-conf.d/
configmap/nginx-config-files created
查看cm
[root@K8s-master01 chapter6]#kubectl get cm
NAME DATA AGE
demoapp-cfg 2 151m
demoapp-config 2 10m
kube-root-ca.crt 1 6d12h
nginx-cfg 4 95m
nginx-config-files 3 3s #DATA 3 表示3个键
第二步:创建pod并查看
[root@K8s-master01 chapter6]#kubectl get pods
NAME READY STATUS RESTARTS AGE
configmaps-volume-demo 1/1 Running 0 16s

查看nginx加载的配置信息并打印
[root@K8s-master01 chapter6]#kubectl exec configmaps-volume-demo -- nginx -T

[root@K8s-master01 chapter6]#ls nginx-conf.d/
myserver.conf myserver-gzip.cfg myserver-status.cfg
这三个文件被加载到了nginx的配置文件,进入交互式接口可查看其目录
[root@K8s-master01 chapter6]#kubectl exec -it configmaps-volume-demo -- /bin/sh
/ # cd /etc/nginx/conf.d
/etc/nginx/conf.d # ls -al
total 12
drwxrwxrwx 3 root root 4096 Nov 13 15:05 .
drwxr-xr-x 3 root root 4096 Oct 19 18:20 ..
drwxr-xr-x 2 root root 4096 Nov 13 15:05 ..2022_11_13_15_05_32.1764853429
lrwxrwxrwx 1 root root 32 Nov 13 15:05 ..data -> ..2022_11_13_15_05_32.1764853429
lrwxrwxrwx 1 root root 24 Nov 13 15:05 myserver-gzip.cfg -> ..data/myserver-gzip.cfg
lrwxrwxrwx 1 root root 26 Nov 13 15:05 myserver-status.cfg -> ..data/myserver-status.cfg
lrwxrwxrwx 1 root root 20 Nov 13 15:05 myserver.conf -> ..data/myserver.conf

认为更改configmap,配置信息回被注入到nginx的pod中来
如压缩等级改成6级
在线修改configmap(实验化境可行,生产环境需要修改文件重新生成cm)
[root@K8s-master01 chapter6]#kubectl edit cm nginx-config-files
gzip_comp_level 6;
查看配置,会发现压缩等级变成6级了
[root@K8s-master01 chapter6]#kubectl exec configmaps-volume-demo -- nginx -T
进入交互式接口查看,发现时间戳已被修改
[root@K8s-master01 chapter6]#kubectl exec -it configmaps-volume-demo -- /bin/sh
/ # cd /etc/nginx/conf.d
/etc/nginx/conf.d # ls -al
total 12
drwxrwxrwx 3 root root 4096 Nov 14 01:38 .
drwxr-xr-x 3 root root 4096 Oct 19 18:20 ..
drwxr-xr-x 2 root root 4096 Nov 14 01:38 ..2022_11_14_01_38_17.1930151736
lrwxrwxrwx 1 root root 32 Nov 14 01:38 ..data -> ..2022_11_14_01_38_17.1930151736
lrwxrwxrwx 1 root root 24 Nov 13 15:05 myserver-gzip.cfg -> ..data/myserver-gzip.cfg
lrwxrwxrwx 1 root root 26 Nov 13 15:05 myserver-status.cfg -> ..data/myserver-status.cfg
lrwxrwxrwx 1 root root 20 Nov 13 15:05 myserver.conf -> ..data/myserver.conf

对nginx状态页进行访问
[root@K8s-master01 chapter6]#curl 10.244.4.41:8080
<title>Welcome to nginx!</title>
可把端口改成80
修改配置后用kubectl exec -it configmaps-volume-demo -- nginx -s reload加载

Secret

Secret主要用于存储密钥、OAuth令牌和 SSH 密钥等敏感信息,这些敏感信息采用base64编码保存,略好于
明文存储
Secret根据其用途等,还有类型上的区分

创建secret有三个子命令,代表三个大类别
[root@K8s-master01 chapter6]#kubectl create secret --help
docker-registry :专用于docker镜像仓库服务上的docker认证信息
generic :不便归类的类别(一般类别)
tls:专用于保存数字证书、匹配私钥的命令
generic类别下,还支持明确使用多种不同的类别:

Builtin Type

Usage

Opaque(不变区分)

arbitrary user-defined data

​kubernets.io/service-account-token(保存服务帐号令牌)​

service account token

​kubernets.io/dockercfg(专用类别)​

serialized ~/.dockercfg file

​kubernets.io/dockerconfigson(专用类别)​

serialized ~/.docker/config.json file

​kubernets.io/basic-auth(一般类别下专用于basic认证)​

credentials for basic authentication

​kubernets.io/ssh-quth(一般类别下专用于用于SHH认证)​

credentials for SSH basic authentication

​kubernets.io/tls(tls类别下)​

data for a TLS client or server

​bootstrap.kubernets.io/token(一般类别)​

bootstrap token data

​kubernets.io/dockercfg和kubernets.io/dockerconfigson属于docker-registry​

kubernets.io属于tls

余下的都属于generic

创建Secret资源
支持类似于ConfigMap的创建方式,但Secret有类型子命令,而且不同类型在data或stringData字段中支
持嵌套使用的key亦会有所有同;
命令式命令
◼ generic
◆kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1]
◆除了后面docker-registry和tls命令之外的其它类型,都可以使用该命令中的--type选项进行定义,但有些类型有key的特
定要求
◼ tls
◆kubectl create secret tls NAME --cert=path/to/cert/file --key=path/to/key/file
◆通常,其保存cert文件内容的key为tls.crt,而保存private key的key为tls.key
◼ docker-registry
◆kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-file=[key=]source]
◆通常,从已有的json格式的文件加载生成的就是dockerconfigjson类型,命令行直接量生成的也是该类型
示例
命令式命令(创建MySQL的Secret资源,mysql的root密码、数据库、数据库用户、mysql普通用户和密码)
[root@K8s-master01 chapter6]#kubectl create secret generic mysql-secret --from-literal=root.pass=mengfanchao --from-literal=db.name=wordpress --from-literal=db.user=wordpress --from-literal=db.pass=123456
secret/mysql-secret created
查看Secret
[root@K8s-master01 chapter6]#kubectl get secrets
NAME TYPE DATA AGE
mysql-secret Opaque 4 49s
mysql-user-pass Opaque 4 4d12h
查看mysql-secret详细信息
[root@K8s-master01 chapter6]#kubectl get secrets mysql-secret -o yaml
apiVersion: v1
data:
db.name: d29yZHByZXNz
db.pass: MTIzNDU2
db.user: d29yZHByZXNz
root.pass: bWVuZ2ZhbmNoYW8=
kind: Secret
metadata:
creationTimestamp: "2022-11-14T02:33:42Z"
name: mysql-secret
namespace: default
resourceVersion: "517928"
uid: 9252aced-d8ee-4ca4-b53b-c10de0168977
type: Opaque
其密码是base64编码的,可以解码查看root密码
[root@K8s-master01 chapter6]#echo bWVuZ2ZhbmNoYW8= |base64 -d
mengfanchao

把MySQL的secrte的的结果保存yaml文件,后期便于基于文件进行创建
[root@K8s-master01 chapter6]#kubectl create secret generic mysql-secret --from-literal=root.pass=mengfanchao --from-literal=db.name=wordpress --from-literal=db.user=wordpress --from-literal=db.pass=123456 --dry-run=client -o yaml > secret-mysql.yaml
创建
[root@K8s-master01 chapter6]#kubectl apply -f secret-mysql.yaml
Warning: resource secrets/mysql-secret is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
secret/mysql-secret configured
查看secret-mysql.yaml 文件,就可以看到mysql的信息都是被编码的,也可使用非编码形式
apiVersion: v1
data:
db.name: d29yZHByZXNz
db.pass: MTIzNDU2
db.user: d29yZHByZXNz
root.pass: bWVuZ2ZhbmNoYW8=
kind: Secret
metadata:
creationTimestamp: null
name: mysql-secret
此时再创建mysql pod运行时, 就不必再把对应的配置信息直接卸载文档中了,直接引用mysql-secret就可以
如何引用secret对象
Secret资源在Pod中引用的方式同样有两种
⚫ 环境变量
◆ 引用Secret对象上特定的key,以valueFrom赋值给Pod上指定的环境变量
◆ 在Pod上使用envFrom一次性导入Secret对象上的所有key-value,key(也可以统一附加特定前缀)即为环境变量名,value自动成为相应的变量值
⚫ secret卷
◆ 在Pod上将Secret对象引用为存储卷,而后整体由容器mount至某个目录下

key转为文件名,value即为相应的文件内容
◆ 在Pod上定义Secret卷时,仅引用其中的部分key,而后由容器mount至目录下
◆ 在容器上仅mount Secret卷上指定的key

注意:容器很可能会将环境变量打印到日志中,因而不建议以环境变量方式引用Secret中的数据
在mysql pod上引用secret的示例(基于环境变量引用)
[root@K8s-master01 chapter6]#cat secrets-env-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
name: secrets-env-demo
namespace: default
spec:
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root.pass
如果其他环境变量都需要赋值,依次在env下逐一给出。
运行mysql的pod
kubectl apply -f secrets-env-demo.yaml
基于secret卷为nginx提供一个https的虚拟主机(需要cert、key证书文件和私钥文件需要保存为私密信息)
[root@K8s-master01 chapter6]#ls certs.d/
nginx.crt nginx.key
生成证书文件和私钥文件,把文件通过secret的形式注入到nginx容器内部去,基于卷的形式注入和引用
先把文件创建成secret的形式,让nginx的pod来引用他,nginx的配置文件要指明配置好一个https虚拟主机,而且要指明nginx.crt nginx.key作为自己的证书和私钥。
一旦创建为tls类型的secret,他们的键会自动被定义成tls.crt、tls.key的文件名

[root@K8s-master01 chapter6]#cat nginx-ssl-conf.d/*
server {
listen 443 ssl;
server_name www.ik8s.io;

ssl_certificate /etc/nginx/certs/tls.crt; #目录可能不存在,引用secret,自动生成
ssl_certificate_key /etc/nginx/certs/tls.key; #目录可能不存在,引用secret,自动生成

ssl_session_timeout 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

include /etc/nginx/conf.d/myserver-*.cfg;

location / {
root /usr/share/nginx/html;
}
}

server {
listen 80;
server_name www.ilinux.io;
return 301 https://$host$request_uri;
}
gzip on;
gzip_comp_level 5;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/xml text/javascript;
location /nginx-status {
stub_status on;
access_log off;
}
两个虚拟主机,一个80的,一个443的,只不过对80的访问都转个443来访问,对于443来说,有主机名。


第一步:查看创建nginx的pod的yaml文件,根据其定义的内容创建所需要引用的卷
[root@K8s-master01 chapter6]#cat secrets-volume-demo.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: secrets-volume-demo
namespace: default
spec:
containers:
- image: nginx:alpine
name: ngxserver
volumeMounts:
- name: nginxcerts
mountPath: /etc/nginx/certs/
readOnly: true
- name: nginxconfs
mountPath: /etc/nginx/conf.d/
readOnly: true
volumes:
- name: nginxcerts
secret:
secretName: nginx-ssl-secret #创建的secret的名字为nginx-ssl-secret
- name: nginxconfs
configMap:
name: nginx-sslvhosts-confs #创建的configMap的名字为nginx-sslvhosts-confs
optional: false

第二步:先把certs.d目录下的文件创建成secret的形式,让nginx的pod来引用他(注意secretname要一致)
[root@K8s-master01 chapter6]#ls certs.d/
nginx.crt nginx.key
[root@K8s-master01 chapter6]#kubectl create secret tls nginx-ssl-secret --cert=certs.d/nginx.crt --key=certs.d/nginx.key --dry-run=client -o yaml
查看可看到证书和私钥文件名称
tls.crt
tls.key
证书和私钥内容也被base64编码了,可查看echo <内容> |base64 -d
把以上信息保存成yaml文件创建成secret后用于被nginx的pod引用
[root@K8s-master01 chapter6]#kubectl create secret tls nginx-ssl-secret --cert=certs.d/nginx.crt --key=certs.d/nginx.key --dry-run=client -o yaml > secret-nginx-certs.yaml

创建secret
[root@K8s-master01 chapter6]#kubectl apply -f secret-nginx-certs.yaml
secret/nginx-ssl-secret created
[root@K8s-master01 chapter6]#kubectl get secret
NAME TYPE DATA AGE
mysql-secret Opaque 4 72m
mysql-user-pass Opaque 4 4d13h
nginx-ssl-secret kubernetes.io/tls 2 8s

第三步:把nginx-ssl-conf.d目录下的配置文件创建成configmap,供引用
[root@K8s-master01 chapter6]#ls nginx-ssl-conf.d/*
nginx-ssl-conf.d/myserver.conf nginx-ssl-conf.d/myserver-gzip.cfg nginx-ssl-conf.d/myserver-status.cfg

创建configmap
[root@K8s-master01 chapter6]#kubectl create configmap nginx-sslvhosts-confs --from-file=nginx-ssl-conf.d/
configmap/nginx-sslvhosts-confs created
也可使用--dry-run=client -o yaml 生成一个yaml文件,然后kubectl apply -f yaml文件名来创建

查看configmap
[root@K8s-master01 chapter6]#kubectl get cm
NAME DATA AGE
demoapp-cfg 2 15h
demoapp-config 2 13h
kube-root-ca.crt 1 7d1h
nginx-cfg 4 14h
nginx-config-files 3 13h
nginx-sslvhosts-confs 3 2m1s

第四步:创建nginx的pod并查看
[root@K8s-master01 chapter6]#kubectl get pods secrets-volume-demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
secrets-volume-demo 1/1 Running 0 32s 10.244.3.51 k8s-node01 <none> <none>

访问10.244.3.51,发现自动跳转到https上
[root@K8s-master01 chapter6]#curl -I 10.244.3.51
HTTP/1.1 301 Moved Permanently
Server: nginx/1.23.2
Date: Mon, 14 Nov 2022 04:10:38 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://10.244.3.51/

基于https进行访问,因为是自签名证书,加-k
[root@K8s-master01 chapter6]#curl -I -k https:///10.244.3.51/
HTTP/1.1 200 OK
Server: nginx/1.23.2
Date: Mon, 14 Nov 2022 04:11:57 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 19 Oct 2022 10:28:53 GMT
Connection: keep-alive
ETag: "634fd165-267"
Accept-Ranges: bytes
可以正常连接访问
查看证书信息
[root@K8s-master01 chapter6]#openssl s_client -connect 10.244.3.51:443
如果修改了secret的,nginx不会自动加载,需要手动加载。
Image Pull Secret(私有仓库拉取镜像)
dockercfg及dockerconfigjson类型的Secret主要用于从私有Image Registry中下载容器镜像
⚫ 其引用定义在pod.spec.imagePullSecrets字段上

定义一个pod文件,pod中所指明的image来自于私有仓库,需要认证后才能访问
为了能让kubelet在运行pod时,把pod中的镜像能够从私有仓库下载下来,得配置给pod从哪里加载认证到远程私有仓库服务的认证信息

kubectl create secret docker-registy --help (有两种格式)
有两种配置方法:
第一种:
直接在pod之上使用imagepullsecrets加载,把访问docker私有仓库的registy账户和密码保存成secret,然后再pod定义上使用imagepullsecrets来引用这个secret,就可以在获取镜像的时候认证到registy,再下载镜像
如果有多个容器,每一个容器分别来自不同的registy上的私有仓库中,imagepullsecrets可以以列表形式给出多个secret的引用,下载每一个镜像的时候,从上而下依次认证,直到成功下载到镜像

kubectl create secret docker-registy --help (有两种格式)

示例
apiVersion: v1
kind: Pod
metadata:
name: demoapp
namespace: default
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
imagePullSecrets:
- name: ikuberneteskey
secret总结
docker-registy:专用于让kubelet认证到Registy下载镜像时使用
格式为:pod的spec嵌套使用
imagePullSecrets
对象列表
-name: SECRET_NAME

标签:ConfigMap,12,name,--,nginx,secret,K8s,root
From: https://blog.51cto.com/mfc001/6114683

相关文章

  • 13、Label和Label Selector
    标签选择器Label和LabelSelector:标签和标签选择器LabelLabel资源对象的源数据:任何资源类型的任一资源对象,包括pod(pod用的最多)定义在metadata.labels:key:valu......
  • 设置为60s-1800s(60s最为敏感)。如果设置为60s
    建议开发者通过setReportPolicies接口设置4种上报策略搭配使用,并将定时上报策略设置为60s-1800s(60s最为敏感)。如果设置为60s,这种场景即便进程被杀掉,也能确保进程杀死前60s之......
  • 用户切后台触发事件上报
    用户切后台触发事件上报,上报进程还没有走完,进程被杀掉,导致事件上报失败,缓存在本地,等待下次上报;用户切后台上报时,网络状况等原因,没有上报成功;​​https://weibo.com/ttartic......
  • Python 决定迁移到 GitHub
    Python已经决定迁移到GitHub,虽然有人公开说反对迁移到GitHub,但还是有很多人会在一定程度上使用GitHub,而且几位核心的开发者也倾向于选择GitHub。Python在很久之前为了......
  • shell编程语言-文件的统计与排序
                     ......
  • 实验1 Python开发环境使用和编程初体验
    实验任务1:task1_1实验源码:#task1_1print的使用print('hey,u')#输出单个字符串或者单个变量print('hey','u')x,y,z=1,2,3print(x,y,z)#输出多个数据项,用“,”......
  • Java中值传递相关问题
    Java中只存在值传递,不存在引用传递1.如果形参是基本数据类型,那么形参拷贝的是实参变量的值2.如果形参是引用数据类型,那么形参拷贝的是实参变量的地址。二者本质都是值......
  • P3530[POI2012 FES-Festival] 题解
    题面链接简要题意对于数列\(\{v_n\}\),有两种约束\(v_i=v_j+1\)和\(v_i\gev_j\),问\(\{v_n\}\)最多有多少个不同的项。解法考虑先建图,注意到如果约束图是DAG,那么......
  • jupyter notebook网页形式打开
    一、打开AnacondaPrompt,通过输入condainstalljupyternotebook来安装jupyter模块  二、切换到想要开发代码的目录,输入命令jupyter-notebook.exe ......
  • 三月十一日
    今天完成了button按钮的跳转,其具体步骤为声明控件---找到控件---实现跳转和匹配对应用户名和密码,获取edittest里面的账号和密码与规定的进行匹配成功则进行跳转。首先声明......