Kubernetes-configmap、secret配置管理

目录:

  • 一.ConfigMap简介
  • 二.创建configmap
    • 1.使用字面值创建
    • 2.文件创建
    • 使用目录创建
    • 4.编写configmap的yaml文件
  • 三.ConfigMap使用
    • 1.设置环境变量的方式
    • 2.通过在pod的命令行下运行的方式
    • 3.作为volume的方式挂载到pod内
  • 四.Secret概述
    • 1.Service Account
    • 2.Opaque Secret
  • 五.secret应用
    • 1.创建secret
    • 2.将Secret挂载到Volume中
    • 3.向指定路径映射 secret 密钥
    • 4.将Secret设置为环境变量
    • 5.docker registry

一.ConfigMap简介

Configmap用于保存配置数据,以键值对形式存储。

configMap 资源提供了向 Pod 注入配置数据的方法。

让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

典型的使用场景:

填充环境变量的值

设置容器内的命令行参数

填充卷的配置文件

二.创建configmap

创建ConfigMap的方式有4种:

使用字面值创建
使用文件创建
使用目录创建
编写configmap的yaml文件创建

1.使用字面值创建

创建cm,并查看信息!

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

kubectl  get cm

kubectl  describe  cm my-config 

Kubernetes-configmap、secret配置管理_第1张图片

Kubernetes-configmap、secret配置管理_第2张图片

2.文件创建

kubectl create configmap my-config-2 --from-file=/etc/resolv.conf

kubectl  get cm
NAME               DATA   AGE
kube-root-ca.crt   1      5d18h
my-config          2      98s
my-config-2        1      13s

kubectl  describe  cm my-config-2 

请添加图片描述

Kubernetes-configmap、secret配置管理_第3张图片

使用目录创建

创建测试目录

mkdir configmap
cd configmap/
ls
mkdir test
cp /etc/passwd test/
cp /etc/fstab test/
ls test/

kubectl create configmap my-config-3 --from-file=test
kubectl get cm
kubectl describe cm my-config-3

请添加图片描述

Kubernetes-configmap、secret配置管理_第4张图片

Kubernetes-configmap、secret配置管理_第5张图片

4.编写configmap的yaml文件

vim cm1.yml 

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.0.250"
  db_port: "3306"

Kubernetes-configmap、secret配置管理_第6张图片

kubectl  apply -f  cm1.yml 
kubectl  get cm
kubectl  describe  cm cm1-config 

Kubernetes-configmap、secret配置管理_第7张图片

Kubernetes-configmap、secret配置管理_第8张图片

三.ConfigMap使用

如何使用configmap:

通过环境变量的方式直接传递给pod

通过在pod的命令行下运行的方式

作为volume的方式挂载到pod内

1.设置环境变量的方式

cd configmap/
vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: key1
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

Kubernetes-configmap、secret配置管理_第9张图片

执行pod.yaml文件,查看pod
查看pod的信息之后可以删掉pod1

kubectl apply -f pod.yaml

kubectl get pod

我们可以看到创建节点完成之后就自动退出了!
Kubernetes-configmap、secret配置管理_第10张图片

容器执行已完成,需要在pod日志中查看结果

kubectl logs pod1

Kubernetes-configmap、secret配置管理_第11张图片

使用默认名称

vim pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

Kubernetes-configmap、secret配置管理_第12张图片

执行文件pod2.yml ,并查看

kubectl apply -f pod2.yaml
kubectl describe cm cm1-config

Kubernetes-configmap、secret配置管理_第13张图片

2.通过在pod的命令行下运行的方式

vim pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod2
      image: nginx
      #command: ["/bin/sh", "-c", "cat /config/db_host"]
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      configMap:
        name: cm1-config

Kubernetes-configmap、secret配置管理_第14张图片

执行pod3.yml 文件:

kubectl  apply  -f pod3.yml 
kubectl get pod
kubectl  logs  pod2

请添加图片描述

Kubernetes-configmap、secret配置管理_第15张图片

将command和重启注释掉!

 #command: ["/bin/sh", "-c", "cat /config/db_host"]
  #restartPolicy: Never

Kubernetes-configmap、secret配置管理_第16张图片

再次执行pod3.yaml

kubectl apply -f pod3.yaml
kubectl describe cm cm1-config

Kubernetes-configmap、secret配置管理_第17张图片

将前面实验的cm删掉:

kubectl get cm
kubectl delete cm my-config
kubectl delete cm my-config-2
kubectl delete cm my-config-3
kubectl get cm

Kubernetes-configmap、secret配置管理_第18张图片

3.作为volume的方式挂载到pod内

先写入nginx的配置文件nginx.conf,然后创建cm!

vim nginx.conf
*********************************************
server {
    listen       80;
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}


**********************************************
kubectl create configmap nginxconf --from-file=nginx.conf
kubectl  get cm

请添加图片描述

Kubernetes-configmap、secret配置管理_第19张图片

查看nginxconf的信息:

kubectl describe cm nginxconf

Kubernetes-configmap、secret配置管理_第20张图片

编写清单nginx.yaml

vim nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
          - name: config-volume
            mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginxconf

Kubernetes-configmap、secret配置管理_第21张图片

编辑nginxconf的内容:修改端口为8080

kubectl edit cm nginxconf

listen	       8080;

请添加图片描述

Kubernetes-configmap、secret配置管理_第22张图片
执行清单nginx.yaml
查看pod信息:

kubectl apply -f nginx.yaml
kubectl get pod
kubectl get pod -o wide

Kubernetes-configmap、secret配置管理_第23张图片

访问这个IP地址:

curl 10.244.141.225:8080

Kubernetes-configmap、secret配置管理_第24张图片

再次修改端口为8000

kubectl edit cm nginxconf

listen       8000;

Kubernetes-configmap、secret配置管理_第25张图片

访问8000端口不成功!

curl 10.244.141.225:8000

会显示连接拒绝!
请添加图片描述

但是容器里面的配置文件已经修改了:
Kubernetes-configmap、secret配置管理_第26张图片

为什么不能访问8000端口呢?
因为没有刷新副本!

 kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200219"}}}}}'

请添加图片描述

通过副本age查看是否刷新

kubectl get deployments.apps

请添加图片描述

如果访问curl 10.244.141.225:8000还会失败,因为已经生成了新的IP地址:

kubectl get pod -o wide
curl *********:8000

请添加图片描述

Kubernetes-configmap、secret配置管理_第27张图片

四.Secret概述

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。

敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

Pod 可以用两种方式使用 secret:

作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。

当 kubelet 为 pod 拉取镜像时使用。

Secret的类型:

Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。

Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。

kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。

1.Service Account

serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

kubectl  run nginx --image=nginx
kubectl  exec -it   nginx  -- bash

root@nginx:/# cd /var/run/secrets/kubernetes.io/serviceaccount/

root@nginx:/var/run/secrets/kubernetes.io/serviceaccount# ls
ca.crt	namespace  token

查看secrets命令

kubectl get secrets

请添加图片描述

查看secrets的信息:

kubectl describe default-token-lzvzs

Kubernetes-configmap、secret配置管理_第28张图片

我们再来pod的信息,可以发现,也有ca.crt的密钥:

kubectl get pod
kubectl describe my-nginx-6b6*************
kubectl describe cm kube-root-ca.crt

请添加图片描述

Kubernetes-configmap、secret配置管理_第29张图片

2.Opaque Secret

Opaque Secret 其value为base64编码后的值。
从文件中创建Secret

echo -n 'admin' > ./username.txt
echo -n 'westos' > ./password.txt

 kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created

kubectl get secrets

Kubernetes-configmap、secret配置管理_第30张图片

查看db-user-pass的信息:

kubectl describe secrets db-user-pass

Kubernetes-configmap、secret配置管理_第31张图片
默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以通过以下方式查看

查看yaml格式的secret ,可以看到base64格式的认证信息

kubectl get secrets db-user-pass -o yaml

Kubernetes-configmap、secret配置管理_第32张图片

我们还可以通过这个方式来查看base64方式加密的明文

echo YWRtaW4= | base64 -d

请添加图片描述

五.secret应用

1.创建secret

echo -n 'admin' | base64
YWRtaW4=
echo -n 'westos' | base64
d2VzdG9z

vim secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z

Kubernetes-configmap、secret配置管理_第33张图片

执行文件secret.yaml,并查看secret

kubectl apply -f secret.yaml
kubectl get secret
kubectl describe secrets mysecret

Kubernetes-configmap、secret配置管理_第34张图片

Kubernetes-configmap、secret配置管理_第35张图片

2.将Secret挂载到Volume中

在secret.yaml后面添加内容!

vim secret.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret

Kubernetes-configmap、secret配置管理_第36张图片

执行secret.yaml文件,查看pod

kubectl apply -f secret.yaml
kubectl get pod

Kubernetes-configmap、secret配置管理_第37张图片

进入容器mysecret 中查看:

kubectl exec -it  mysecret -- bash
pwd
cd secret/
ls

可以看到,文件挂载在根目录下的/secret/中
Kubernetes-configmap、secret配置管理_第38张图片

3.向指定路径映射 secret 密钥

指定路径/secret/my-group/my-username

vim secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

Kubernetes-configmap、secret配置管理_第39张图片

再次执行secret.yaml文件!

kubectl apply -f secret.yaml

请添加图片描述

进入节点终端查看

kubectl exec -it  mysecret -- bash

cd /secret/
cd my-group
ls
cat my-username

Kubernetes-configmap、secret配置管理_第40张图片

4.将Secret设置为环境变量

vim secret.yaml

vim secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-env
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

Kubernetes-configmap、secret配置管理_第41张图片

执行secret.yaml文件!
更改mysecret中的密码!

kubectl apply -f secret.yaml

echo redhat | base64
kubectl edit secrets mysecret

请添加图片描述

env 查看环境变量中是否有认证文件信息

kubectl exec -it  secret-env -- bash
env

Kubernetes-configmap、secret配置管理_第42张图片

注意:环境变量读取Secret很方便,但无法支撑Secret动态更新,即修改yaml文件后,容器内无法及时更改。
所以:所以刚更改的密码,没有动态更改!

5.docker registry

kubernetes.io/dockerconfigjson用于存储docker registry的认证信息。

kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos [email protected]

kubectl get secrets

Kubernetes-configmap、secret配置管理_第43张图片

编写资源清单,拉取私密仓库中的镜像

vim registry.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: game2048
      image: reg.westos.org/westos/game2048
  imagePullSecrets:
    - name: myregistrykey

Kubernetes-configmap、secret配置管理_第44张图片

执行registry.yaml文件。

kubectl apply -f registry.yaml
kubectl get sa
kubectl describe sa

Kubernetes-configmap、secret配置管理_第45张图片

你可能感兴趣的:(自动化运维企业实战,k8s,linux,docker)