k8s的配置资源管理

Secret

Secret用来保存密码、token密钥以及一些敏感的k8s资源。这类数据虽然可以存放在镜像当中,但是放在secret当中可以更方便控制。减少暴露的风险。

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

如何创建secret?

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内保存的是加密的内容

pod如何来引用Secret?

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

保存内容是加密内容,容器内部可以解密直接引用。

把secret作为容器的环境变量

[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

docker-registry

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

保存的是不需要加密的信息。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的区别

secret是加密的信息。

configMap是非加密信息。可以传递配置信息给容器

你可能感兴趣的:(kubernetes,容器,云原生)