配置管理
Secret讲解
k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了
Secret有三种类型
Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息。
- Opaque类型
Opaque 类型的数据是一个 map 类型,要求value是base64编码。
手动创建base64加密 ```yaml 加密 echo -n ‘admin’ | base64 YWRtaW4= $ echo -n ‘123456’ | base64 MTIzNDU2
解密 echo ‘MTIzNDU2’ | base64 —decode 123456
这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。
```yaml
kubectl create secret generic db-user-pass --from-literal=username=admin --from-literal=password=1f2d1e2e67dfdb-user-pass
db-user-pass为名称。
案例:
1、首先创建一个secret文件
vi secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
# 创建
kubectl create -f secret.yaml
# 查看
kubectl get secret
2、使用环境变量username和password
vi secret-val.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.14
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
kubectl create -f secret-val.yaml
kubectl exec -it mypod bash
echo $SECRET_USERNAME
#删除
kubectl delete -f secret-val.yaml
3、挂载 Volume 的方式
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.14
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
kubectl exec -it mypod bash
cd /etc/foo
cat username
ConfigMap
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。
# 删除所有pod
kubectl delete pod --all
1、创建一个redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
2、执行
kubectl create configmap redis-config --from-file=redis.properties
kubectl get cm
kubectl describe cm redis-config
3、以Volume挂载到pod容器中
vi cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox:1.28
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
4、运行
删除POD
- kubectl delete pod [pod name] —force —grace-period=0 -n [namespace]
kubectl apply -f cm.yaml kubectl get pods -o wide
5、查询日志kubectl logs mypod
以变量的方式挂载pod容器中
(1)创建yaml,声明变量信息,myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
运行:
kubectl apply -f myconfig.yaml
查询:
kubectl get cm
(2)挂载 config-val.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox:1.28
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
运行:
kubectl apply -f config-val.yaml
kubectl logs mypod
补充
1.删除configmap命令
kubectl delete cm [configmap名]
如使用yaml文件创建的则可以使用
kebectl delete -f [configmap的创建文件名]
2.创建configmap的其他命令
kubectl apply -f [configmap的创建文件名]
3.查看configmap
kubectl get cm [configmap名] -o [格式 ex: yaml,json]
4.修改configmap中的数据
kubectl edit cm [configmap名]
kubectl patch cm [configmap名] -p '{"data": {"configmap-test.yml":"aa=bb\ncc=dd"}}'(既存替换,否则追加)
5.追加标签
kubectl lable cm [configmap名] [标签 ex: name=true]
数据存储
Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,
kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。
Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失。
kubernetes的Volume支持多种类型,比较常见的有下面几个:
基本存储:EmptyDir、HostPath、NFS
EmptyDir
EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,
当Pod销毁时, EmptyDir中的数据也会被永久删除。 EmptyDir用途如下:
- 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
- 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)
接下来,通过一个容器之间文件共享的案例来使用一下EmptyDir。
在一个Pod中准备两个容器nginx和busybox,然后声明一个Volume分别挂在到两个容器的目录中,然后nginx容器负责向Volume中写日志,busybox中通过命令将日志内容读到控制台。
HostPath
上节课提到,EmptyDir中数据不会被持久化,它会随着Pod的结束而销毁,如果想简单的将数据持久化到主机中,可以选择HostPath。
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。
NFS
HostPath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod如果转移到了别的节点,又会出现问题了,此时需要准备单独的网络存储系统,比较常用的用NFS、CIFS。
NFS是一个网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样的话,无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问。
首先要准备nfs的服务器,这里为了简单,直接是master节点做nfs服务器
# 在nfs上安装nfs服务
[root@s201 ~]# yum install nfs-utils -y
# 准备一个共享目录
[root@s201 ~]# mkdir /root/data/nfs -pv
# 将共享目录以读写权限暴露给192.168.88.0/24网段中的所有主机
[root@s201 ~]# vim /etc/exports
[root@s201 ~]# more /etc/exports
/root/data/nfs *(rw,no_root_squash)
# 启动nfs服务
[root@s201 ~]# systemctl restart nfs
接下来,要在的每个node节点上都安装下nfs,这样的目的是为了node节点可以驱动nfs设备
# 在node上安装nfs服务,注意不需要启动
[root@s202 ~]# yum install nfs-utils -y
验证:showmount -e 192.168.88.201
接下来,就可以编写pod的配置文件了,创建volume-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-nfs
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
- name: busybox
image: busybox:1.20
command: ["/bin/sh","-c","tail -f /logs/access.log"]
volumeMounts:
- name: logs-volume
mountPath: /logs
volumes:
- name: logs-volume
nfs:
server: 192.168.88.201 #nfs服务器地址
path: /root/data/nfs #共享文件路径
最后,运行下pod,观察结果
# 创建pod
[root@k8s-master01 ~]# kubectl create -f volume-nfs.yaml
pod/volume-nfs created
#查看日志
kubectl describe pod volume-nfs
# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-nfs
NAME READY STATUS RESTARTS AGE
volume-nfs 2/2 Running 0 2m9s
# 查看nfs服务器上的共享目录,发现已经有文件了
[root@k8s-master01 ~]# ls /root/data/
access.log error.log
高级存储
前面已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。
PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。
换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。
实战
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /root/data/nfs
server: 192.168.88.201
vi pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
执行:
kubectl get pv,pvc
kubectl exec -it xxx bash
监控
- Promethus的介绍
- Promethus组件和架构
- Promethus监控指标
- 实战
Prometheus介绍
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目, 拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基 金会(CNCF),成为继Kubernetes之后的第二个托管项目。
组件与架构
- Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
- ClientLibrary:客户端库
- Push Gateway:短期存储指标数据。主要用于临时性的任务
- Exporters:采集已有的第三方服务监控指标并暴露metrics
- Alertmanager:告警
-
监控指标
Kubernetes本身监控
Node资源利用率
- node数量
- 每个Node运行pod数量
- 资源对象状态
Pod监控
- Pod总数量以及每个控制器预期数量
- Pod状态
- 容器资源利用率:CPU、内存、网络
Pod
kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有Pod和容器相关的性能指标数据。 指标接口:https://NodeIP:10250/metrics/cadvisor
Node
使用node_exporter收集器采集节点资源利用率。 项目地址:https://github.com/prometheus/node_exporter
K8s资源对象
kube-state-metrics采集了k8s中各种资源对象的状态信息。 项目地址:https://github.com/kubernetes/kube-state-metrics
相关组件
prometheus-deployment.yaml # 部署Prometheus
prometheus-configmap.yaml # Prometheus配置文件,主要配置Kubernetes服务发现
prometheus-rules.yaml # Prometheus告警规则
grafana.yaml # 可视化展示
node-exporter.yml # 采集节点资源,通过DaemonSet方式部署,并声明让Prometheus收集
kube-state-metrics.yaml # 采集K8s资源,并声明让Prometheus收集
alertmanager-configmap.yaml # 配置文件,配置发件人和收件人
alertmanager-deployment.yaml # 部署Alertmanager告警组件
实战
# 创建名称空间
kubectl create ns prome
kubectl apply -f prometheus-configmap.yaml
kubectl apply -f prometheus-deployment.yaml
kubectl apply -f prometheus-rules.yaml
kubectl get pods -n prome
kubectl get pods,svc -n prome
ntpdate time.windows.com
如果出现以上问题:
建议手动拉取镜像
crictl pull prom/prometheus:v2.20.0
kubectl get pods,svc -n prome
访问:
192.168.88.201:30090/graph
部署Grafana
kubectl apply -f grafana.yaml
# 提前下载镜像
crictl pull grafana/grafana:7.1.0
# 查看是否启动
kubetctl get pods,svc -n prome
访问:192.168.88.201:30030
用户名:admin
密码:admin
配置
1、添加数据源
部署监控节点:
kubectl apply -f node-exporter.yml
部署K8S资源对象状态监控
kubectl apply -f kube-state-metrics.yaml