secret的使用方法
secret的使用方式和configmap很像,secret使用加密的方式更加安全,configmap更适合传递配置文件。
secret的类型
◆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,
用于创建新集群或将新节点添加到现有集群,在集群安装时可用于自动颁发集群的证书。
创建secret
使用命令的方式创建,从文件来生成参数
用文件创建secret,两个文件一个创建用户名一个创建密码。
echo -n "admin" > user.txt #创建文件user写入值admin
echo -n "Huawei@123" > password.txt #创建文件password.txt写入值Huawei@123
kubelet create secret generic secret-name --from-file=user.txt --from-file=password.txt
# generic secret的类型
kubelet describe secret secret-name #查看secret
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 10 bytes
user.txt: 5 bytes
用文件创建secret,一个文件中同时创建用户名密码
cat 1.txt
user=admin
password=123qer
kubectl create secret generic secret-pass2 --from-env-file=1.txt
使用yaml创建secret文件
echo -n "admin" | base64 #生成用户名和密码的base64的加密,应为secret是使用base64加密的。
echo -n “Huawai@123” | base64
cat secret.yaml # 使用加密过的数值创建
apiVersion: v1
kind: Secret
metadata:
name: mysecret
data:
user: YWRtaW4=
password: SHVhd2VpQDEyMw==
kubectl describe secret mysecret #查看详细信息
Name: mysecret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
password: 10 bytes
user: 5 bytes
在pod中使用secret
使用mount挂载到pod中,这样会生成以键命名的文件,内容是value的值。
#使用volume挂载
apiVersion: v1
kind: Pod
metadata:
name: secretpod
spec:
containers:
- name: secretpod-test
image: busybox
args: ["/bin/sh","-c","sleep 3000"]
volumeMounts:
- name: mysecrettest
mountPath: "/etc/config"
readOnly: true
volumes:
- name: mysecrettest
secret:
secretName: mysecret
使用env生成环境变量
#使用env应用secret
apiVersion: v1
kind: Pod
metadata:
name: envsecretpod
spec:
containers:
- name: envsecretpodd
image: busybox
args: ["/bin/sh","-c","sleep 3000"]
env:
- name: PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
- name: USER
valueFrom:
secretKeyRef:
name: mysecret
key: user
#使用envFrom引用secret
apiVersion: v1
kind: Pod
metadata:
name: secretenvfrom
spec:
containers:
- name: secretenvfrom
image: nginx
envFrom:
- secretRef:
name: my-secret
在拉取私有镜像仓库镜像时,使用secret
用secret来存储私有镜像仓库的用户名密码及地址
创建方法:
kubectl create secret docker-registry myregistrykey \
#secret的类型
--docker-server=DOCKER_REGISTRY_SERVER \ #仓库地址
--docker-username=DOCKER_USER \ #用户名
--docker-password=DOCKER_PASSWORD \ #密码
--docker-email=DOCKER_EMAIL #email
如何使用,在pod内增加字段如下:
spec:
imagePullSecrets:
- name: myregistry #sercet的名称
containers:
使用HTTPS域名证书
用secret来存储域名证书
创建secret
kubectl -n default create secret tls nginx-test-tls --key=tls.key --cert=tls.crt
在pod内使用
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: #增加tls字段
- secretName: nginx-test-tls
设置configmap和secret不可更改
在configmap中加入immutable=true可以限制对configmap和secret的更改.
apiVersion: v1
data:
nginx.conf: |2
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 512;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
immutable: true #加入此参数可以设置configmap不能修改
kind: ConfigMap
metadata:
creationTimestamp: "2024-02-23T08:34:10Z"
name: nginx.conf
namespace: default
resourceVersion: "205391230"
uid: 5323f420-cf45-42b5-b53c-3ed3f3b461e2