Secret用来保存密码、token密钥以及一些敏感的k8s资源。这类数据虽然可以存放在镜像当中,但是放在secret当中可以更方便控制。减少暴露的风险。
Secret的作用:保存加密的信息
docker-registry()主要用于存储docker仓库的认证信息,以及docker组件认证信息。(私有)
generic(jienairuike)是Secret的默认模式。类型是Qpaque。是base64加密编码的secret。用于用户自定义的密码、密钥等等。
tls表示TLS/SSL,用于存储证书和密钥、存储https证书和密钥队
系统自建的:kubernetes.io/service-account-token来访问系统的apiserver。pod会默认使用kubernetes.io/service-account-token创建的secret和apiserver进行通信。自动挂载到pod的/run/serect/kubernetes.io/service-account
1、指定文件提取信息
陈述式的创建方式:
#创建命令
kubectl create secret generic mysecret --from-file=/opt/xiao.txt --from-file=/opt/xiaobu.txt
#查看有哪些secret文件
kubectl get secrets
NAME TYPE DATA AGE
default-token-sgjrp kubernetes.io/service-account-token 3 18d
mysecret Opaque 2 11s
nfs-client-provisioner-token-rlg96 kubernetes.io/service-account-token 3 20h
#查看指定secret的详细信息
kubectl describe secrets mysecret
Name: mysecret
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
xiao.txt: 4 bytes
xiaobu.txt: 4 bytes
#以base64的加密方式生成文件内部数据
echo xiaobu.txt | base64
echo xiao.txt | base64
陈述式需要指定资源创建
默认类型的加密方式:Opaque加密类型
声明式的创建方式:
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type:
Opaque
data:
xiaobu: eGlhb2J1LnR4dAo=
xiao: eGlhby50eHQK
data内保存的是加密的内容
1、 挂载方式。将secret挂载到pod当中的一个或者多个容器上的卷里面。
2、 把secret作为容器的环境变量
3、 docker-registry可以作为集群拉取镜像时使用。使用secret可以实现免密登录。
实验举例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: false
volumes:
- name: secrets
secret:
secretName: mysecret
#将创建好的mysecret加密内容和容器内的指定目录进行挂载
执行命令
kubectl apply -f sercet.yaml
进入容器
kubectl exec -it mypod bash
查看挂载目录
root@mypod:/# cd /etc/secret/
root@mypod:/etc/secret# ls
xiao.txt xiaobu.txt
root@mypod:/etc/secret# cat xiao.txt
123
root@mypod:/etc/secret# cat xiaobu.txt
456
保存内容是加密内容,容器内部可以解密直接引用。
[root@master01 opt]# echo 小布 | base64
5bCP5biDCg==
[root@master01 opt]# echo 小凯 | base64
5bCP5YevCg==
创建secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type:
Opaque
data:
xiaobu: 5bCP5biDCg==
xiaokai: 5bCP5YevCg==
创建pod
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx:1.22
env:
- name: USER
valueFrom:
secretKeyRef:
name: mysecret1
key: xiaobu
- name: USER1
valueFrom:
secretKeyRef:
name: mysecret1
key: xiaokai
#我给nginx1.22这个容器里面传两个环境变量,这两个变量的值从secret来,分别是两条mysecret1的加密信息
进入容器查看
root@mypod1:/# env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mypod1
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
USER1=小凯
NJS_VERSION=0.7.11
TERM=xterm
USER=小布
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.22.1
_=/usr/bin/env
kubectl create secret docker-registry myharbor --docker-server=20.0.0.73 --docker-username=admin --docker-password=123456
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx1
image: hub.test.com/library/nginx:v1
imagePullSecrets:
- name: myharbor
nodeName: node02
kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 83m
mypod1 1/1 Running 0 73m
mypod2 1/1 Running 0 39s
nfs-provisioner-cbbfd74c8-5tr7r 1/1 Running 0 22h
nginx1-68c5d494c9-9zwhd 1/1 Running 0 103m
nginx1-68c5d494c9-bbbds 1/1 Running 0 103m
nginx1-68c5d494c9-mg8ms 1/1 Running 0 103m
secret三种方式:
陈述式创建
声明式
引用方式:
挂载使用
设定环境变量
docker-registry
保存的是不需要加密的信息。configmap是1.2引用的功能,应用程序会配置文件,命令参数。以及环境变量中读取信息。
通过configmap在创建容器时,给他注入我们需要的配置信息。既可以是单个的属性也可也是整个文件的配置文件。
kubectl create configmap person --from-file=/opt/configmap/xiaobu.txt --from-file=/opt/configmap/xiaokai.txt
ubectl describe cm person
Name: person
Namespace: default
Labels:
Annotations:
Data
====
xiaobu.txt:
----
xiaobu=....
xiaokai=gao
xiaokai.txt:
----
xiao=bu
xiao=kai
Events:
指定文件创建,可以是一个,也可以是多个。
kubectl create configmap person1 --from-literal=xiaobu=bu --from-literal=xiaokai=kai
[root@master01 opt]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 18d
person 2 2m28s
person1 2 6s
apiVersion: v1
kind: ConfigMap
metadata:
name: person
data:
xiaobu: bu
xiaokai: kai
#configmap是键值对形式
kubectl describe cm person
Name: person
Namespace: default
Labels:
Annotations:
Data
====
xiaobu:
----
bu
xiaokai:
----
kai
Events:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.22
env:
- name: USER1
valueFrom:
configMapKeyRef:
name: person
key: xiaobu
- name: USER2
valueFrom:
configMapKeyRef:
name: person
key: xiaokai
kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 6s
nfs-provisioner-cbbfd74c8-5tr7r 1/1 Running 0 22h
进入容器查看
root@mypod:/# env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=mypod
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
USER1=bu
USER2=kai
NJS_VERSION=0.7.11
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.22.1
_=/usr/bin/env
数据卷使用comfigmap
准备一个nginx.conf的配置文件
worker_processes 2;
events {
worker_connections 1024;
}
http {
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8081;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
}
kubectl create configmap nginx-con --from-file=/opt/configmap/nginx.conf
创建yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
labels:
app: nginx1
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.22
ports:
- containerPort: 8081
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/
- name: nginx-mount
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-config
configMap:
name: nginx-con
- name: nginx-mount
hostPath:
path: /opt/html
type: DirectoryOrCreate
访问不了,出现404,可能是访问页面路径不对
修改访问路径之后
kubectl patch deployment nginx1 --patch '{"spec": {"template":{"metadata": {"annotations": {"version/config": "20240116"}}}}}'
curl 10.244.0.42:8081
123
1、 通过数据卷的形式将配置文件传给pod内的容器
2、 在pod运行的情况下对configmap的配置信息进行修改。直接生效反应到容器当中。
热更新pod不会重启。如果有pod有副本都会一并更改。
3、 configmap的热更新不会触发pod的滚动更新机制。
version/config触发滚动更新机制
kubectal patch deployment nginx1 --path '{"spec": {"template":{"metadata": {"annotations": {"version/config": "20240116"}}}}}'
通过命令触发pod滚动更新,将pod重新拉起,将修改过的configmap重新传递给pod内重新拉起的容器。
secret:主要作用是保存加密文件。使用的方式就是挂载方式。
configMap:把配置信息传递给容器。主要使用方式也是挂载。
configMap的热更新:热更新可以直接反应到容器的内部。也不会触发pod的更新机制。如果不是需要重启的配置。都可以直接生效。
可以通过version/config的方式来触发滚动更新机制
需要重启的,可以重启pod
更新:就是把配置信息重新传递到容器内。重启也是一样的。
在工作中configMap就是将配置信息传递给容器。通过键值对形式保存的非加密信息。
secret是加密的信息。
configMap是非加密信息。可以传递配置信息给容器