configmap 使用详解

WHAT:就是为了让镜像 和 配置文件解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,将来可直接注入到Pod中的容器使用

WHY:为了配合Apollo使用

使用configmap管理应用配置,需要先拆分环境,拆分未test和pro环境来模拟实际工作

先把dubbo的服务(消费者/服务站/监视者)都scale成0,这样就没有容器在里面跑了

拆分zk成测试环境和生产环境来模拟实际情况,如下:

主机名 角色 ip
HDSS7-11.host.com zk1.od.com(Test环境) 10.4.7.11
HDSS7-12.host.com zk2.od.com(Prod环境) 10.4.7.12

之前是11、12、21一共3台,我们先把21拆了

# 11/12/21机器,停掉zookeeper并删掉相关data文件和log文件的内容:
~]# cd /opt/zookeeper
zookeeper]# bin/zkServer.sh stop
# 停不掉就 kill -9 id 杀掉
zookeeper]# ps aux|grep zoo
zookeeper]# cd /data/zookeeper/data/
data]# rm -fr ./*
cd ../logs/
logs]# rm -fr ./*

kill -9 :强制杀死该进程

# 11/12机器,修改zoo.cfg配置:
zookeeper]# cd /opt/zookeeper/conf
zookeeper]# vi zoo.cfg
# 把下面的三行都删掉,不需要组成集群,如图

# 11/12机器,启动zk:
cd /opt/zookeeper/
zookeeper]# bin/zkServer.sh start
zookeeper]# ps aux|grep zoo
zookeeper]# bin/zkServer.sh status

Mode: standalone 模式,拆分完成

# 200机器,准备资源配置清单:
~]# vi /data/k8s-yaml/dubbo-monitor/cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: dubbo-monitor-cm
  namespace: infra
data:
  dubbo.properties: |
    dubbo.container=log4j,spring,registry,jetty
    dubbo.application.name=simple-monitor
    dubbo.application.owner=ben1234560
    dubbo.registry.address=zookeeper://zk1.od.com:2181
    dubbo.protocol.port=20880
    dubbo.jetty.port=8080
    dubbo.jetty.directory=/dubbo-monitor-simple/monitor
    dubbo.charts.directory=/dubbo-monitor-simple/charts
    dubbo.statistics.directory=/dubbo-monitor-simple/statistics
    dubbo.log4j.file=/dubbo-monitor-simple/logs/dubbo-monitor.log
    dubbo.log4j.level=WARN
~]# vi /data/k8s-yaml/dubbo-monitor/dp2.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: dubbo-monitor
  namespace: infra
  labels: 
    name: dubbo-monitor
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: dubbo-monitor
  template:
    metadata:
      labels: 
        app: dubbo-monitor
        name: dubbo-monitor
    spec:
      containers:
      - name: dubbo-monitor
        image: harbor.od.com/infra/dubbo-monitor:latest
        ports:
        - containerPort: 8080
          protocol: TCP
        - containerPort: 20880
          protocol: TCP
        imagePullPolicy: IfNotPresent
        volumeMounts:
          - name: configmap-volume
            mountPath: /dubbo-monitor-simple/conf
      volumes:
        - name: configmap-volume
          configMap:
            name: dubbo-monitor-cm
      imagePullSecrets:
      - name: harbor
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      securityContext: 
        runAsUser: 0
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600
# 对比两个dp有什么不同,200机器:
cd /data/k8s-yaml/dubbo-monitor/
dubbo-monitor]# vimdiff dp.yaml dp2.yaml
#:qall 退出

vimdiff:编辑同一文件的不同历史版本,对各文件的内容进行比对与调整

没有vimdiff 的下载 yum install VIM -y

这里两个文件不同的地方,注意,这里的image的版本因为我的操作问题所以一个v2一个没有v,你的应该是都没有的

# 200机器,替换dp:
dubbo-monitor]# mv dp.yaml /tmp/
dubbo-monitor]# mv dp2.yaml dp.yaml

mv :如果mv后是目录,则是移动,如果是文件名,则是更改名字

# 应用资源配置清单,22机器:
~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/cm.yaml
~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp.yaml
# 看一下相关容器有没有起来

我们改成zk2

在删掉这个pod重启

刷新页面变成zk2了

报错信息

flannel重启报错问题

# flannel重启需要增加以下内容,添加在最下面:
21 ~]# vi /etc/sipervisord.d/flannel.ini
killasgroup=true
stopasgroup=true

如何排错:

# 查看时间是否正常
date
# 查看kubernetes的报错
21 ~]# tail -fn 200/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
# 可以重启docker 和 kubelet
21 ~]# systemctl restart docker 
21 ~]# ps aux|grep kubelet
21 ~]# kill -9 id
# 查看supervisor的状态
21 ~]# supervisorctl status
# 查看路由状态,是否能ping通其它机器
21 ~]# route -n
21 ~]# ping 172.7.22.2
# 查看flannel情况
21 ~]# tail -fn 200 /data/logs/flanneld/flanneld.stdout.log
# 12flannel主机器上get网络,如果error则加入backend
12 ~]# ./etcdctl get /coreos.com/network/config
# 报错iptables,让机器一重启就自动使用,21/22机器
~]# service iptables save
# out: [ok]

cm对象的另一种创建方法(可不做):

# 22机器:
cd /opt/kubernetes/server/bin/conf
# 当前目录下要又kubelet.kubeconfig的文件
conf]# kubectl create cm kubelet-cm --from-file=./kubelet.kubeconfig
#out: configmap/kubelet-cm created

可以在dashoboard的default名称空间下Config Maps看到。随后记得删除

官方Apollo框架:

简化Apollo框架:

Client通过推拉结合和ConfigService交互,然后ConfigService去拿ConfigDB里面的配置给Client端返回去。

Portal是Apollo的一个仪表盘,通过调用AdminService去同步修改ConfigDB里面的配置

先交付ConfigService,然后交付AdminService,最后加portal