0%

会计是干嘛的——目标:提供信息(核算监督是过程)

财务状况——“富”(有钱)

经营成果——“高”(利润高不高,能赚钱)

现金流量——“帅”(舍不舍得花钱)

财务状况——资产负债表

经营成果——利润表

现金流量——现金流量表

1.资产负债表——基于 资产=负债+所有者权益 编制

反映静态(时点)要素

如果一个人有2000万的别墅,买别墅的钱,其中70%是借来的,另外30%是爹妈给的。2000万中的1400万是借来的,要还的,是负债,另外600万是爹妈给的,是权益,不用还。

等式左边资产是资金占用,右边是资金的来源。资产负债表也是这样。

资产负债表需要区分资产和负债,除了这些就是权益。

名称中有“应收”“投资”“资产”大多数是资产,资产是一种资源。资产是将资源进行分类。

名称中有“应付”“应交”“负债”基本是负债。

资产=负债+所有者权益+(收入-费用),收入和费用影响权益,从而影响资产

2.利润表——收入-费用=利润(动态、过程)

利润表中有三种利润:营业利润、利润总额、净利润

营业外收入(例捐赠、捡钱、中彩票)、营业外支出(例自然灾害)不影响营业利润。

影响营业利润的项目:1(营业收入)、2(营业成本、税金及附加)、4(4个费用)、2(2个减值损失)、4(4个收益),共13个。(去掉“净敞口套期收益”,考试不考)

营业收入=主营业务收入(主营)+其他业务收入(辅营)——都是日常活动

销售费用:广告营销费

管理费用:如办公费

研发费用:如研发人员工资

财务费用:利息费用

投资收益:股票分红、债券利息收益

公允价值变动收益:

资产处置收益:

不影响营业利润,说明是营业外,就是自然灾害。

上图6个红色章节是重难点。

18、19、20现在复习可以先跳过,2020年可能会发生变化。

这篇文章主要讲解在kubernetes集群中如何安装Grafana和持久化Grafana数据。

使用的镜像是image: grafana/grafana:6.3.3

安装Grafana使用的yaml文件是安装kube-prometheus里面的。安装 kube-prometheus,请参考 Kubernetes监控方案kube-prometheus(prometheus, node-exporter, grafana)

不过需要对grafana/grafana-deployment.yaml做一些自定义化的修改。

设置管理员

containers下级添加GF_SECURITY_ADMIN_USERGF_SECURITY_ADMIN_PASSWORD,用来配置 grafana 的管理员用户和密码

1
2
3
4
5
6
7
8
9
spec:
containers:
- image: grafana/grafana:6.3.3
...
env:
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: "123456"

如果要设置Grafana的匿名登录,请参考Grafana匿名登录Kubernetes设置

1
2
3
4
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Viewer

数据持久化

原始的数据是以emptyDir形式存放在pod里面,生命周期与pod相同,出现问题时,容器重启,在Grafana里面设置的数据就全部消失了。

1
2
3
4
5
6
7
8
  volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
readOnly: false
...
volumes:
- emptyDir: {}
name: grafana-storage

可以看出Grafana将dashboard、插件这些数据保存在/var/lib/grafana这个目录下面。做持久化的话,就需要对这个目录进行volume挂载声明。

把emptyDir修改为pvc方式。

1
2
3
4
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana

如果要使用一个 pvc 对象来持久化数据,我们就需要添加一个可用的 pv 供 pvc 绑定使用,grafana-volume.yaml内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.16.64.233
path: /data/nfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

暴露Service的方法,在安装 kube-prometheus 的时候已经讲过了。Kubernetes监控方案kube-prometheus(prometheus, node-exporter, grafana)

1
2
3
4
5
# kubectl apply -f grafana-volume.yaml
persistentvolume/grafana created
persistentvolumeclaim/grafana created
# kubectl apply -f grafana-deployment.yaml
deployment.apps/grafana configured

查看 pod 状态:

1
2
3
4
# kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
...
grafana-6668cd66cb-ff8kg 0/1 ContainerCreating 0 2m32s

进一步查看描述信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# kubectl describe po grafana-6668cd66cb-ff8kg -n monitoring
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m57s default-scheduler Successfully assigned monitoring/grafana-6668cd66cb-ff8kg to k8s-node2
Warning FailedMount 3m54s kubelet, k8s-node2 MountVolume.SetUp failed for volume "grafana" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/fc4d98ef-0b80-4570-a487-4ded9133eb58/volumes/kubernetes.io~nfs/grafana --scope -- mount -t nfs 172.16.64.233:/data/nfs /var/lib/kubelet/pods/fc4d98ef-0b80-4570-a487-4ded9133eb58/volumes/kubernetes.io~nfs/grafana
Output: Running scope as unit run-54024.scope.
mount: wrong fs type, bad option, bad superblock on 172.16.64.233:/data/nfs,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)

In some cases useful info is found in syslog - try
dmesg | tail or so.
Warning FailedMount 3m53s kubelet, k8s-node2 MountVolume.SetUp failed for volume "grafana" : mount failed: exit status 32

说明是 mount 失败了。原因是我们需要在每个节点,都要安装 NFS 客户端。在生产环境下,如何批量操作 terminal 终端?请参考:批量操作Shell终端

在每个node下面都安装好NFS客户端以后,删除掉出错的 pod。

查看 pod:

1
2
3
kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
grafana-6668cd66cb-jrnjv 0/1 CrashLoopBackOff 4 2m53s

没有正常启动,我们再看一下这个 Pod 的日志:

1
2
3
4
# kubectl logs grafana-6668cd66cb-jrnjv -n monitoring
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied

这个错误是 Grafana 5.1版本以后才会出现的。错误的原因很明显,就是 /var/lib/grafana 目录的权限不够。

在 `` 中有这样一个属性:

1
2
3
securityContext:
runAsNonRoot: true
runAsUser: 65534

我们查看一下65534是哪个用户:

1
2
# cat /etc/passwd | grep 65534
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

所以,你只需要把 /data/nfs 目录的用户改为 nfsnobody 就可以了。当然把属性改为 777 也没问题。

1
chown nfsnobody /data/nfs

把刚才出错的那个 Pod 删除,新的 Grafana Pod 就成功启动了。

然后可以添加 Dashboard 了,哪怕 Pod 重建也不会丢失数据了。

在生产环境,往往有几十上百台服务器要同时操作,如何同时控制这么多服务器呢?

Windows

在Windows环境下,可以使用XShell。

点击工具(T)->发送键到所有会话(K)

MacOS

可以使用 iTerm2 终端工具,快捷键是Command + Shift + I。然后 iTerm2 窗口会出现背景斜条纹。