Configmap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法。
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
典型的使用场景:
填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件
使用字面值指定创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
kubectl get cm
kubectl describe cm my-config
使用文件创建
kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
kubectl get cm
kubectl describe cm my-config-2
使用目录创建
创建测试目录
mkdir configmap
cd configmap/
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
编写yaml文件创建
vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
cat cm1.yaml
kubectl apply -f cm1.yaml
kubectl get cm
1.通过环境变量的方式直接传递给pod
2.通过在pod的命令行下运行的方式
3.作为volume的方式挂载到pod内
通过环境变量的方式直接传递给pod
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
拉起资源清单,创建节点
kubectl apply -f pod.yaml
kubectl get pod
容器执行已完成,需要在pod日志中查看结果
kubectl logs pod1
通过在pod的命令行下运行的方式
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
拉起资源清单,创建pod2节点
kubectl apply -f pod2.yaml
kubectl get pod
查看节点输出结果
kubectl logs pod2
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busybox
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
kubectl apply -f pod3.yaml
kubectl get pod
kubectl logs pod3
信息来源cm1-config
kubectl describe cm cm1-config
更新
更新nginx的配置文件,修改端口为8080
vim nginx.conf
cat nginx.conf
server {
listen 8080;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
通过文件创建cm
kubectl create configmap nginxconf --from-file=nginx.conf
kubectl get cm
kubectl describe cm nginxconf
编写清单挂载覆盖nginx配置文件
vim nginx.yaml
cat 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
kubectl apply -f nginx.yaml
查看分配端口并访问
kubectl get pod -o wide
curl 10.244.141.214:8080
修改端口为8000
kubectl edit cm nginxconf
apiVersion: v1
data:
nginx.conf: |
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
访问,发现未更改
curl 10.244.141.214
curl 10.244.141.214:8000
刷新副本
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200219"}}}}}'
通过副本age查看是否刷新
kubectl get deployments.apps
查看重新分配的IP,访问8000,更新已生效。
kubectl get pod -o wide
curl 10.244.141.215:8000
敏感信息放在 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的认证信息。
查看secrets命令
kubectl get secrets
从文件创建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
kubectl get secrets
查看认证信息
kubectl describe secrets db-user-pass
默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以通过以下方式查看
查看yaml格式的secret ,可以看到base64格式的认证信息
kubectl get secrets db-user-pass -o yaml
查看base64方式加密的明文
echo d2VzdG9z | base64 -d
编写一个secret对象
vim secret.yaml
cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
kubectl apply -f secret.yaml
将Secret挂载到Volume中
vim secret.yaml
cat 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
拉起容器,查看pod节点
kubectl apply -f secret.yaml
kubectl get pod
进入mysecret pod节点查看
kubectl exec -it mysecret -- bash
可以看到,文件挂载在根目录下的/secret/中
向指定路径映射 secret 密钥
vim secret.yaml
tail -n 20 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
kubectl apply -f secret.yaml
进入节点终端查看
kubectl exec -it mysecret -- bash
可以看到,文件挂载在指定路径my-group/my-username下
将Secret设置为环境变量
vim secret.yaml
tail -20 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
kubectl apply -f secret.yaml
kubectl get pod
kubectl exec -it secret-env -- bash
env
注意:环境变量读取Secret很方便,但无法支撑Secret动态更新,即修改yaml文件后,容器内无法及时更改。
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息。
创建secret的格式为docker-registry
kubectl create secret docker-registry myregistrykey --docker-server=hyl.westos.org --docker-username=admin --docker-password=westos --docker-email=yakexi007@westos.org
kubectl get secrets
编写资源清单,拉取私密仓库中的镜像
vim registry.yaml
cat registry.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: hyl.westos.org/westos/game2048
imagePullSecrets:
- name: myregistrykey
拉起清单
kubectl apply -f registry.yaml
kubectl get pod
查看pod节点详细信息,可以看到已成功拉取
kubectl describe pod mypod
Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。
emptyDir卷:当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
emptyDir卷创建
mkdir volumes
cd volumes/
ls
vim vol1.yaml
cat vol1.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol1
spec:
containers:
- image: busyboxplus
name: vm1
command: ["sleep", "300"]
volumeMounts:
- mountPath: /cache
name: cache-volume
- name: vm2
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
medium: Memory
sizeLimit: 100Mi
kubectl apply -f vol1.yaml
kubectl get pod -o wide
# 访问节点,报错403
curl 10.244.141.222
进入容器,创建默认发布文件
kubectl exec -it vol1 -- sh
再次访问,成功
curl 10.244.141.222
创建大于设定100M大小的文件,节点会坏掉
kubectl exec -it vol1 -- sh
kubectl get pod
kubectl get pod vol1
hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。注意:此处主机为分配的node节点主机,而不是k8smaster主机。
vim host.yaml
cat host.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: DirectoryOrCreate
kubectl apply -f host.yaml
kubectl get pod -o wide
进入容器,测试挂载是否成功
kubectl exec -it test-pd -- sh
在容器挂载目录中创建一个文件,受控node主机的相应目录也会自动生成相应文件。
共享文件系统nfs使用,首先在所有结点上安装nfs,在仓库结点上配置nfs
server1仓库节点:
yum install -y nfs-utils
vim /etc/exports
systemctl start nfs
showmount -e
server2中:
vim nfs.yaml
cat nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
nfs:
server: 172.25.9.1
path: /mnt/nfs
验证nfs配置是否有误
showmount -e 172.25.9.1
kubectl apply -f nfs.yaml
kubectl get pod -o wide
server1:
等待nfs.yaml 拉起后,测试是否同步
cd /mnt/nfs
echo www.westos.org > index.html
进入容器,测试挂载是否成功
kubectl exec -it test-pd -- sh
PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。
PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。
有两种PV提供的方式:静态和动态。
静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。
动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass。
PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。
创建NFS 静态PV卷
vim pv.yaml
cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /mnt/nfs
server: 172.25.9.1
拉起容器
kubectl apply -f pv.yaml
查看PV
kubectl get pv
创建PVC
vim pvc.yaml
cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
storageClassName: nfs
accessModes:
- ReadWriteOnce #ReadWriteMany 多点读写
resources:
requests:
storage: 1Gi
拉起pvc容器,查看pvc和pv相关信息
kubectl apply -f pvc.yaml
kubectl get pvc
kubectl get pv
Pod挂载PV
vim pod.yaml
cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: pv1
volumes:
- name: pv1
persistentVolumeClaim:
claimName: pvc1
kubectl apply -f pod.yaml
kubectl get pod
进入容器终端测试挂载是否成功
kubectl exec -it test-pd -- bash
测试访问
kubectl get pod -o wide
curl 10.244.141.225
删除顺序:pod,pvc,pv