常用操作命令
常规命令
1 | # 设置主机名 |
kubernetes node 常用操作命令
1 | #设置node 不可调度 |
如何调整网络插件
calico网络插件调整,原本没使用IPIP模式,现在需要使用CrossSubnet
1 | #先删除原本的calico插件 |
如何将kubeProxy的iptables修改为ipvs
1. 加载内核模块
查看内核模块是否加载1
lsmod|grep ip_vs
如果没有加载,使用如下命令加载ipvs相关模块1
2
3
4
5modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
2. 更改kube-proxy配置
1 | kubectl edit configmap kube-proxy -n kube-system |
找到并修改如下部分的内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21enableProfiling: false
healthzBindAddress: 0.0.0.0:10256
hostnameOverride: ""
iptables:
masqueradeAll: false
masqueradeBit: 14
minSyncPeriod: 0s
syncPeriod: 30s
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: "" #=========================> 为空表示默认的负载均衡算法为轮询, rr, wrr, lc, wlc, sh, dh, lblc...
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: iptables #=========================> 修改此处为ipvs
nodePortAddresses: null
oomScoreAdj: -999
portRange: ""
resourceContainer: /kube-proxy
udpIdleTimeout: 250ms
编辑完,保存退出
3. 删除所有kube-proxy的pod
1 | kubectl delete pod $(kubectl get pod -n kube-system | grep kube-proxy | awk -F ' ' '{print $1}') -n kube-system |
4. 查看kube-proxy的pod日志
1 | kubectl logs kube-proxy-xxx -n kube-system |
5. 安装ipvsadm
使用ipvsadm查看ipvs相关规则,如果没有这个命令可以直接yum安装1
yum install ipvsadm
kubelet GC 机制及对应配置
可通过kubelet gc的能力来自动清理无用的container以及image,从而来释放磁盘空间。kubelet会启动两个GC,分别回收container和image。其中container的回收频率为1分钟一次,而image回收频率为2分钟一次。
容器GC
退出的容器也会继续占用系统资源,比如还会在文件系统存储很多数据、docker 应用也要占用 CPU 和内存去维护这些容器。docker 本身并不会自动删除已经退出的容器,因此 kubelet 就负起了这个责任。kubelet 容器的回收是为了删除已经退出的容器以节省节点的空间,提升性能。容器 GC 虽然有利于空间和性能,但是删除容器也会导致错误现场被清理,不利于 debug 和错误定位,因此不建议把所有退出的容器都删除。因此容器的清理需要一定的策略,主要是告诉 kubelet 你要保存多少已经退出的容器。和容器 GC 有关的可以配置的 kubelet 启动参数
/var/lib/kubelet/config.yaml
MinimumGCAge
:container 结束多长时间之后才能够被回收,默认是一分钟MaxPerPodContainerCount
:每个 container 最终可以保存多少个已经结束的容器,默认是 1,设置为负数表示不做限制MaxContainerCount
:节点上最多能保留多少个结束的容器,默认是 -1,表示不做限制
gc的步骤如下:
- 获取可以清除的容器,这些容器都是非活动的,并且创建时间比 gcPolicy.MinAge 要早
- 通过强制执行 gcPolicy.MaxPerPodContainer,为每个pod删除最老的死亡容器
- 通过强制执行 gcPolicy.MaxContainers 来移除最老的死亡容器
- 获取未准备好且不包含容器的可清除沙箱
- 移除可移除的沙箱
镜像GC
镜像主要占用磁盘空间,虽然 docker 使用镜像分层可以让多个镜像共享存储,但是长时间运行的节点如果下载了很多镜像也会导致占用的存储空间过多。如果镜像导致磁盘被占满,会造成应用无法正常工作。docker 默认也不会做镜像清理,镜像一旦下载就会永远留在本地,除非被手动删除。其实很多镜像并没有被实际使用,这些不用的镜像继续占用空间是非常大的浪费,也是巨大的隐患,因此 kubelet 也会周期性地去清理镜像。镜像的清理和容器不同,是以占用的空间作为标准的,用户可以配置当镜像占据多大比例的存储空间时才进行清理。清理的时候会优先清理最久没有被使用的镜像,镜像被 pull 下来或者被容器使用都会更新它的最近使用时间。启动 kubelet 的时候,可以配置这些参数控制镜像清理的策略
/var/lib/kubelet/config.yaml
imageMinimumGCAge
:镜像最少多久没有被使用才会被清理imageGCHighThresholdPercent
:磁盘使用率的上限,当达到这一使用率的时候会触发镜像清理。默认值为 90%imageGCLowThresholdPercent
:磁盘使用率的下限,每次清理直到使用率低于这个值或者没有可以清理的镜像了才会停止.默认值为 80%
也就是说,默认情况下,当镜像占满所在盘 90% 容量的时候,kubelet 就会进行清理,一直到镜像占用率低于 80% 为止。
使用kubeadm进行cluster升级
使用kubeadm 安装好后kubernetes,后续如何进行升级,升级 kubernetes集群,只能逐版本升级。只能从 1.12 升级到 1.13 而不能从 1.1 直接升级到 1.13,升级步骤: 1.11—>1.12—>1.13—>1.14
需要注意的地方是,kubernetes从1.11版本开始变化比较大,CoreDNS已作为默认DNS。/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
中的环境变量被分配为三个文件:/var/lib/kubelet/config.yaml
(其中cgroup驱动默认cgroupfs)、/var/lib/kubelet/kubeadm-flags.env
(cgroup驱动默认systemd,优先权)、/etc/sysconfig/kubelet
全新安装的kubernetes集群是有网络CNI配置的,升级安装的是没有CNI配置的,配置文件/var/lib/kubelet/kubeadm-flags.env
。依赖的镜像tag抬头从gcr.io/google_containers
变成k8s.gcr.io
,升级基本使用gcr.io/googlecontainers,全新安装则使用k8s.gcr.io
><
从1.8开始为kube-proxy组件引入了IPVS模式,1.11版本开始正式支持IPVS,默认不开启,1.12以上版本默认开启,不开启则使用iptables模式
准备升级镜像
提前准备好升级所需的镜像image,并打成官方标准tag。
master节点需要所有镜像,node节点仅需要proxy、pause镜像
在所有Master节点下载各版本镜像
1 | #1.12.7 |
Node节点下载各版本镜像
1 | #k8s.gcr.io/kube-proxy:v1.12.7 |
1.11.6升级到1.12.7
master节点(使用内部etcd)
前置准备
1 | #在所有master节点上执行以下命令 |
开始master升级
1 | #设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度 |
master节点(使用外部etcd)
1 | #在所有master节点上执行以下命令 |
node节点
1 | #设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度 |
1.12.7升级到1.13.5
master节点(使用内部etcd)
前置准备
1 | #修改当前节点的configmap/kubeadm-config ClusterConfiguration值 |
开始升级master
1 | #设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度 |
master节点(使用外部etcd)
1 | #设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度 |
node节点
1 | #设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度 |
1.13.5升级到1.14.0
如果使用的外部的etcd则进行如下操作
Modify configmap/kubeadm-config
for this control plane node by removing the etcd section completely
1 | #修改当前节点的configmap/kubeadm-config ClusterConfiguration值 |
1 | # Please edit the object below. Lines beginning with a '#' will be ignored, |
master节点
升级第一个控制平面(mater1)
1 | #安装对应的组件 |
升级其他控制平面(mater2、master3)
1 | #安装对应的组件 |
node节点(node1、node2、node3 …)
升级kubeadm
1 | yum install -y kubeadm-1.14.x-0 --disableexcludes=kubernetes |
驱除节点上的容器并让节点不可调度
1 | kubectl drain $WORKERNODE --ignore-daemonsets |
升级 kubelet 配置
1 | kubeadm upgrade node config --kubelet-version v1.14.0 |
升级 kubelet 与 kubectl
1 | yum install -y kubelet-1.14.x-0 kubectl-1.14.x-0 --disableexcludes=kubernetes |
验证集群的状态
1 | kubectl get node |
1.14.0升级到1.15.0
如果使用的外部的etcd则进行如下操作
Modify configmap/kubeadm-config
for this control plane node by removing the etcd section completely
1 | #修改当前节点的configmap/kubeadm-config ClusterConfiguration值 |
1 | # Please edit the object below. Lines beginning with a '#' will be ignored, |
master节点
升级第一个控制平面(mater1)
1 | #安装对应的组件 |
升级其他控制平面(mater2、master3)
1 | #安装对应的组件 |
node节点(node1、node2、node3 …)
升级kubeadm
1 | yum install -y kubeadm-1.15.x-0 --disableexcludes=kubernetes |
驱除节点上的容器并让节点不可调度
1 | kubectl drain $WORKERNODE --ignore-daemonsets |
升级 kubelet 配置
1 | kubeadm upgrade node |
升级 kubelet 与 kubectl
1 | yum install -y kubelet-1.15.x-0 kubectl-1.15.x-0 --disableexcludes=kubernetes |
验证集群的状态
1 | kubectl get node |
1.15.0升级到1.16.0
如果使用的外部的etcd则进行如下操作
Modify configmap/kubeadm-config
for this control plane node by removing the etcd section completely
1 | #修改当前节点的configmap/kubeadm-config ClusterConfiguration值 |
master节点
升级第一个控制平面(mater1)
1 | #安装对应的组件 |
升级其他控制平面(mater2、master3)
1 | #安装对应的组件 |
node节点(node1、node2、node3 …)
升级kubeadm
1 | yum install -y kubeadm-1.16.x-0 --disableexcludes=kubernetes |
驱除节点上的容器并让节点不可调度
1 | kubectl drain $WORKERNODE --ignore-daemonsets |
升级 kubelet 配置
1 | kubeadm upgrade node |
升级 kubelet 与 kubectl
1 | yum install -y kubelet-1.16.x-0 kubectl-1.16.x-0 --disableexcludes=kubernetes |
验证集群的状态
1 | kubectl get node |
1.16.0升级到1.17.0
同1.15.0到1.16.0的升级
1.17.0升级到1.18.0
同1.15.0到1.16.0的升级
参考:
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-12/
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-13/
https://github.com/truongnh1992/upgrade-kubeadm-cluster
kubeadm init config 配置
kubeadm v1.12
1 | apiVersion: kubeadm.k8s.io/v1alpha3 |
traefik如何设置路由
http://yunke.science/2018/03/28/Ingress-traefik/
etcd 3.2.x -> 3.3.x
1 | #先进行备份 |
参考资料:
https://www.jianshu.com/p/aa528c57f3be
Coredns 相关操作
如何使用外部dns解析
1 | apiVersion: v1 |
如何给kubernetes service做cname解析
coredns 配置文件
1 | { |
coredns deployment
1 | "volumes": [ |
参考链接:
https://www.cnblogs.com/netonline/p/9935228.html
https://yuerblog.cc/2018/12/29/k8s-dns/#post-4008-_Toc533670192
https://github.com/coredns/coredns.io/blob/master/content/blog/custom-dns-and-kubernetes.md