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

image

image

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

image

注意⚠️:

  • 在使用--from-literal创建时,如果写入的内容有特殊字符"\ = ?"等时,需要使用单引号将内容包括住,否则会提示创建失败
    image

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

image

5、使用Secret拉取私有镜像文件

image

## 登录阿里云官方镜像仓库,输入个人用户名密码登录成功
docker login registry.cn-hangzhou.aliyuncs.com/creamk87/nginx
## 登录成功后,才可以拉取镜像文件至本地

image

如果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

image

image

image

在创建deploy过程中,使用的是私有镜像文件,所以报错需要登录才可进行镜像拉取

image

查看创建secret的帮助文档

从创建的帮助文档中可以看到,创建类型设置为docker-registry

image

继续查看帮助文档,创建时需要填写的参数

[root@k8s-master01 podtest]# kubectl create secret docker-registry myregistry -h

image
image

## 创建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

image

创建完成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

image

## 使用新的yaml文件进行更新
kubectl replace -f dp-cm.yaml

image
新创建的pod拉取镜像成功

6、使用Secret管理HTTPS证书【正式环境一般不这么使用,通常配置在负载均衡入口】

在个人电脑先准备练习用的证书,使用openssl生成证书

openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 tls.key -out tls.crt -subj "/CN=test.com"

注意⚠️
仅个人练习使用,正式环境使用公司购买的证书来进行secret创建

image

## 使用证书文件的crt和key来创建secret
kubectl create secret tls nginx-test-tls --key=tls.key --cert=tls.crt

image

创建完成后,直接在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
posted @ 2021-08-21 12:21  Hei蛋炒饭  阅读(405)  评论(0编辑  收藏  举报