k8s学习记录,配置管理Secret(十八)
文章中资料参考来源2022 云原生Kubernetes全栈架构师
1、Secret和Configmap一样,都是做配置管理的资源,但是Secret在做配置存储时会对存储的信息加密【base64加密】
常用类型
- Opaque: 通用型Secret,默认类型
- kubernetes.io/service-account-token:作用于ServiceAccount,包含一个令牌,用于标识API服务账户;
- kubernetes.io/dockerconfigjson:下载私有仓库镜像使用的Secret,和宿主机的/root/.docker/config.json一致,宿主机登录后即可产生该文件
- kubernetes.io/basic-auth:用于使用基本认证(账号密码)的Secret,可以使用Opaque取代;
- kubernetes.io/ssh-auth:用于存储ssh密钥的Secret;
- kubernetes.io/tls:用于存储HTTPS域名证书文件的Secret,可以被Ingress使用;
- bootstrap.kubernetes.io/token: 一种简单的bearer token,用于创建新集群或将新节点添加到现有集群,在集群安装时可用于自动颁发集群的证书
2、创建Secret【--from-file】
##生成2个txt文件,存储admin用户名及admin密码
[root@k8s-master01 podtest]# echo -n 'admin' > ./username.txt
[root@k8s-master01 podtest]# echo -n '1f2d1e2e67df' > ./password.txt
##根据存储的2个文件,创建Secret
[root@k8s-master01 podtest]# kubectl create secret generic db-user-pass --from-file=username.txt --from-file=password.txt
secret/db-user-pass created
##创建成功后查看secret中保存的信息
[root@k8s-master01 podtest]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 8s
default-token-rqncz kubernetes.io/service-account-token 3 114d
[root@k8s-master01 podtest]# kubectl get secret db-user-pass -oyaml
apiVersion: v1
data:
password.txt: MWYyZDFlMmU2N2Rm
username.txt: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2021-08-20T00:38:35Z"
name: db-user-pass
namespace: default
resourceVersion: "12680399"
uid: d4536eed-2539-4771-81d3-d7f9f9642c8f
type: Opaque
3、创建Secret【--from-literal】
## 在创建命令中指定要存储的key和value
[root@k8s-master01 podtest]# kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='JQHU*#(!NAF='
secret/dev-db-secret created
[root@k8s-master01 podtest]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 15m
default-token-rqncz kubernetes.io/service-account-token 3 114d
dev-db-secret Opaque 2 13s
## 查看创建成功的secret及保存的内容
[root@k8s-master01 podtest]# kubectl get secret dev-db-secret -oyaml
apiVersion: v1
data:
password: SlFIVSojKCFOQUY9
username: ZGV2dXNlcg==
kind: Secret
metadata:
creationTimestamp: "2021-08-20T00:53:25Z"
name: dev-db-secret
namespace: default
resourceVersion: "12682452"
uid: cf1a7249-8849-4ff9-839b-faa6df513785
type: Opaque
注意⚠️:
- 在使用--from-literal创建时,如果写入的内容有特殊字符"\ = ?"等时,需要使用单引号将内容包括住,否则会提示创建失败
4、基于yaml文件来创建secret
## 先将要创建的secret信息进行base64加密
[root@k8s-master01 podtest]# echo -n 'creamk87k8s' | base64
Y3JlYW1rODdrOHM=
[root@k8s-master01 podtest]# echo -n '12jdh12j412' | base64
MTJqZGgxMmo0MTI=
## 将加密后的信息写入到yaml文件中
[root@k8s-master01 podtest]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: secret-from-file
type: Opaque
data:
username: Y3JlYW1rODdrOHM=
password: MTJqZGgxMmo0MTI=
## 保存后退出,使用命令创建Secret
[root@k8s-master01 podtest]# kubectl create -f secret.yaml
5、使用Secret拉取私有镜像文件
## 登录阿里云官方镜像仓库,输入个人用户名密码登录成功
docker login registry.cn-hangzhou.aliyuncs.com/creamk87/nginx
## 登录成功后,才可以拉取镜像文件至本地
如果deployment等资源拉取私有镜像时,怎么处理呢
## 修改deployment中images地址为私有镜像仓库地址:registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-cm
name: dp-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm
template:
metadata:
labels:
app: dp-cm
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1
name: nginx
env:
- name: LIVE
valueFrom:
configMapKeyRef:
name: gameenvcm
key: live
在创建deploy过程中,使用的是私有镜像文件,所以报错需要登录才可进行镜像拉取
查看创建secret的帮助文档
从创建的帮助文档中可以看到,创建类型设置为docker-registry
继续查看帮助文档,创建时需要填写的参数
[root@k8s-master01 podtest]# kubectl create secret docker-registry myregistry -h
## 创建secret的命令,docker登录信息请替换为自己的登录信息
kubectl create secret docker-registry myregistry --docker-username=creamk8757 --docker-password=xxxxxxxxx --docker-email=creamk87@outlook.com --docker-server=registry.cn-hangzhou.aliyuncs.com
创建完成secret之后,再对原deployment进行secret的挂载
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dp-cm
name: dp-cm
spec:
replicas: 1
selector:
matchLabels:
app: dp-cm
template:
metadata:
labels:
app: dp-cm
spec:
imagePullSecrets:
- name: myregistry
# - name: dockerregistry ## 如果有多个Secret可以依次在下方配置
containers:
- image: registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1
name: nginx
## 使用新的yaml文件进行更新
kubectl replace -f dp-cm.yaml
新创建的pod拉取镜像成功
6、使用Secret管理HTTPS证书【正式环境一般不这么使用,通常配置在负载均衡入口】
在个人电脑先准备练习用的证书,使用openssl生成证书
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 tls.key -out tls.crt -subj "/CN=test.com"
注意⚠️
仅个人练习使用,正式环境使用公司购买的证书来进行secret创建
## 使用证书文件的crt和key来创建secret
kubectl create secret tls nginx-test-tls --key=tls.key --cert=tls.crt
创建完成后,直接在ingress中进行配置
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-https-test
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: https-test.com
http:
paths:
- backend:
serviceName: nginx-svc
servicePort: 80
tls:
- secretName: nginx-test-tls