配置管理

Secret讲解

k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了
image.png
image.png

Secret有三种类型

Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息。

  1. Opaque类型
    Opaque 类型的数据是一个 map 类型,要求value是base64编码。
    手动创建base64加密 ```yaml 加密 echo -n ‘admin’ | base64 YWRtaW4= $ echo -n ‘123456’ | base64 MTIzNDU2

解密 echo ‘MTIzNDU2’ | base64 —decode 123456

  1. 这里需要注意的是,像这样创建的 Secret 对象,它里面的内容仅仅是经过了转码,而并没有被加密。在真正的生产环境中,你需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。
  2. ```yaml
  3. 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

image.png
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

image.png

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对象。
image.png

# 删除所有pod
kubectl delete pod --all

image.png
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

image.png

kubectl describe cm redis-config

image.png
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、运行

  1. 删除POD

  2. kubectl delete pod [pod name] —force —grace-period=0 -n [namespace]
    kubectl apply -f cm.yaml
    kubectl get pods -o wide
    
    image.png
    5、查询日志
    kubectl logs mypod
    
    image.png

以变量的方式挂载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
image.png
(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中通过命令将日志内容读到控制台。
image.png

HostPath

上节课提到,EmptyDir中数据不会被持久化,它会随着Pod的结束而销毁,如果想简单的将数据持久化到主机中,可以选择HostPath。
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。
image.png

NFS

HostPath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod如果转移到了别的节点,又会出现问题了,此时需要准备单独的网络存储系统,比较常用的用NFS、CIFS。
NFS是一个网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样的话,无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问。
image.png


首先要准备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系统发出的一种资源需求申请。
image.png

实战

image.png
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
image.png
kubectl exec -it xxx bash

监控

  • Promethus的介绍
  • Promethus组件和架构
  • Promethus监控指标
  • 实战

    Prometheus介绍

    Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目, 拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基 金会(CNCF),成为继Kubernetes之后的第二个托管项目。
    image.png

组件与架构

  • Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
  • ClientLibrary:客户端库
  • Push Gateway:短期存储指标数据。主要用于临时性的任务
  • Exporters:采集已有的第三方服务监控指标并暴露metrics
  • Alertmanager:告警
  • Web UI:简单的Web控制台

    监控指标

    Kubernetes本身监控

  • Node资源利用率

  • node数量
  • 每个Node运行pod数量
  • 资源对象状态

Pod监控

  • Pod总数量以及每个控制器预期数量
  • Pod状态
  • 容器资源利用率:CPU、内存、网络

image.png

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

image.png

image.png

相关组件

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

image.png
如果出现以上问题:
建议手动拉取镜像
crictl pull prom/prometheus:v2.20.0

kubectl get pods,svc -n prome
image.png
访问:
192.168.88.201:30090/graph
image.png
image.png

部署Grafana

 kubectl apply -f grafana.yaml
 # 提前下载镜像
 crictl pull grafana/grafana:7.1.0
 # 查看是否启动
 kubetctl get pods,svc -n prome

访问:192.168.88.201:30030
image.png
用户名:admin
密码:admin
配置
1、添加数据源
image.png

image.png image.png

image.png
image.png
image.png

部署监控节点:
kubectl apply -f node-exporter.yml
image.png
image.png
image.png
image.png
部署K8S资源对象状态监控
kubectl apply -f kube-state-metrics.yaml
image.png
image.png

image.png