Kubernetes的存储部分
复习
写到这里突然想复习一下之前的内容,我脑子笨学好几个月了还每整明白,不过我很勤奋啊哈哈哈!!!!
- 首先是虚拟化的起源,K8s的出处,可以实现的功能,组件,还有就是组件的作用。
- 然后就是安装,我这里有两种安装方式:一种是Kubeadm安装;还有就是比较麻烦的二进制安装啦(我这里的安装流程补上了哟,欢迎观看并提出使用意见),两种安装方式的不同之处
- Kubectl是让我们管理员和kubernetes集群很好的交互方式,要牢记命令,不然就得经常-h咯
- K8s的配置文件是声明式的,而yaml文件文件就是我们的配置文件,也是我们管理员很好的备份方式。kubectl explain可以帮到你很多
- Pod是K8s集群里最小的单元,也是最直接的资源管理的对象。Pod的底层是docker,是一组容器的集合。Pod可以共享网络,共享存储。可以设置镜像拉取策略(imagePullPolicy)、资源限制(resource)、重启机制(restartPolicy)、节点健康检查(livenessProbe,readinessProbe)、影响Pod调度的属性:节点选择器标签(nodeSelector)、亲和性(nodeAffinity)、污点(taint)和容忍(tolerations)
- Controller(控制器),集群上管理和运行容器的对象。股管理有状态应用的控制器statefulset、用来部署守护进程的daemonset、管理无状态应用且长期伺服型控制器deployment、一次性任务job、周期性任务cronjob。
- Service 可以帮助我们实服务发现和负载均衡,主要是通过label实现。Service常用的类型主要有四种:ClusterIP、NodePort、LoadBalancer、ExternalName。
简介
ConfigMap功能在kubernetes1.2版本中引入,许多应用会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制。ConfigMap是用来存储配置文件的kubernetes资源对象,可以被用来保存单个属性,也可以用来保存整个配置文件或者Json二进制等对象,所有的配置内容都会存储在etcd中。
创建ConfigMap
创建ConfigMap的方式有4种:
- 通过直接在命令行指定configmap参数创建,即–from-literal
- 通过指定文件创建,即将一个配置文件创建为一个ConfigMap --from-file=<文件>
- 通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,–from-file=<目录>
- 事先写好标准的configmap的yaml文件,通过kubectl create -f创建
通过命令行参数–from-literal创建
创建命令:
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
获取yaml文件
kubectl get configmap special-config -o yaml
通过文件创建
vim info
name=zhangsan
age=22
space=hz
job=computer
创建命令(可以有多个–from-file)
kubectl create configmap test-config --from-file=./info
查看内容
kubectl get configmap test-config -o yaml
可以看到指定文件创建时configmap会创建一个key/value对,key时文件名,value时文件内容。
configmap的key为默认的文件名,还可以通过以下方法将configmap的key自定义修改
kubectl create configmap test1-config --from-file=KEYNAME=FILENAME
通过目录创建
mkdir config
echo ”1111“ > config/a.config
echo "2222" > config/b.config
kubectl create configmap dir-config --from-file=./config
查看内容
kubectl get configmap dir-config -o yaml
可以看到指定目录创建时configmap内容中的各个文件会创建一个key/value对,key是文件名,value是文件内容。
这里有个问题就是如果config是个三级目录呢?
答案就是–from-file指定目录是指挥识别其中的文件,忽略子目录。
通过yaml文件创建
yaml文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
namespace: default
data:
special.how: very
special.type: charm
my.cnf: |
app=nginx
name=nginx
web=nginx
创建命令(也可以用create)
kubectl apply -f config.yaml
查看内容
kubectl get configmap yaml-config -o yaml
这里需要重点注意以下一个key的value有多行是的写法,要用”|”
使用ConfigMap
使用ConfigMap有三种方式:
- 通过环境变量的方式,直接传递给Pod
- 使用configmap中指定的key
- 使用configmap中所有的key
- 通过在Pod中的命令下运行的方式(启动命令中)
- 作为volume的方式挂在到Pod内
通过环境变量使用
1通过valueFrom、configMapKeyRef、name、key指定要的key:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
namespace: default
data:
special.how: very
special.type: charm
my.cnf: |
app=nginx
name=nginx
web=nginx
---
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: test
image: busybox
command: [ "/bin/sh", "-c", "env"]
env:
- name: LEVEL_KEY
valueFrom:
configMapKeyRef:
name: yaml-config
key: special.how
- name: log_LEVEL
valueFrom:
configMapKeyRef:
name: yaml-config
key: special.type
restartPolicy: Never
kubectl apply -f config.yaml
查看pod日志
kubectl logs config-pod
2 通过envFrom、configMapRef、name使得configmap中所有的key/value对都自动变成环境变量:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
namespace: default
data:
special.how: very
special.type: charm
my.cnf: |
app=nginx
name=nginx
web=nginx
---
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: test
image: busybox
command: [ "/bin/sh", "-c", "env"]
envFrom:
- configMapRef:
name: yaml-config
restartPolicy: Never
然后创建
kubectl apply -f config.yaml
查看pod日志
kubectl logs config-pod
在启动命令中引用
在命令引用时,先设置为环境变量,之后通过$(VAR_NAME)设置容器启动命令的启动参数:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
namespace: default
data:
special.how: very
special.type: charm
my.cnf: |
app=nginx
name=nginx
web=nginx
---
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: test
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL_KEY) $(log_LEVEL)" ]
env:
- name: LEVEL_KEY
valueFrom:
configMapKeyRef:
name: yaml-config
key: special.how
- name: log_LEVEL
valueFrom:
configMapKeyRef:
name: yaml-config
key: special.type
restartPolicy: Never
然后创建
kubectl apply -f config.yaml
查看pod日志
kubectl logs config-pod
作为volume挂在使用
把yaml-config所有的key/value挂载进来:
apiVersion: v1
kind: ConfigMap
metadata:
name: yaml-config
namespace: default
data:
special.how: very
special.type: charm
my.cnf: |
app=nginx
name=nginx
web=nginx
---
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: test
image: nginx
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: yaml-config
restartPolicy: Never
然后创建
kubectl apply -f config.yaml
查看pod日志
kubectl logs config-pod
可以看到,在/etc/config下以每个key为文件名,value为内容创建了多个文件
假如不想以key名最为配置文件名,可以阴阳items字段,在其中要用下能对路径path替换掉:
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: test
image: nginx
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: yaml-config
items:
- key: my.cnf
path: a.config
- key: special.type
path: b.config
restartPolicy: Never
应用yaml文件,进入pod中,查看vloumePath
kuebctl apply -f config.yaml
kuebctl exec -it config-pod -- /bin/bash
ls /etc/config
注意**:
- 删除configmap后原来的pod不受影响,然后再删除pod后,重启pod会报错:找不到configmap的volume
- pod起来后通过kubectl edit configmap … 修改configmap,过一会pod的内部的配置文件也会刷新
configmap热更新
先做一个deploment:
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: my-nginx
replicas: 1
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
应用yaml文件,并查看内容
kubectl apply -f hot.yaml
kubectl exec -it `kubectl get pod -o name | cut -d "/" -f 2 |awk "NR==1{print}"` -- cat /etc/config/log_level
修改configmap的value,在此查看pod里的内容
kubectl edit configmap log-config
kubectl exec -it `kubectl get pod -o name | cut -d "/" -f 2 |awk "NR==1{print}"` -- cat /etc/config/log_level
注意
特别注意configMap如果以ENV的方式挂载至容器,修改configMap并不会实现热更新
更新configMap后:
- 使用该configMap挂在的ENV不会同步更新
- 使用该configMap挂载的Volume中的数据需要一段时间才能同步更新
ENV是在容器启动的时候注入的,启动之后kubernetes就不会再改变环境变量的值,且同一个namespace中的Pod的环境变量是不断累加的,参考kubernetes中的服务发现与docker容器间的环境变量传递源码探究。为了更新容器中使用ConfigMap挂载的配置,可以通滚动更新Pod方式来强制重启挂载ConfigMap,也可以在更新ConfigMap后先将副本数设置为0,然后在扩容。
先这样,想到其他的后续再补充!!!!