kubernetes配置中心
在K8S中,有两种方式管理资源的配置,分别是configmap和secret,他们的最大区别是:configmap用来管理明文配置secret用来管理密文配置configmap**Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存**我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:n
·
- 在K8S中,有两种方式管理资源的配置,分别是configmap和secret,他们的最大区别是:
- configmap用来管理明文配置
- secret用来管理密文配置
configmap
- **Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存 **
- 我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s中引入了Configmap资源对象,可以当成volume挂载到pod中,实现统一的配置管理。
- Configmap是k8s中的资源, 相当于配置文件,可以有一个或者多个Configmap;
- Configmap可以做成Volume,k8s pod启动之后,通过 volume 形式映射到容器内部指定目录上;
- 容器中应用程序按照原有方式读取容器特定目录上的配置文件。
- 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。
configmap的应用场景
- 使用k8s部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。configmap注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中。
- 使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。
configmap的局限性
- ConfigMap在设计上不是用来保存大量数据的。在ConfigMap中保存的数据不可超过1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。
怎么使用configmap
- 创建configmap资源
- 在deploy中定义congfigmap类型的volumes
- 在deoloy的containers中挂载此volumes
configmap创建方法
命令行创建
# 直接在命令行中指定configmap参数创建,通过--from-literal指定参数
kubectl create configmap mysql-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com
文件创建
# 通过指定文件创建一个configmap,--from-file=<文件>
# 定义一个key是www,值是nginx.conf中的内容
kubectl create configmap mysql-config --from-file=www=./nginx.conf
指定目录创建
# 指定目录创建configmap
kubectl create configmap mysql-config --from-file=/root/test-a/
编写configmap资源清单
#
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
labels:
app: mysql
data:
master.cnf: |
[mysqld]
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
slave.cnf: |
[mysqld]
super-read-only
log_bin_trust_function_creators=1
pod中引入configmap
volume挂载方式
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
app: webserver
name: webserver
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: webserver
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: webserver
spec:
volumes:
- name: config
configMap:
name: mysql-config
containers:
- image: nginx:1.21
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d/
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
环境变量引入方式:使用configMapKeyRef
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: busybox
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
strategy: {}
template:
metadata:
labels:
app: busybox
spec:
containers:
- command:
- sleep
- "3600"
image: busybox:1.28
env:
- name: name
valueFrom:
configMapKeyRef:
name: users
key: name
- name: pass
valueFrom:
configMapKeyRef:
name: users
key: pass
- name: email
valueFrom:
configMapKeyRef:
name: users
key: email
name: busybox
resources: {}
更新configmap配置的方法
单配置更新法:
- 修改configmap资源清单并应用
- 重启使用该configmap资源的pod
多配置更换法:
- 准备多个configmap资源
- 修改dp中使用的configmap
- 重新apply该dp,pod会自动重启
相关命令
- 查看默认命名空间下所有的configmaps
kubectl get configmaps
- 查看指定configmap的内容
kubectl get configmap test-config -o yaml
- 查看指定configmap的详细信息
kubectl describe configmap test-config
- 删除configmap
- 基于configmap文件删除
kubectl delete -f test-cfg.yml
- 直接删除configmap对象
kubectl delete configmap test-config
- 基于configmap文件删除
使用ConfigMap的注意事项
- configmap必须在pod之前创建
- 只有与当前configmap在同一个namespace内的pod才能使用这个configmap
- configmap如果发生变更,使用其的pod需要重启或重载
- ** kubelet只支持可以被api server管理的pod使用configmap。kubelet在本地创建的静态pod将无法使用configmap**
Secret
- Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
- 用户可以创建 secret,同时系统也创建了一些 secret。
- 要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用
Secret 有三种类型:
- Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount 目录中。
- Opaque :是一个map结构(key-value),其中vlaue要求以base64格式编码,也称之为generic类型。以base64编码格式的Secret,用来存储密码、密钥等, **可以通过base64 --decode解码获得原始数据,因此安全性弱 **
- tls:用于存放tls证书
- ** dockerconfigjson** :专用于存放私有docker registry的认证信息,所以也称之为docker-registry类型
secret可选参数
secret可选参数有三种
- generic: 通用类型,通常用于存储密码数据。
- tls:此类型仅用于存储私钥和证书。
- docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。
创建generic secert
命令行方式创建
kubectl create secret generic test-secret --from-literal=username='breeze',password='123456'
yaml文件方式创建
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: test-secret
data:
username: YnJlZXpl
password: MTIzNDU2
kubectl create -f test-sec.yaml
使用generic secert
挂载使用
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
app: webserver-secret
name: webserver-secret
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: webserver-secret
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: webserver-secret
spec:
volumes:
- name: config
secret:
secretName: test-secret
containers:
- image: nginx:1.21
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d/
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
环境变量使用
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: busybox-secret
name: busybox-secret
spec:
replicas: 1
selector:
matchLabels:
app: busybox-secret
strategy: {}
template:
metadata:
labels:
app: busybox-secret
spec:
containers:
- command:
- sleep
- "3600"
image: busybox:1.28
env:
- name: name
valueFrom:
secretKeyRef:
name: users
key: user
- name: pass
valueFrom:
secretKeyRef:
name: users
key: pass
- name: email
valueFrom:
configMapKeyRef:
name: users
key: email
name: busybox
resources: {}
创建tls secert
命令行方式创建
kubectl create secret tls example.com --cert=./example.com.crt --key=./example.com.key
yaml文件方式创建
apiVersion: v1
kind: Secret
metadata:
name: example.com
namespace: cka
type: kubernetes.io/tls
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNzakNDQVpvQ0NRQ1lwbWo5cG15bDNUQU5CZ2txaGtpRzl3MEJBUXNGQURBVk1STXdFUVlEVlFRREV3cHIKZFdKbGNtNWxkR1Z6TUI0WERUSXhNVEl4T0RBNE1ERTFNVm9YRFRJek1EVXdNakE0TURFMU1Wb3dJVEVRTUE0RwpBMVVFQXd3SFpYaGhiWEJzWlRFTk1Bc0dBMVVFQ2d3RVpHWnlkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTHdVYTFWYjQ0MmhINzZIWXVEekpjcGZkRTkzNjduaUR0VngxYThjaDRvSEMvNUkKRXoyVFlhYkNEZHA5d0ZDT25LRitmYWFLVk9kak1qTVF4ZDZhK0xHdVF0aXMrL3NMQmorb3QzeGtzMjM1cWptZAprUjRrVlg5bzd1Z0p1a1VIWUxRU3FacXdDWWFjZkFFY0pLOW9nZ1FnaTNINXRrRGlGNFZJSmdXeXVrNWdNZEtUCjVoUkRPeWxhZXhCeUJKQUlqMVBhMDFvMDJpR1J5MnhIVnlGb29nRHova1NvcXQ1YjZ6bnV5MjB6UFNIUFN1a0EKTmg3L1hsY1A1anZoWmk1aFZxNFVlVFVxeVVPZmwrai9xNGVuSzFnTE8waWt1dE1hbTBpRzlmQkpsZWRiZVlXUwo5amxTKzMxWVBzeFNvTjJyeXcwTzF3T1dLK2lzUTlXZDAweGw1dEVDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBa25hcXdHNytDZnBXSUpDWkE5cXhsZmtuWWY0ZDVkYXR3MGMyN3lHZmdCbElJRnlCd0pid0NIajMKVmdJVU1NQllWQk5rS1JBRnczUmc2d1h5dnJINjJ3SmJBdTNpSDQ3enVRQU5panpxSFFDRkFiS3dPejl2VXNyeQp0NWRRUnJpMTlkaEFDQ25uVHg4OUFIMldyeC9WMEUxdFNXejZxODhmaVNXZktFZzdGenRFZnlSK0ZYajZEd3hWClU3VEZpZHJEWHpiY3VZREZNZytvMm94TTN6VlF3Q0JnczJNbHNaMXZRbXVjYVg2KzNRaTVLK2Y2MXNTenBqSzEKSWQ1NXhkRy8zYUVZa3liaS80V2w2RXl4b0xoY242Z1Ivc1hVZXJESGtnRXZDa0c4ZUYvUmtlV3BwQzBVbmFhNQpvZFJJNnh1QUZwL1FCOUJjWkVTTlRvWVRCeVpUdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBdkJSclZWdmpqYUVmdm9kaTRQTWx5bDkwVDNmcnVlSU8xWEhWcnh5SGlnY0wva2dUClBaTmhwc0lOMm4zQVVJNmNvWDU5cG9wVTUyTXlNeERGM3ByNHNhNUMyS3o3K3dzR1A2aTNmR1N6YmZtcU9aMlIKSGlSVmYyanU2QW02UlFkZ3RCS3BtckFKaHB4OEFSd2tyMmlDQkNDTGNmbTJRT0lYaFVnbUJiSzZUbUF4MHBQbQpGRU03S1ZwN0VISUVrQWlQVTlyVFdqVGFJWkhMYkVkWElXaWlBUFArUktpcTNsdnJPZTdMYlRNOUljOUs2UUEyCkh2OWVWdy9tTytGbUxtRldyaFI1TlNySlE1K1g2UCtyaDZjcldBczdTS1M2MHhxYlNJYjE4RW1WNTF0NWhaTDIKT1ZMN2ZWZyt6RktnM2F2TERRN1hBNVlyNkt4RDFaM1RUR1htMFFJREFRQUJBb0lCQUFOQVl4NmxxUWh3eWFpMApsSHdKR0JVb2swMHdhSTNkSDU2SENrZXR1WllrU3d2SldUUE9VWGpkai9uQUJNd2Z1d3Q3c1Zab3U5RUlRUHpyCkJGQzE0eWpITjNhaGZ2VzNHaE9OcWlablkwYTZjenZ0d20xLytVNXJsUDNEOVVsdU9EakV2ZFBqeVRaZmpERkUKdUVta0IrTmtZS1RHeVdUVHc4NVZFZnMxUE0xUUN0WXZjeHNoSEgwSXFSUC9lTUNIN1FXdk1iUWlCcDhiYkIwNQppR0lZNjVBd0dtbXdmQmZJNDhjSk5CM1c5OEJzUFJWUk43RVdnVG1jUmpRbGg3RmxnQlBNWDlkV25yY0UvRFFaCmVmS0tNVVpZU1VyTDU3WitxaUxDb0VDR3d3ZnZ0V1pibXpLUkJzTjZJRmczaFJYR1BNVkRTeXRobURHM3dxa1kKMVNaczcwRUNnWUVBMjNxRTJ5ZjJBRzJlOXZNck9iZURsTmg3bGpyVWNTL3BJRms1MjIzc2xqOEgrcHF0eE9ycQpaK1VVRDBxYVhkRVg1YUkrbGR3dytNcTlJaGg2Y1QyY1lMSDZvRlhFYVEzU29kQVB1UTlpdG1MU2xLRFVaMHh0CnlubjRUUENaM1Bqa1JGdUhFbmFPdm9MTGFQTXNqaXlRK3FHNFpKTWZBY3NiZnAwWEl1ck10VWtDZ1lFQTIyQmEKcTNFY1NPOXc3WHZUS2I1aDFOWW5rVlBibTRiR2NZbUhsWXI0bnRObE5veWhQdW4xSFRncHlGT2I1dWpJT2poMApINkNIMUhhRStBTHMrdzdHNHluZDA0UEpWRkQ3ZE5YbkgrSEEveDM5d3FlTEVpTHlRL0hiN281N29OSzdtQjFrClZnMUhjSnR6VityTnFLZkVtc0dpdUZTNkpDdVZwK0V5emwvRmpVa0NnWUJqbGtjOFRmaVFueXozTHNWWlRneTEKZURrenBJUUt5OHVETXhsT21LVTJVMmxpYTljWE4rU2V1ZElOVWpPVENESklyd0tvNngySmRpeTFrTmZXRkRlbApwSHh0VGgxdDhhaTJaWHNNNUk5TTVMQmFZbE9lZjQ1OXhqUkZiUkxUc2xlWk1OS3NMUUYrTGtqdjJROUpmNjFWCkhCWllCRzJZV2JtakROS1h0R1NvaVFLQmdGb0dLbThjVmEwZ2hVa1BmVkl1REZ1WkhsZW5BQUhNeHZha3AzMFkKc0hvTTZnWCtvOVQ3a1ZqU1NXTXAzRnBmd0hzVDI2TjI3d2FqTkdIS1laR05PTlRUdzNJZkxLbHJLaVdCK2Z5OQpXY1BYZk9FNmUvbVBXYmZFTXFxczBkTG5aNUErejRQNG93NTAzRnFCd3ErcFdTYmd1M1BGWVRXaXBTRmxhc0lCCnowSHhBb0dBUEZxNllKZTFjV1p3Tm9KU09kN2g2Nld1V2ZzeTZ2SFBDZXRxWjIwT3ZuaGdtMXlzVlFWSzRlRi8KUFZ3UVdYYkNkRU82ODZxd2VoOUZCdm1XVUtuMWVYajJoMlIvMHdJU0lhcE5oVms4MUFuM2JwYlNjSkFyNnZQdQpkSkhBTWtoOW53ZEVXb29ZeXFpK3MybHBQSnhpY21YQ2JXUEFjdHp3OEtzZWw0cWxxcDA9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
使用tls
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webserver-deploy-ing
namespace: cka
spec:
ingressClassName: nginx
tls:
- hosts:
- www.example.com
secretName: example.com
rules:
- host: www.example.com
http:
paths:
- backend:
service:
name: webserver-deploy-svc
port:
number: 80
path: /
pathType: Prefix
创建dockerconfigjson secret
命令行方式创建
kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-file=[key=]source] [--dry-run=server|client|none] [options]
kubectl create secret docker-registry cka-hub --docker-username=yanruogu@gmail.com --docker-password=cka123456 --docker-email=yanruogu@gamil.com --docker-server=registry.cn-zhangjiakou.aliyuncs.com
yaml文件方式创建
apiVersion: v1
kind: Secret
metadata:
name: cka-hub
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi16aGFuZ2ppYWtvdS5hbGl5dW5jcy5jb20iOnsidXNlcm5hbWUiOiJ5YW5ydW9ndUBnbWFpbC5jb20iLCJwYXNzd29yZCI6ImNrYTEyMzQ1NiIsImVtYWlsIjoieWFucnVvZ3VAZ2FtaWwuY29tIiwiYXV0aCI6ImVXRnVjblZ2WjNWQVoyMWhhV3d1WTI5dE9tTnJZVEV5TXpRMU5nPT0ifX19
使用dockerconfigjson secret
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
app: webserver-pri
name: webserver-pri
namespace: cka
spec:
replicas: 1
selector:
matchLabels:
app: webserver-pri
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: webserver-pri
spec:
imagePullSecrets:
- name: cka-hub
containers:
- image: registry.cn-zhangjiakou.aliyuncs.com/cka-test/nginx:latest
imagePullPolicy: Always
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
查看secret
- 列出默认命名空间下的secret
kubectl get secret
- 以yaml的形式获取指定的secret
kubectl get secret test-secret -o yaml
- 查看指定secret的详细信息
kubectl describe secret test-secret
Secret使用的注意事项
- Secret需要先于pod创建
- 只有与当前secret在同一个namespace内的pod才能使用这个secret
- secret如果发生变更,使用其的pod需要重启或重载
- kubelet只支持可以被api server管理的pod使用secret。kubelet在本地创建的静态pod将无法使用secert
更多推荐
已为社区贡献2条内容
所有评论(0)