etcd是一个开源的分布式键值对数据库,他的每一个节点都有一份数据的copy,当有节点故障时保证了高可用性。etcd使用Raft算法来保证一致性。

etcd的apiv3在使用命令时需要在前面加上ETCDCTL_API=3
集群成员

1
ETCDCTL_API=3 etcdctl member list

更新一个节点ip

1
2
etcdctl member list
etcdctl member update memberID http://ip:2380

删除一个节点

1
2
3
4
etcdctl member list  
etcdctl member remove memberID
etcdctl member list
ps -ef|grep etcd //在相关节点上kill掉etcd进程

测试增加一个新节点
注意:添加已经删除的需要将etcd3的rm -rf /var/lib/etcd/*必须删除
移除节点

1
2
ETCDCTL_API=3  etcdctl --endpoints=https://192.168.7.93:2379,https://192.168.7.94:2379,https://192.168.7.92:2379   --cacert=/etc/kubernetes/ssl/ca.pem   --cert=/etc/etcd/ssl/etcd.pem   --key=/etc/etcd/ssl/etcd-key.pem  member  list -w table
ETCDCTL_API=3 etcdctl --endpoints=https://192.168.7.93:2379,https://192.168.7.94:2379,https://192.168.7.92:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem member remove 7d17ab970f6de141

添加节点

1
2
3
4
5
 ETCDCTL_API=3  etcdctl --endpoints=https://192.168.7.93:2379,https://192.168.7.94:2379,https://192.168.7.92:2379   --cacert=/etc/kubernetes/ssl/ca.pem   --cert=/etc/etcd/ssl/etcd.pem   --key=/etc/etcd/ssl/etcd-key.pem  member add  etcd3 --peer-urls="https://192.168.7.92:2380" //查看新增成员列表,etcd3状态为unstarted
rm -rf /var/lib/etcd/* //etcd3上面操作
vi /etc/systemd/system/etcd.service ///etcd3上面操作 修改--initial-cluster-state=existing 不改报错 streaming request ignored (ID mismatch got 7d17ab970f6de141 want 58662caff7c6e081)

systemctl daemon-reload && systemctl restart etcd ///etcd3上面操作
ETCDCTL_API=3 etcdctl --endpoints=https://192.168.7.93:2379,https://192.168.7.94:2379,https://192.168.7.92:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem member list -w table

kubelete 证书默认有效期一年

1
2
3
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod a+x /bin/cfssl-certinfo
cfssl-certinfo -cert /etc/kubernetes/ssl/kubelet.crt

crt

方法一

1
2
3
4
备份 mkdir  ~/sslback && mv /etc/kubernetes/kubelet.kubeconfig  ~/sslback/
使用admin证书文件替换
cp ~/.kube/config /etc/kubernetes/kubelet.kubeconfig
systemctl restart kubelet && systemctl status kubelet

方法二 kubelet重新请求证书

手动签发
在 kubelet 首次启动后,如果用户 Token 没问题,并且 RBAC 也做了相应的设置,那么此时在集群内应该能看到 kubelet 发起的 CSR 请求 ,必须通过后kubernetes 系统才会将该 Node 加入到集群。

1
2
3
4
5
6
7
8
9
10
11
12
在证书过期node删除kubelet相关证书文件
rm -rf /etc/kubernetes/kubelet.kubeconfig
rm -rf /etc/kubernetes/ssl/kubelet.*
systemctl restart kubelet && systemctl status kubelet
自动生成了kubelet kubeconfig 文件和公私钥
查看未授权的CSR请求
kubectl get csr
通过CSR 请求:
kubectl certificate approve csr-404fc
查看重新生成的证书文件
ll /etc/kubernetes/ssl/kubelet.*
kubectl get nodes --show-labels

prometheus将监测到的异常事件发送给alertmanager,alertmanager发送异常事件的通知(邮件、webhook等)

configMap.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
26
27
28
29
30
31
32
33
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager
namespace: monitoring
data:
config.yml: |-
global:
smtp_smarthost: 'smtp.idcsec.com:25' # Email SMTP 服务器信息
smtp_from: 'root@idcsec.com'
smtp_auth_username: 'root@idcsec.com'
smtp_auth_password: 'pwd'
resolve_timeout: 10m
smtp_require_tls: false #是否开启 TLS
route: # 路由规则配置将不同告警发送给指定人
group_by: ['alertname'] # 告警压缩规则
repeat_interval: 24h
receiver: monitoring #默认发送到 `monitoring`,该 monitoring 必须存在,否则报错退出
routes: # 子路由告警级别分别发给不同的接收器
- match:
team:dba #匹配prometheus的rule_files文件中的labels
receiver: db-team-email receiver接收器名称 全局唯一
continue: true # 默认告警匹配成功第一个 receivers 会退出匹配,开启 continue 参数后会继续匹配 receivers 列表

receivers: # 接收器
- name: 'monitoring'
email_configs:
- send_resolved: true #告警恢复后否发送通知,这里选择发送
to: 'test@idcsec.com' #接收邮件'A@.com,B@com'
- name: 'db-team-email'
email_configs:
- send_resolved: true
to:'xxx@xxx.com'

ingress-nginx配置

默认ingress-nginx 代理重定向是OFF

1
2
[root@centos-master ~]# kubectl exec -it nginx-ingress-controller-1971110253-0rcjw  -n kube-system -- cat /etc/nginx/nginx.conf   | grep "proxy_redirect" | head -n 1
proxy_redirect off;

ingress代理重定向配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ${projectSvc}
annotations:
nginx.ingress.kubernetes.io/proxy-redirect-from: "test.cn:9090"
nginx.ingress.kubernetes.io/proxy-redirect-to: "test.cn:9090"
spec:
rules:
- host: ${projectUrl}
http:
paths:
- path: /
backend:
serviceName: ${projectSvc}
servicePort: 80
- host: ${projectUrl/test.loca/test.cn}
http:
paths:
- path: /
backend:
serviceName: ${projectSvc}
servicePort: 80
  • 重点
1
2
nginx.ingress.kubernetes.io/proxy-redirect-from: "idcsec.com"
nginx.ingress.kubernetes.io/proxy-redirect-to: "idcsec.com"

Harbor 介绍

Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目
它主要 提供 Dcoker Registry 管理UI,可基于角色访问控制, AD/LDAP 集成,日志审核等功能,完全的支持中文。
Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。
安装方式:
-在线安装程序:安装程序从Docker hub下载Harbor的图像。因此,安装程序的尺寸非常小。

-脱机安装程序:当主机没有Internet连接时使用此安装程序。安装程序包含预先构建的图像,因此其大小更大。

harbor 部署

开源项目地址:https://github.com/vmware/harbor
官方安装说明:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

Docker安装

卸载老docker版本

1
2
3
4
5
6
7
8
9
10
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

安装 docker repository

1
2
3
4
5
6
7
8
9
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce -y
$ systemctl start docker

安装docker-compose

1
[root@Pro harbor-1.5.3]# yum install python2-pip -y && yum install docker-compose -y

修改docker加速

1
2
3
4
5
6
7
8
9
10
11
vim /etc/docker/daemon.json 
{
"registry-mirrors": [ "https://registry.docker-cn.com",],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}

NFS搭建略..

创建nfs文件

安装部署

1
2
3
mkdir /opt/k8s-nfs-storage
echo "/opt/k8s-nfs-storage *(rw,no_root_squash,no_all_squash,sync)" > /etc/exports
exportfs -vr

所需要的yaml文件github:
修改deployment文件并部署deployment.yaml
需要修改的地方只有NFS服务器所在的IP地址(192.168.7.206),以及NFS服务器共享的路径(/opt/k8s-nfs-storage),两处都需要修改为你实际的NFS服务器和共享目录

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: 192.168.19.111/gc/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: idcsec.lan/nfs
- name: NFS_SERVER
value: 192.168.7.206
- name: NFS_PATH
value: /opt/k8s-nfs-storage
volumes:
- name: nfs-client-root
nfs:
server: 192.168.7.206
path: /opt/k8s-nfs-storage
---
kind: ServiceAccount
apiVersion: v1
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io

修改StorageClass文件并部署class.yaml
此处可以不修改,或者修改provisioner的名字,需要与上面的deployment的PROVISIONER_NAME名字一致。

1
2
3
4
5
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: k8s-nfs-storage
provisioner: idcsec.lan/nf

授权
RBAC授权文件在auth目录下面
如果您的集群启用了RBAC,必须授权provisioner。
设置 k8s-nfs-storage作为默认存储类

1
kubectl patch storageclass  k8s-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

crt
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: k8sapp
spec:
serviceName: "k8sapp"
replicas: 1
volumeClaimTemplates:
- metadata:
name: test
annotations:
volume.beta.kubernetes.io/storage-class: "k8s-nfs-storage"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi

crt

Helm 基本概念

Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为Kubernetes构建的应用,它包含几个基本概念

Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件,
Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。
Repository:用于发布和存储 Chart 的仓库。

Helm 组件

Helm 采用客户端/服务器架构,有如下组件组成:

Helm CLI 是 Helm 客户端,可以在本地执行
从最新https://github.com/helm/helm/releases,下载helm-v2.9.1-linux-amd64.tar.gz到本地,解压后把二进制直接放到环境PATH下即可
Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期
Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

安装Helm

Helm 会利用 “gcr.io/kubernetes-helm/tiller” 镜像在Kubernetes集群上安装配置 Tiller;并且利用 “https://kubernetes-charts.storage.googleapis.com“ 作为缺省的 stable repository 的地址。由于在国内可能无法访问 “gcr.io”, “storage.googleapis.com” 等域名.可以使用阿里云提供的table repository 的地址

1
2
3
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
tar -zxvf helm-v2.9.1-linux-amd64.tar.gz &&\
cp linux-amd64/helm /opt/kube/bin/ && chmod +x /opt/kube/bin/helm

执行下面命令安装
未使用SSL/TLS认证机制

1
2
$helm init --upgrade -i 192.168.19.111/gc/tiller:v2.5.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
kubectl get pod --all-namespaces|grep tiller

若要查看在存储库中可用的所有 Helm charts

1
2
3
helm search  //看在存储库中可用的所有 Helm charts
helm repo update //更新charts列表以获取最新版本
helm list //查看在群集上安装的Charts列表

crt

Calico报错 Calico node ‘localhost.localdomain’ is already using the IPv4 addressx.x.x.x解决
服务器之前改名了hostname没有重启部署完etcd、Calico node。后来重启导致k8sCalico node起不来。
报错大楷是由于etcd内存储了之前hostname(localhost.localdomain)的的记录导致现在ip和之前冲突,不能自动删除重建
查看日志信息

1
kubectl  logs   calico-node-8w7tv -c  calico-node  -n kube-system -f

crt

v3没有ls使用get替代

查看etcd信息

1
2
$export ETCDCTL_API=3
$etcdctl --endpoints=https://192.168.7.92:2379,https://192.168.7.93:2379,https://192.168.7.94:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem get / --prefix --keys-only | grep localhost

crt
删除之前存储的信息

1
$etcdctl --endpoints=https://192.168.7.92:2379,https://192.168.7.93:2379,https://192.168.7.94:2379   --cacert=/etc/kubernetes/ssl/ca.pem   --cert=/etc/etcd/ssl/etcd.pem   --key=/etc/etcd/ssl/etcd-key.pem  get / --prefix --keys-only | grep localhost | xargs -I {} etcdctl del {}

crt

重启caliconode pod恢复正常
crt

部署Ingress

ingress的部署文件在kubernetes Ingress 修改nodeselector 指定nodes上。
Pod.spec.nodeSelector是通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束。启用节点选择器的步骤为:

Node添加label标记

查询lable

1
2
3
kubectl get nodes --show-labels
标记规则:kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label node 192.168.7.93 role=nginx-ingress

crt

1
2
镜像v0.17.1:docker pull wtingdocker/nginx-ingress-controller
https://github.com/kubernetes/ingress-nginx/releases

默认安装的kubernetes没有统计 CPU 和内存Dashboard图表也没有显示,装上 Heapster 后就可以直观地看到各个组件的资源消耗情况,以及kubectl top 查看 nodes pod资源。Heapster已弃用。请考虑使用 metrics-server 和第三方指标管道来收集Prometheus格式的指标。
可以不安装influxdb

执行heapster.yaml文件

1
修改: - --source= - --sink、images