master:kubectl操作api-server 增删改查,scheduler调度 ,controller manager控制应用副本,etcd存储应用状态
node:pod,kube-proxy
Master:集群控制节点,负责整个集群的管理和控制。
API Server: 提供接口,资源增删改查入口。
Controller Manager: 所有资源对象的自动化控制中心。
Scheduler: 负责资源调度。
Etcd:master的持续状态都存在etcd。
Node:工作节点,听从master的工作分配。
Kubelet: Pod容器创建、启停,集群管理等任务。
kube-proxy: 实现service 的通信与负载均衡组件。
Docker: Docker引擎,负责本机容器创建和管理工作。
Pod:
是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
RC:
replication controller是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。
service:
一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。要稳定地提供服务需要服务发现和负载均衡能力。
在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。
deployment:
部署表示用户对K8s集群的一次更新操作。可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。
replica set:
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
daemon set:
长期伺服型和批处理型服务的核心在业务应用,可能有些节点运行多个同类业务的Pod,有些节点上又没有这类Pod运行;而后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点。典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务。
job:
Job是K8s用来控制批处理型任务的API对象。批处理业务与长期伺服业务的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的spec.completions策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功型任务保证有N个任务全部成功;工作队列型任务根据应用确认的全局成功而标志成功。
软件环境:
master
node1
node2
ubuntu 1904添加网卡:
ip link 查看网卡
vim /etc/netplan/50-cloud-init.daml 写入网卡
root@master:~# cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens33:
dhcp4: true
ens38:
#dhcp4: true
addresses: [192.168.134.130/24]
nameservers:
addresses: [114.114.114.114]
gateway4: 192.168.134.2
version: 2
netplan apply 重启网络
-------------------centos环境安装
#停止firewalld服务
systemctl stop firewalld && systemctl disable firewalld
#关闭selinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0
#关闭swap设置
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
#解决流量路由不正确问题
cat <<EOF > /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
#更改hosts文件
cat >> /etc/hosts << EOF
192.168.0.20 master.example.com
192.168.0.49 node1.example.com
192.168.0.50 node2.example.com
EOF
#安装docker
yum -y install docker
systemctl enable docker && systemctl start docker
#配置阿里k8s源
cat >> /etc/yum.repos.d/k8s.repo << EOF
[kubernetes]
name=kuberbetes repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
EOF
#安装kubelet/kubeadm/kubectl
yum -y install kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
-------------------centos环境安装结束
----------------ubuntu环境安装
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
#解决流量路由不正确问题
cat <<EOF > /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
#更改hosts文件
cat >> /etc/hosts << EOF
192.168.2.150 master.example.com
192.168.2.151 node1.example.com
192.168.2.152 node2.example.com
EOF
apt-get -y install docker.io
systemctl enable docker && systemctl start docker
apt-get update && apt-get install -y apt-transport-https curl
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
apt-get update
apt-get -y install kubelet=1.13.1-00 kubeadm=1.13.1-00 kubectl=1.13.1-00 kubernetes-cni=0.6.0-00
systemctl enable kubelet && systemctl start kubelet
ubuntu列举软件版本:
apt-cache madison kubelet
----------------ubuntu环境安装结束
-------------------------------python3 自动拉取image的脚本:
import os
S_registry = 'registry.cn-beijing.aliyuncs.com/kubernetesdevops/'
D_registry = 'k8s.gcr.io/'
master_image = ['kube-apiserver:v1.13.1','kube-controller-manager:v1.13.1',
'kube-scheduler:v1.13.1','kube-proxy:v1.13.1','pause:3.1',
'etcd:3.2.24','coredns:1.2.6','flannel:v0.10.0-amd64','kubernetes-dashboard-amd64:v1.10.0']
def PullImage(registry,images):
index = 1
for image in images:
cmd = "docker pull " + registry + image
os.system(cmd)
print("done!")
index +=1
def TagImage(sregistry,dregistry,images):
index = 1
for image in images:
cmd = "docker tag " + sregistry+image + " " + dregistry + image
os.system(cmd)
print("done!")
index +=1
if __name__ == '__main__':
PullImage(S_registry,master_image)
#TagImage(S_registry,D_registry,master_image)
-----------------------------python3 自动拉取images脚本结束
删除重复的tag:
for i in `docker images |grep beijing|awk '{print $1":"$2}'`;do docker rmi $i;done
拉取上面8个镜像,node1,2也都需要
-------------master初始化
kubeadm init --kubernetes-version=v1.13.1 --apiserver-advertise-address 192.168.134.130 --pod-network-cidr=10.244.0.0/16
kubeadm init --kubernetes-version=v1.13.1 --apiserver-advertise-address 192.168.134.130 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification
输出:
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.134.130:6443 --token dyfl39.tsd8zqpfaehj8l9b --discovery-token-ca-cert-hash sha256:7e1358ca2c2c2edce1e548e0690ed1327fb41eb8150bb543794e8b7f48c654cd
-----输出结束
-----声明一下kubeconfig
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
kubectl get nodes 发现notReady
安装flannel
curl https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml -O
一定要改镜像!打tag
docker tag k8s.gcr.io/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
kubectl apply -f kube-flannel.yml
查看pods是否在运行
root@master:~# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-86c58d9df4-9h9sw 1/1 Running 0 50m
kube-system coredns-86c58d9df4-t9s9d 1/1 Running 0 50m
kube-system etcd-master 1/1 Running 0 49m
kube-system kube-apiserver-master 1/1 Running 0 49m
kube-system kube-controller-manager-master 1/1 Running 0 49m
kube-system kube-flannel-ds-amd64-m89kt 1/1 Running 0 2m24s
kube-system kube-proxy-ln4qs 1/1 Running 0 50m
kube-system kube-scheduler-master 1/1 Running 0 49m
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 52m v1.13.1
--------------master初始化结束
用kubeadm部署node1
注意node也要打flannel的tag
----------------------kubeadm安装dashboard
在master安装dashboard
先拉取镜像
docker pull registry.cn-beijing.aliyuncs.com/kubernetesdevops/kubernetes-dashboard-amd64:v1.10.0
或者用这个:
docker pull registry.cn-shanghai.aliyuncs.com/coolyeah/kubernetes-dashboard-amd64:v1.10.1
再tag一下
docker tag registry.cn-beijing.aliyuncs.com/kubernetesdevops/kubernetes-dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
去github找yaml文件:
https://github.com/kubernetes/dashboard/tree/v1.10.0
把yaml下载下来
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.0/src/deploy/recommended/kubernetes-dashboard.yaml
apply一下
kubectl apply -f kubernetes-dashboard.yaml
查看一下:
kubectl get pods --all-namespaces
发现起不来,再看一下详细情况:
kubectl describe pods kubernetes-dashboard-79ff88449c-w55xl -n kube-system
发现Error:ErrImagePull
Failed to pull image "k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
原来这个在node1上,所以node1,也要这个dashboard的image
可以delete掉:
kubectl delete -f kubernetes-dashboard.yaml
重新apply:
kubectl apply -f kubernetes-dashboard.yaml
查看一下:
kubectl get pods --all-namespaces
kubectl describe pods kubernetes-dashboard-79ff88449c-554h9 -n kube-system
查看一下dashboard暴露的端口:
kubectl get service --namespace=kube-system
准备访问master的443端口:
http://192.168.134.130:443 发现访问不了
可以在161行新增nodePort:31234
164行新增type: NodePort ,用nodePort方式启动
-------比如:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
ports:
- port: 443
targetPort: 8443
nodePort:31234
selector:
k8s-app: kubernetes-dashboard
type: NodePort
-----比如结束
删除dashboard:
kubectl delete -f kubernetes-dashboard.yaml
重建:
kubectl apply -f kubernetes-dashboard.yaml
查看svc:
root@master:~# kubectl get svc --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 26h
kubernetes-dashboard NodePort 10.109.246.38 <none> 443:31234/TCP 3s
访问master机器的31234端口:
https://192.168.2.150:31234
令牌,先要获取令牌:
kubectl get secret -n kube-system
发现kubernetes-dashboard-token-p9kvp
kubectl describe secret kubernetes-dashboard-token-p9kvp -n kube-system
把很长的token输入到web界面里
登陆进去发现有黄色告警信息
vim kube-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
kubectl apply -f kube-user.yml
这次grep admin:
kubectl get secret -n kube-system | grep admin
最后获取令牌:
kubectl describe secret admin-token-q42p6 -n kube-system
登出web,重新用令牌登陆
小技巧:
拉取别人的镜像,放到自己的来云上面。
先pull 如:
docker pull registry.cn-beijing.aliyuncs.com/kubernetesdevops/kubernetes-dashboard-amd64:v1.10.0
再tag:
docker tag registry.cn-beijing.aliyuncs.com/kubernetes-alex/kubernetes-dashboard-amd64:v1.10.0
登陆仓库:
docker login registry.cn-beijing.aliyuncs.com
最后push上去
docker push registry.cn-beijing.aliyuncs.com/kubernetes-alex/kubernetes-dashboard-amd64:v1.10.0
=============================
kubectl命令行工具常用命令运营
# kubectl命令
## 命令行语法
kubectl [command ] [TYPE] [NAME] [flags]
command: create/delete/get/describe/apply
type: 资源对象类型,严格区分大小写。
name: 资源对象的名称,严格区分大小写。
flags: 可选参数 -n 指定namespaces
## 资源对象类型
daemonsets ds
deployments
events ev 事件
endpoints ep
horizontalpodautoscalers hpa 水平扩展
ingresses ing
jobs
nodes no
namespaces ns
pods po
persistentvolumes pv 物理卷
persistentvolumesclaims pvc 物理卷组
resourcequotas quota
replicationcontrollers rc
secerts
service svc
serviceaccounts sa
## 练习
同时查看多种资源对象
```
kubectl get pod/etcd-master.example.com svc/kubernetes-dashboard -n kube-system
```
## kubectl 子命令
annotate 添加或者更新资源对象的信息
apply kubectl apply -f filename 从配置文件更新资源对象
attach kubectl attach pod -c container 链接正在运行的pod
cluster-info kubectl cluster-info 显示集群信息
completion kubectl completion bash 输出shell命令执行后的返回码
config kubectl config get-clusters 修改kubeconfig配置文件
create kubectl create -f kube-user.yml 从配置文件创建资源对象
delete kubectl delete -f kube-user.yml 从配置文件删除资源对象
describe kubectl describe sa 查看资源对象的详细信息
edit kubectl edit sa 编辑资源对象的属性
exec kubectl exec coredns-86c58d9df4-d8x49 ls -n kube-system 执行一个容器中的命令
label kubectl label node node1.example.com a=b 为资源对象创建label标记
------------------------------------------
通过yaml创建pod对象
小技巧:
查看其他pod的情况并用yaml方式显示出来
kubectl edit pod coredns-86c58d9df4-9h9sw -n kube-system
学习怎么写yaml可以查看github kubernetes的handbook
https://github.com/feiskyer/kubernetes-handbook
https://github.com/kubernetes/examples
https://github.com/kubernetes/examples/tree/master/guestbook
小技巧:
改名所有下下来的tag:
for i in `docker images|grep gcr|awk '{print $1":"$2}'|cut -d"/" -f2`;do docker tag k8s.gcr.io/$i registry.cn-shanghai.aliyuncs.com/alexhjl/$i;done
上传到阿里云的镜像仓库:
for i in `docker images |grep shanghai`;do docker push $i;done
创建一个nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.xxx.com/nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
IfNotPresent,当本地镜像不存在时会pull
kubectl create -f nginx.yaml
如果不指定namespace 会在当前的namespace中创建pod
kubectl get pod
查看pod在哪个node运行:
kubectl describe pod nginx
删除pod:
kubectl delete pod nginx 或者 kubectl delete -f nginx.yaml
master节点为什么不运行pod?
因为master节点有个标记,kubectl get node --show-labels 可以显示所有标记
pod的生命周期:
Pending: 记录状态 下载镜像
Running:调度完成
Successed: 程序终止
Failed: 有未终止容器
Unknown:
kubectl先根据yaml定义来创建pod,pod的相关信息存入到etcd上。apiserver返回确认的信息给客户端。apiserver开始查询etcd中的状态变化,调度器就会查看资源对象是否绑定到哪个节点,没有绑定节点就会为pod挑选一个节点,调度到这个节点上来。如果已经定义了绑定到存在的节点中,则调度器调度到节点中,调度成功后把状态结果反馈到etcd。
kubernetes设计理念
pdf 第49页
kubernetes核心技术概念和api对象
pdf第51页
k8s核心组件与通信端口
pdf58页
kube-apiserver原理分析:
kubectl api-versions //查询api支持的版本
root@master:~# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
kubectl api-resources --api-group=apps/v1 //查询资源对象
kubectl get --raw /api/v1/namespaces
kubectl proxy --port=8080 & //开启本地代理网关,也可以不加--port=8080
----------------------------
kubernetes scheduler
负责pod的生命周期中的后半部分。
通过apiserver查询未分配node的pod,根据调度策略调度pod。
通常通过RC/Deployment/Daemonset/Job完成pod的调度。
scheduler工作原理:
1.API创建新的pod
2.Controller Manager 补充pod的副本
3.Scheduler 按照特定的调度算法绑定到集群中匹配的node上
4.绑定成功,将绑定信息写入etcd
scheduler节点调度:
nodeSelector(定向调度):
调度到label匹配的node节点中
nodeAffinity(亲和性调度):
调度到label匹配的node节点中(可以设置优选,匹配更丰富)
requiredDuringSchedulingRequiredDuringExecution(类似于selector)
requiredDuringSchedulingIgnoredDuringExecution (满足条件)
preferredDuringSchedulingIgnoredDuringExecution(优选条件)
podAffinity:
调度到匹配的pod运行的node节点中。
nodeAffinity
requiredDuringSchedulingRequiredDuringExecution: 当pod不满足条件时,系统将从该node上移除之前调度的pod。
requiredDuringSchedulingIgnoredDuringExecution:与上面类似,区别: 当node条件不满足时,系统不一定要从该node上移除之前调度的pod。
preferredDuringSchedulingIgnoredDuringExecution: 指定在满足调度条件的node中,那些node应该更优先的进行调度。 同时当node不满足条件时,系统不一定从移除之前调度的pod。
给node节点创建label标记
kubectl label nodes node01.example.com cpucounts=four
查看node的标记
kubectl get nodes --show-labels
在资源对象中添加调度设置
spec:
nodeSelector:
cpucounts: four
实验步骤:
1.创建一个pod,添加调度信息。
2.查看pod的运行状态
3.给node节点创建匹配的label
4.验证pod运行正常
如果没有匹配的node,Pod状态将会一直处于pending状态。
cat nodeselector_nginx.yaml 上面给node01带了个标签cpucounts=four,这里就会匹配到
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
nodeSelector:
cpucounts: four
containers:
- name: nginx
image: docker.io/library/nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
kubectl apply -f nodeselector_nginx.yaml
如果不启动,describe一下看详细情况
kubectl describe pod nginx
cat nodeAffinity-R.yaml 当前pod调度到拥有标签area=test1/test2的节点上
apiVersion: v1
kind: Pod
metadata:
name: testschduler
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: area
operator: In
values:
- test1
- test2
containers:
- name: myapp
image: nginx
requiredDuringSchedulingIgnoredDuringExecution:
1.值为一个对象列表,由一个到多个nodeSelectorTerm定义的对象组成。
2.多个nodeSelectorTerm之间只要满足其中一个即可。
nodeSelectorTerm:
1.用于定义节点选择器条目,由一个或多个matchExpressions对象定义的匹配规则组成。
2.规则之间 逻辑与关系,必须满足一个nodeSelectorTerm下的所有matchExpressions。
matchExpressions:
由一个或多个标签选择器组成
operator:
标签选择器表达式中的操作符
常用: In NotIn Exists DoesNotExist Lt Gt
cat nodeAffinity-P.yaml
apiVersion: v1
kind: Pod
metadata:
name: testschduler
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- wight: 90
preference:
matchExpressions:
- key: area
operator: In
values:
- test1
- test2
- wight: 80
preference:
matchWxpressions:
- key: vm
operator: Exists
values: []
containers:
- name: myapp
image: nginx
当前pod调度到拥有标签
area=test1/test2 或者存在vm标签的节点上。
wight=170 area=test1 vm=true
wight=90 area=test1
wight=80 vm=true
cat podAffinity-R.yaml
apiVersion: v1
kind: Pod
metadata:
name: testschduler
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: area
operator: In
values:
- test1
- test2
topologyKey: kubernetes.io/hostname
通过labelSelector选择pod,根据pod对象所在
--------------------------------------------
Controller manager
由kube-controller-manager 和cloud-controller-manager组成。
controller manager是 kubernetes的大脑。
通过apiserver监控整个集群的状态,确保符合预期状态。
Metrics 度量: (性能参数)
controller manager metrics 提供了控制器内部逻辑的性能度量。
默认监听 10252端口(prometheus)
Go语言运行时度量
etcd请求延时
云服务提供商API请求延时
访问: http://localhost:10252/metrics
------------------------------------------------
kubelet
每个节点都运行一个kubelet进程,默认端口10250。
接受并执行master发来的指令,管理pod和其中的容器。
每个kubelet都会向apiserver注册自身信息。
定期向master节点汇报当前节点的情况。
通过cAdvisor监控节点和容器的资源。
kubelet监听10250端口
容器健康检查:
LivenessProbe探针
用于判断容器是否健康。如果探测不健康则通过kubelet删除该容器。
如果一个容器不包含探针kubelet会认为值为success。
ReadinessProbe
用于判断容器是否启动完成且准备接收请求。如果探测到失败,则pod的状态被修改。
来诊断容器的健康状态。kubelet定期调用容器中的livenessprobe探针
实现方式
ExecAction: 在容器内部执行一条命令,如果退出状态码为0,则表明容器健康。
TCPSocketAction: 通过容器的IP地址和端口号执行TCP检查,如果端口能够被访问则表明容器健康。
HTTPGetAction: 通过容器的IP地址和端口及路径调用HTTP GET方法,如果状态码大于等于200且小于400,则认为容器健康。
cAdvisor资源监控:
一个开源的分析容器资源使用率和性能特性的代理工具。
自动查找所有在其所在的节点上的容器,自动采集CPU、内存、文件系统和网络使用的统计信息。
cAdvisor通过其所在的节点机的4194端口暴露一个UI。
cr容器运行时:container runtime
容器运行时是Kubernetes最重要的组件之一。
负责真正管理镜像和容器的生命周期。
kubelet通过CRI与容器运行时交互,以管理镜像和容器。
获取node的性能指标
看看各node上面有没有10255端口,如果没启动的话。
可以修改
vim /var/lib/kubelet/kubeadm-flags.env
加入
--read-only-port=10255
完整行:
KUBELET_KUBEADM_ARGS=--read-only-port=10255 --cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --resolv-conf=/run/systemd/resolve/resolv.conf
systemctl restart kubelet
或者:
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
添加一行
Environment="KUBELET_API=--read-only-port=10255"
修改一行
ExecStart=/usr/bin/kubelet $KUBELET_API $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
完整文件:-------------完整文件开始
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
Environment="KUBELET_API=--read-only-port=10255"
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_API $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
------------------------完整文件结束
systemctl daemon-reload
systemctl restart kubelet
最后就能通过链接获取该主机的所有状态性能
curl 192.168.2.151:10255/stats/summary
--------------------------------------------------------------------------------
docker视频教程
-------------------------------
Prometheus视频
https://github.com/aaron111com/Jenkinsdocs/blob/master/chapter/Prometheus%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2+%E7%9B%91%E6%8E%A7+%E7%BB%98%E5%9B%BE+%E5%91%8A%E8%AD%A6.md
1.安装node_export在/usr/local
tar zxvf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/node_exporter-0.18.1.linux-amd64/node_exporter
[Install]
WantedBy=multi-user.target
systemctl start node_export
systemctl status node_exporter
systemctl enable node_exporter
netstat -ntulp| grep 9100 #node_exporter 监听9100端口
浏览器可以访问http://192.168.2.150:9100/metrics
2.安装prometheus
tar zxvf prometheus-2.12.0.linux-amd64.tar.gz -C /usr/local/
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/prometheus-2.12.0.linux-amd64/prometheus --config.file=/usr/local/prometheus-2.12.0.linux-amd64/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.external-url=http://0.0.0.0:9090
[Install]
WantedBy=multi-user.target
systemctl start prometheus
netstat -ntulp| grep 9090
systemctl enable prometheus
静态配置添加一台主机:
vim /usr/local/prometheus-2.12.0.linux-amd64/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# add custom monitor job,monitor node_exporter 通过静态方式添加一台主机,监控node_expoter
- job_name: "my target"
static_configs:
- targets: ['localhost:9100']
添加完,重启prometheus
systemctl restart prometheus
打开浏览器页面
http://192.168.2.150:9090
访问status->targets
服务发现:
动态发现,事业云环境,动态伸缩,迅速配置。
kubernetes为例:
需要配置api的地址和认证凭据。
prometheus一直监听集群的变化
获取新增/删除集群中机器的信息,并更新采集对象列表。
prometheus数据存储:
本地存储:通过自带的时序数据库将数据保存到本地的磁盘。
远端存储:适用于存储大量的监控数据,支持opentsdb,influxdb,elasticsearch等后端存储。通过适配器实现存储的远程读写接口,便可以监控。
安装grafana
https://mirrors.tuna.tsinghua.edu.cn/help/grafana/
Debian / Ubuntu 用户
首先信任 https://packages.grafana.com/ 的 GPG 公钥:
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
确保你的 apt 支持 HTTPS:
sudo apt-get install -y apt-transport-https
选择你希望安装的 Grafana 版本(与你的 Debian/Ubuntu 系统版本无关),文本框中内容写进 /etc/apt/sources.list.d/grafana.list
你的 Grafana 版本:
deb https://mirrors.tuna.tsinghua.edu.cn/grafana/apt/ stable main
安装 Grafana
sudo apt-get update
sudo apt-get install grafana
启动:
systemctl start grafana-server
访问3000端口
192.168.2.150:3000
添加数据源
Prometheus,黏贴地址,dashboard里导入3个
访问这个装主机监控插件,监控cpu,内存,磁盘,网络
https://grafana.com/dashboards/9276
导入grafana:
选择dashboard
import,然后导入json。
数据告警:
alertmanager
tar zxvf alertmanager-0.19.0.linux-amd64.tar.gz -C /usr/local/
cat /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager-0.19.0.linux-amd64/alertmanager --config.file=/usr/local/alertmanager-0.19.0.linux-amd64/alertmanager.yml
[Install]
WantedBy=multi-user.target
systemctl start alertmanager
systemctl enable alertmanager
netstat -ntulp| grep 9093
浏览器访问http://192.168.2.150:9093
修改Prometheus的配置文件:
root@master:/usr/local/prometheus-2.12.0.linux-amd64# cat prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093 #修改成alertmanager的地址
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "rules/host_rules.yml" #新建文件夹rules和下面yml
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# add custom monitor job,monitor node_exporter
- job_name: "my target"
static_configs:
- targets: ['localhost:9100']
mkdir rules
vim rules/host_rules.yml
groups:
- name: 'Linux Instances'
rules:
- alert: InstanceDown
expr: up == 0
for: 5s
labels:
severity: page
# Prometheus templates apply here in the annotation and label fields of the alert.
annotations:
description: 'has been down for more than 5 s.'
重启Prometheus
systemctl restart prometheus
这时候把node_exporter关掉
systemctl stop node_exporter
prometheus的界面就会报警
如果要配置邮件报警:
alertmanager需要配置一下,
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'xxxxx@qq.com'
smtp_auth_username: 'xxxx@qq.com'
smtp_auth_password: 'xxxkbpfmygbecg'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'toemail'
receivers:
- name: 'toemail'
email_configs:
- to: 'xxxxx@qq.com'
send_resolved: true
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
systemctl restart alertmanager