目录

一.Secret

1.secret介绍

2.secret的类型

3.创建secret

 4.使用secret

环境变量的形式

 volume数据卷挂载

二ConfigMap

1.创建ConfigMap的方式

 2.使用ConfigMap

2.1作为volume挂载使用

2.2.作为环境变量

 三.Downward API

 1.以环境变量的方式实现

2.Volume挂载

一.Secret

1.secret介绍

secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。 用户可以创建自己的secret,系统也会有自己的secret。 Pod需要先引用才能使用某个secret; pod使用secret方式主要是作为volume的一个域被一个或多个容器挂载。

2.secret的类型

內建的Secret:

由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信。

创建自己的Secret:

方式1:使用kubectl create secret命令 方式2:yaml文件创建Secret

3.创建secret

创建pod要访问数据库需要用户名密码,现在我们分别设置这个用户名和密码 Secret 对象要求这些数据必须是经过 Base64 转码。

echo -n "123456" | base64

MTIzNDU2

echo -n "test" | base64

dGVzdA==

手动base64解码方式:

[root@kube-master echo dGVzdA== | base64 --decode #或者 -d

test[root@kube-master ~]#

创建

[root@kube-master ~]# vim secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: mysecret

type: Opaque

data:

password: MDAxMTIy

database: dGVzdA==

## kubectl apply -f secret.yml

[root@kube-master ~]# kubectl get secret

NAME TYPE DATA AGE

default-token-j48pd kubernetes.io/service-account-token 3 3d3h

mysecret Opaque 2 6h

 4.使用secret

secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。

每一个被引用的Secret都要在spec.volumes中定义  如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。

环境变量的形式

env: 定义环境变量

- name: MYSQL_ROOT_PASSWORD #创建新的环境变量名称

valueFrom:

secretKeyRef: #调用的key是什么

name: mysecret #变量的值来自于mysecret

key: password #username里面的值

- name: MYSQL_DATABASE

valueFrom:

secretKeyRef:

name: mysecret

key: database

 volume数据卷挂载

volumeMounts: #挂载一个卷

- name: ljh #这个名字需要与定义的卷的名字一致

mountPath: "/opt/aaa" #挂载到容器里哪个目录下

readOnly: true

volumes: #数据卷的定义

- name: ljh #卷的名字这个名字自定义

secret: #卷是直接使用的secret。

secretName: mysecret

items:

- key: password #将那个key重新定义到那个目录下

path: aren #相对路径,相对于/opt/aaa的路径

映射secret key到指定的路径     和    以环境变量的形式使用Secret

[root@kube-master kubernetes]# vim mysql.yaml

apiVersion: v1

kind: Secret

metadata:

name: mysecret

type: Opaque

data:

password: MDAxMTIy

database: dGVzdA==

---

apiVersion: v1

kind: Pod

metadata:

name: mysql

labels:

name: mysql

spec:

containers:

- name: mysql

image: 10.36.192.206:8088/library/mysql:5.7

resources:

limits:

memory: "512Mi"

cpu: "1000m"

ports:

- containerPort: 3306

env: 定义环境变量

- name: MYSQL_ROOT_PASSWORD #创建新的环境变量名称

valueFrom:

secretKeyRef: #调用的key是什么

name: mysecret #变量的值来自于mysecret

key: password #username里面的值

- name: MYSQL_DATABASE

valueFrom:

secretKeyRef:

name: mysecret

key: database

volumeMounts: #挂载一个卷

- name: ljh #这个名字需要与定义的卷的名字一致

mountPath: "/opt/aaa" #挂载到容器里哪个目录下

readOnly: true

volumes: #数据卷的定义

- name: ljh #卷的名字这个名字自定义

secret: #卷是直接使用的secret。

secretName: mysecret

items:

- key: password #将那个key重新定义到那个目录下

path: aren #相对路径,相对于/opt/aaa的路径

创建并查看

[root@kube-master kubernetes]# kubectl apply -f mysql.yaml

4.1 从volume中读取secret的值

[root@kube-master kubernetes]# kubectl exec -it -n default mysql -c mysql /bin/bash

bash-4.2# cat /opt/aaa/aren

001122bash-4.2#

 4.2 打印一下定义的变量

bash-4.2# echo $MYSQL_DATABASE

test

4.3 被挂载的secret内容自动更新

也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。

将password修改为123456 容器中挂在的数据也会改变。

bash-4.2# cat /opt/aaa/aren

123456bash-4.2#

二ConfigMap

1.创建ConfigMap的方式

创建ConfigMap的方式有4种:

命令行方式 方式1:通过直接在命令行中指定configmap参数创建,即--from-literal 方式2:通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=<文件> 方式3:通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录> 配置文件方式 方式4:事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

1.1 通过命令行参数创建

kubectl create configmap test-configmap --from-literal=user=root

#结果如下面的data内容所示

[root@kube-master kubernetes]# kubectl get configmap test-configmap -o yaml

apiVersion: v1

data:

user: root

kind: ConfigMap

metadata:

creationTimestamp: "2023-12-14T09:24:55Z"

name: test-configmap

namespace: default

resourceVersion: "144400"

uid: f1f3cd45-1880-444c-b30a-49a3f5345a2c

1.2.通过指定文件创建

kubectl create configmap test-yaml --from-file=/etc

##结果如下面data内容所示

[root@kube-master kubernetes]# kubectl get configmap etc -o yaml

apiVersion: v1

data:

passwd: |

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

chrony:x:998:996::/var/lib/chrony:/sbin/nologin

aren:x:1000:1000:aren:/home/aren:/bin/bash

nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

kind: ConfigMap

metadata:

creationTimestamp: "2023-12-14T09:31:29Z"

name: etc

namespace: default

resourceVersion: "144961"

uid: 0243ada4-ee7a-4ef5-a6d9-3a1fdc88b6db

1.3通过yaml文件创建

[root@kube-master kubernetes]# vim configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: nginx-config

data:

nginx.level: 1.20.2

nginx.info:

nginx配置文件

nginx.conf: |

# For more information on configuration, see:

# * Official English Documentation: http://nginx.org/en/docs/

# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.

include /usr/share/nginx/modules/*.conf;

events {

worker_connections 1024;

}

http {

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;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

types_hash_max_size 4096;

include /etc/nginx/mime.types;

default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.

# See http://nginx.org/en/docs/ngx_core_module.html#include

# for more information.

include /etc/nginx/conf.d/*.conf;

server {

listen 88;

server_name _;

root /usr/share/nginx/html;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;

location = /404.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

# Settings for a TLS enabled server.

#

# server {

# listen 443 ssl http2;

# listen [::]:443 ssl http2;

# server_name _;

# root /usr/share/nginx/html;

#

# ssl_certificate "/etc/pki/nginx/server.crt";

# ssl_certificate_key "/etc/pki/nginx/private/server.key";

# ssl_session_cache shared:SSL:1m;

# ssl_session_timeout 10m;

# ssl_ciphers HIGH:!aNULL:!MD5;

# ssl_prefer_server_ciphers on;

#

# # Load configuration files for the default server block.

# include /etc/nginx/default.d/*.conf;

#

# error_page 404 /404.html;

# location = /40x.html {

# }

#

# error_page 500 502 503 504 /50x.html;

# location = /50x.html {

# }

# }

}

创建

[root@kube-master kubernetes]# kubectl apply -f configmap.yaml

#查看

[root@kube-master kubernetes]# kubectl get configmap nginx-config -o yaml

 可视化界面查看:

 2.使用ConfigMap

使用ConfigMap的方式,一种是通过环境变量的方式,直接传递pod,另一种是使用volume的方式挂载入到pod内。

2.1作为volume挂载使用

[root@kube-master kubernetes]# vim test-config.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx

labels:

name: nginx

spec:

containers:

- name: nginx

image: 10.36.192.206:8088/library/nginx:1.20.2

ports:

- containerPort: 80

volumeMounts:

- name: nginx ##挂载的名称

mountPath: /etc/nginx/nginx.conf #挂载路径

subPath: nginx.conf #这个文件不会覆盖其他文件,只代替原有的nginx.conf

volumes:

- name: nginx #挂载的名称(与volumeMounts一样)

configMap:

name: nginx-config #定义的configmap的名字

#启动

## kubectl apply -f test-config.yaml

 进入容器访问可以返回信息

2.2.作为环境变量

(1) 使用valueFrom、configMapKeyRef、name、key指定要用的key:

[root@kube-master kubernetes]# vim test-config.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx

labels:

name: nginx

spec:

containers:

- name: nginx

image: 10.36.192.206:8088/library/nginx:1.20.2

ports:

- containerPort: 80

env: #专门在容器里面设置变量的关键字

- name: NGINX_LEVEL #这里的-name,是容器里设置的新变量的名字

valueFrom:

configMapKeyRef:

name: nginx-config #这里是来源于哪个configMap

key: nginx.level #configMap里的key

## kubectl apply -f test-config.yaml

 (2) 通过envFrom、configMapRef、name使得configmap中的所有key/value对 都自动变成环境变量:(configmap中定义的数据都会自动变成环境变量)

envFrom:

- configMapRef:

name: nginx-config

进入容器查看环境变量生效

 三.Downward API

Downward API

用于在容器中获取 POD 的基本信息,kubernetes原生支持。

Downward API提供了两种方式用于将 POD 的信息注入到容器内部: 1.环境变量:用于单个变量,可以将 POD 信息直接注入容器内部。 2.Volume挂载:将 POD 信息生成为文件,直接挂载到容器内部中去。

 1.以环境变量的方式实现

通过Downward API来将 POD 的 IP、名称以及所对应的 namespace 注入到容器的环境变量中去,然后在容器中打印全部的环境变量。

使用fieldRef获取 POD 的基本信息

[root@kube-master kubernetes]# vim downword.yaml

apiVersion: v1

kind: Pod

metadata:

name: test-downward

labels:

name: test-downward

spec:

containers:

- name: test-downward

image: 10.36.192.206:8088/library/nginx:1.20.2

resources:

limits:

memory: "128Mi"

cpu: "500m"

ports:

- containerPort: 80

env:

- name: POD_NAME #第一个环境变量的名字

valueFrom: #使用valueFrom方式设置

fieldRef: #关联一个字段metadata.name

fieldPath: metadata.name #这个字段从当前运行的pod详细信息查看

- name: POD_NAMESPACE

valueFrom:

fieldRef:

fieldPath: metadata.namespace

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

注意: POD 的 name 和 namespace 属于元数据,是在 POD 创建之前就已经定下来了的,所以使用 metadata 获取就可以了,但是对于 POD 的 IP 则不一样,因为POD IP 是不固定的,POD 重建了就变了,它属于状态数据,所以使用 status 去获取。

 创建pod

# kubectl create -f downword.yaml

pod/test-downward created

创建成功后进入容器查看环境变量

[root@kube-master ~]# kubectl exec -it test-downward /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

root@test-downward:/# env | grep POD

POD_NAME=test-downward

POD_NAMESPACE=default

POD_IP=10.244.233.251

2.Volume挂载

通过Downward API将 POD 的 Label、等信息通过 Volume 以文件的形式挂载到容器的某个文件中去,然后在容器中打印出该文件的值来验证。

apiVersion: v1

kind: Pod

metadata:

name: test-downward

labels:

name: test-downward

spec:

containers:

- name: test-downward

image: 10.36.192.206:8088/library/nginx:1.20.2

resources:

limits:

memory: "128Mi"

cpu: "500m"

ports:

- containerPort: 80

volumeMounts:

- name: podinfo

mountPath: /opt/podinfo

volumes:

- name: podinfo

downwardAPI:

items:

- path: labels

fieldRef:

fieldPath: metadata.labels

创建pod

# kubectl create -f downword.yaml

pod/test-downward created

进入容器查看数据已经挂在进来。

[root@kube-master ~]# kubectl exec -it test-downward /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

root@test-downward:/# cat /opt/podinfo/labels

name="test-downward"root@test-downward:/#

1. 使用 fieldRef 可以声明使用: spec.nodeName - 宿主机名字 status.hostIP - 宿主机 IP metadata.name - Pod 的名字 metadata.namespace - Pod 的 Namespace status.podIP - Pod 的 IP spec.serviceAccountName - Pod 的 Service Account 的名字 metadata.uid - Pod 的 UID metadata.labels[''] - 指定 的 Label 值 metadata.annotations[''] - 指定 的 Annotation 值 metadata.labels - Pod 的所有 Label metadata.annotations - Pod 的所有 Annotation

基本信息使用 下面方式查看需要什么数据在里面截取。

# kubectl get pod nginx -o yaml

apiVersion: v1

kind: Pod

metadata:

annotations:

cni.projectcalico.org/containerID: 079e38db69022ad5436d47df8ffa99f0f624e75a17cf5eb7215ce52253c270b5

cni.projectcalico.org/podIP: 10.244.9.118/32

cni.projectcalico.org/podIPs: 10.244.9.118/32

kubectl.kubernetes.io/last-applied-configuration: |

{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"name":"mysql"},"name":"mysql","namespace":"default"},"spec":{"containers":[{"env":[{"name":"MYSQL_ROOT_PASSWORD","valueFrom":{"secretKeyRef":{"key":"password","name":"mysecret"}}},{"name":"MYSQL_DATABASE","valueFrom":{"secretKeyRef":{"key":"database","name":"mysecret"}}}],"image":"10.36.192.206:8088/library/mysql:5.7","name":"mysql","ports":[{"containerPort":3306}],"resources":{"limits":{"cpu":"1000m","memory":"512Mi"}},"volumeMounts":[{"mountPath":"/opt/aaa","name":"ljh","readOnly":true}]}],"volumes":[{"name":"ljh","secret":{"items":[{"key":"password","path":"aren"}],"secretName":"mysecret"}}]}}

creationTimestamp: "2023-12-15T12:24:55Z"

labels:

name: mysql

name: mysql

namespace: default

resourceVersion: "213151"

uid: 34802837-648b-41f0-a77a-d59e784ee403

spec:

containers:

- env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

.........

.........

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。