老婆出轨 发表于 7 天前

Kubernetes 系列 | k8s入门运维

一、K8S集群搭建

1.1 部署方式



[*]kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群
[*]二进制
从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群
1.2 了解kubeadm

kubeadm 通过实行须要的操纵来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是准备节点环境的工作:


[*]kubeadm init 启动一个 Kubernetes 主节点
[*]kubeadm join 启动一个 Kubernetes 工作节点而且将其到场到集群
[*]kubeadm upgrade 更新一个 Kubernetes 集群到新版本
[*]kubeadm config 管理集群的配置
[*]kubeadm token 使用 kubeadm join 来管理令牌
[*]kubeadm reset 还原之前使用 kubeadm init 或者 kubeadm join 对节点产生的改变
[*]kubeadm version 打印出 kubeadm 版本
[*]kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈
1.3 部署流程

v1.25搭建直通车
下文的流程只是参考并不是可实操的文档,若需要部署请使用上文。
https://i-blog.csdnimg.cn/direct/0074a3f468e4461b97c066325274fc2f.png
1.3.1 初始化配置


[*]关闭防火墙、selinux、swap
#关闭防火墙
systemctl stop firewalld &&systemctl disable firewalld
#关闭 SELinux
getenforce
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭 swap 分区
free -h
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

[*]设置主机名
#设置主机名   
hostnamectl set-hostname <hostname>

[*]挂载存储
etcd盘
docker盘
kubelet盘

[*]内核参数调优
将桥接的 IPv4 流量传递到 iptables 的链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
其他参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.ip_local_port_range = 40000 60000
vm.swappiness = 0
kernel.pid_max = 655350

[*]时间同步
手动同步
ntpdate
chrony
1.3.2 安装容器运行时


[*]安装CRI
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
yum -yimstalldocker-ce/containerd

[*]调整cgroups驱动
$ cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

[*]启动并开机自启
systemctl enable docker && systemctl start docker
1.3.3 安装K8S软件包


[*]添加K8S的yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF

name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

[*]安装kubeadm、kubelet、kubectl
dnf install -y kubelet-1.25.7 kubeadm-1.25.7 kubectl-1.25.7 \
                --disableexcludes=kubernetes

[*]设置开机自启
systemctl enable --now kubelet
1.3.4 创建集群


[*]初始化控制平面节点
kubeadm init \
--apiserver-advertise-address=192.168.100.10 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.25.7 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0 # 如果不设置为 0 ,默认的 token 有效期是 24 小时

[*]拷贝配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

[*]到场节点
kubeadm join 10.10.102.224:6443 --token mu567i.b2e80ic54vhr13yl \
--discovery-token-ca-cert-hash sha256:f812c6b9e157ee6c0bd11d85f59252fd8b33f349af30167738aa766442d77e33
#重新生成token
kubeadm token create --print-join-command

[*]部署网络插件
wget https://projectcalico.docs.tigera.io/v3.25/manifests/calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -n kube-system

二、集群高可用

1.1 集群高可用-堆叠

https://i-blog.csdnimg.cn/direct/dcb8c6d3518a403894e7e93ade66ac8d.png
1.2 集群高可用-集群外etcd

https://i-blog.csdnimg.cn/direct/53cc8f1b1af74283892d222252f46134.png
三、Pod运维

3.1 Pod运维

https://i-blog.csdnimg.cn/direct/274cfecc30884b2f827821ca4d21caa9.png
https://i-blog.csdnimg.cn/direct/fea71170b9b845bdac95432d3e7e4ac4.png
3.2 Pod的生命周期

https://i-blog.csdnimg.cn/direct/7a90c80ad772471aadd78c2400d9f269.png
3.3 Pod状况

简介
可以通过查看Pod的Condition列表了解更多信息,pod的Condition指示pod是否已达到某个状态,以及为什么会这样,与状态相反,一个Pod同时具有多个Conditions
pod的条件表
Pod Condition描述PodScheduled表现pod是否已调度到节点InitializedPod的 init容器都已成功完成ContainersReadyPod 中所有容器都已停当ReadyPod 可以为哀求提供服务,而且应该被添加到对应服务的负载均衡池中 表现Pod的状况

kubectl describe po <pod-name> -n <namespace> | grep Conditions: -A5
3.4 Pod阶段

简介
Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简朴宏观概述。 该阶段并不是对容器或 Pod 状态
的综合汇总,也不是为了成为完整的状态机。
pod的条件表
https://i-blog.csdnimg.cn/direct/d548d8372ce44366b119ecdab49dfb6b.png
表现Pod的阶段
kubectl get po <pod-name> -n <namespace> -o yaml | grep phase:
3.5 容器状态

https://i-blog.csdnimg.cn/direct/eda2dab766cf4230b908074901255d2c.png
3.6 Pod调度

影响Pod调度
https://i-blog.csdnimg.cn/direct/a674af507ce941e4a295ffe551f82045.png
3.7 Pod排错

排错过程中常用命令
查看 Pod 状态: kubectl get pod <pod-name> -n <namespace> -o wide
查看 Pod 的 yaml 配置: kubectl get pod <pod-name> -n <namespace> -o yaml
查看 Pod 事件: kubectl describe pod <pod-name> -n <namespace>
查看容器日志: kubectl logs -f <pod-name> [-c <container-name>] -n <namespace> --tail=10
查看上一个退出容器日志:kubectl logs <pod-name> [-c <container-name>] -n <namespace> -p
3.8 Pod状态

https://i-blog.csdnimg.cn/direct/2c547a8c72d144a3a88e50e14b44eb82.png
Pod状态-Pending
https://i-blog.csdnimg.cn/direct/d614792150c24a2c9032334b5fe80fab.png
Pod状态- ContainerCreating 或Waiting
https://i-blog.csdnimg.cn/direct/afc07e3699be442b9c1a53e9c806fa7d.png
Pod状态-CrashLoopBackOff
https://i-blog.csdnimg.cn/direct/07787442856f4209a7bebd69c8ea2d26.png
Pod状态-ImagePullBackOff
https://i-blog.csdnimg.cn/direct/16732e1e12eb4d0f9c71b157c0b33fa5.png
四、Node运维

主机上线
https://i-blog.csdnimg.cn/direct/05742e79fa454193956c970c1f536d19.png
主机下线
https://i-blog.csdnimg.cn/direct/be0e4efc4c02449bae037f2eec014580.png
主机重定名

[*]备份节点yaml文件
kubectl get node -o yaml > nodename.yaml
[*]节点下线
[*]清理数据
清理iptables/IPVS表
iptables:iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvs:ipvsadm -C
清理calico数据
rm -rf /var/lib/calico
[*]设置节点名称
[*]到场集群
kubeadm join xxx
[*]规复节点标签和污点信息
kubectl edit node
主机标签污点管理


[*]标签管理
查看主机标签:kubectl get node --show-labels
添加主机标签:kubectl label node key=value
移除主机标签:kubectl label node key-


[*]污点管理
查看主机污点:kubectl describe node
添加主机污点:kubectl taint node key=value:污点策略
移除主机污点:kubectl taint node key-


[*]污点策略
NoSchedule : 肯定不被调度
PreferNoSchedule : 只管不被调度
NoExecute : 不会调度,而且还会驱逐Node已有Pod
主机通例处置惩罚


[*]内存清理
在当前节点上使用命令free -g 查看内存使用环境
使用命令清理:echo 1 > /proc/sys/vm/drop_caches


[*]主机重启
优先做POD驱逐,如果驱逐不了直接停止该节点上的kubelet和docker。
kubectl drain nodename
systemctl stop kubelet
systemctl stop docker
然后使用命令reboot


[*]主机镜像清理
docker image prune -a


[*]CPU非常
查看主机使用环境:top
查看各个进程CPU使用环境
查看非常进程具体实行命令,判断非常进程属于哪个服务,实行命
令:cat /proc/非常进程的PID/cmdline
反馈进程相干方


[*]主机僵尸进程
[*]查看主机僵尸是否存在
在当前节点上使用命令 top


[*]查看主机僵尸
如果存在僵尸进程,找到相干进程:ps -e | grep defunct


[*]查看主机僵尸
实验找到僵尸进程的父进程,如果不是父进程Pid不为1,通过kill掉父进程,实行命令:kill -9 父进程Pid,从而处置惩罚僵尸
进程;但僵尸进程的父进程若为1,或者没有父进程,需要重启题目呆板


[*]主机不可用
查看非常节点
kubectl get node -owide | grep NotReady
查看节点非常信息
kubectl describe node
https://i-blog.csdnimg.cn/direct/216b015cbea54a8994caec5251fb81e9.png
查看主机相干组件状态
systemctl status docker/kubelet
查看主机相干组件日记
journalctl -u docker/kubelet -f
tail -f /var/log/message
五、Etcd运维

etcd命令一


[*]设置v版本的API
export ETCDCTL_API=3


[*]查看ETCD高可用集群康健状态
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 endpoint health
https://i-blog.csdnimg.cn/direct/6dc43168602c4c9c8441807b8daf7826.png


[*]查看etcd高可用集群列表
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member list
https://i-blog.csdnimg.cn/direct/bdb4a3878bcb446bb350a9c5728fc8b6.pngetcd命令二


[*]查看etcd高可用集群leader
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 endpoint status
https://i-blog.csdnimg.cn/direct/a6e5c20107ca464fa7c68784cb38f229.png


[*]删除成员
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member remove <MEMBER_ID>


[*]添加成员
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 member add <etcd_name> <etcd_http_port>
etcd命令三


[*]Etcd集群性能检查
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt –
key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=:2379,:2379,
:2379 check perf
https://i-blog.csdnimg.cn/direct/4a3880c7564a4d28adb170c873c5ba23.png


[*]检查结果
实行返回failed表现集群状况不佳
Etcd 数据备份


[*]数据备份
backpath=/data/etcdbackup/
respath=/var/lib/etcd/
mkdir -p /data/etcdbackup/
etcdendpoints=“localhost:2379”
backupfile=“$now.snapshot.db”
export ETCDCTL_API=3
etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/peer.crt --key
/etc/kubernetes/pki/etcd/peer.key --endpoints $etcdendpoints snapshot save                                    b                         a                         c                         k                         p                         a                         t                         h                         /                              backpath/                  backpath/backupfile
Etcd 数据规复


[*]停etcd服务
mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/


[*]备份数据
mv /var/lib/etcd /var/lib/etcd.bak


[*]规复数据
etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/peer.crt --key
/etc/kubernetes/pki/etcd/peer.key snapshot restore
<备份文件> --name= --initial-cluster==https://:2380,
=https://:2380,=https://:2380 --initialadvertise-peer-urls=https://:2380 --data-dir=/var/lib/etcd
–data-dir表现etcd数据目录
–name表现etcd集群节点名,一样平常为主机名也可以是其他,不辩论即可
–initial-advertise-peer-urls表现当前节点ip地址
–initial-cluster表现集群各个节点信息


[*]规复etcd服务
mv /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
六、Corndns运维

k8s DNS运维


[*]Kubernetes 中 Pod 的 DNS 策略有四种类型。
1.Default:Pod 继承所在主机上的 DNS 配置;
2.ClusterFirst:K8s 的默认设置;先在 K8s 集群配置的 coreDNS 中查询,查不到的再去继承自主机的上游
nameserver 中查询;
3.ClusterFirstWithHostNet:对于网络配置为 hostNetwork 的 Pod 而言,其 DNS 配置规则与 ClusterFirst 一致;
4.None:忽略 K8s 环境的 DNS 配置,只认 Pod 的 dnsConfig 设置。


[*]resolv.conf
在部署 pod 的时间,如果用的是 K8s 集群的 DNS,那么 kubelet 在起 pause 容器的时间,会将其 DNS 剖析配置初始化成集群内的配置。
https://i-blog.csdnimg.cn/direct/11cc819c98884135bfaf8e207430ed0e.png
coredns 常见题目
[*]添加自界说host
编辑configmap:kubectl edit cm coredns -n kube-system
https://i-blog.csdnimg.cn/direct/22eb6ea25200485c80af1de594cf8aa7.png


[*]添加集群外dns地址
方式一:修改coredns主机上/etc/resolv.conf
重启coredns
方式二:修改配置将forward改为proxy:
kubectl edit cm coredns -n kube-system


[*]对dns抓包
1.corednsPod所在的主机,查看coredns的网卡:
route -n
2.对网卡进行抓包
tcpdump -i <网卡> udp and port 53 -w dns.pcap
https://i-blog.csdnimg.cn/direct/03d8d0f991a14035a50fffa5ba8d45be.png
七、Ingress-controller运维

https://i-blog.csdnimg.cn/direct/cbe185603a6a4306830e5d5fc01c2fbb.png
ingress控制器借助service的服务发现机制实现配置的动态更新以实现Pod的负载均衡机制实现
排查命令
查看ingress-controller日志
kubectl logs -f -n kube-system <pod-name> --tail=10
查看应用访问日志
kubectl exec -it -n kube-system <pod-name> bash
cd /var/log/nginx/
查看nginx错误日志
kubectl exec -it -n kube-system <pod-name> bash
tail -f /var/log/nginx/error.log
查看nginx配置
kubectl exec -it -n kube-system <pod-name> bash
more /etc/nginx/nginx.conf
查看nginx后端服务
需额外开启对应端口:--status-port(http 10246) --stream-port(tcp/udp 10247)
八、Calico运维

Node之间是否允许IPIP协议通过:
在master上 ping calico pod的ip,calico的ipip数据抓包命令为:tcpdump -i 物理网卡 ip proto 4 -n
其中ip proto 4为 ipip的协议号
https://i-blog.csdnimg.cn/direct/1efc482ae6b748ee936404bb2acfadbd.png
https://i-blog.csdnimg.cn/direct/8d2b4de730404ecd945790e99e162535.png如果抓不到数据包,说明Node之间没有放开IPIP数据包。
检查calico相干的pod的状态是否正常:
calico-node所包含的pod必须为running和ready状态
https://i-blog.csdnimg.cn/direct/477a522f7afd49429b6bb54a2ca86d20.png
calico 网络常见排查思路
检查kubelet辨认的NodeIP是否精确:
kubelet自动检测本机网卡的IP,偶然会辨认错误的IP地址,比方docker网卡的地址当做NodeIP
kubec get node -o wide
检查Calico 辨认的Node IP是否与Kubelet辨认的NodeIP 一致:
在calicoctl所在的Pod中,实行calicoctl get node -o wide
如果出现不一致,可以通过修改calico-node ds的环境变量来配置,图例ens33是网卡名,根据实际环境修改也支持模糊匹配,顺序匹配,比如:
-name: IP_AUTODETECTION_METHOD
value: interface=ens*,enp1sd*
或者
-name: IP_AUTODETECTION_METHOD
value: interface=ens33,eth0 #表明先找ens33网卡,找不到
就找eth0网卡
https://i-blog.csdnimg.cn/direct/f91419f0fca9401c991e565d18c91c36.png
刷新iptables,在Pod无法ping通的Node上刷新iptables规则:
由于可能存在遗留的iptables导致calico无法访问
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -P FORWARD ACCEPT
查BGP连接状态:
使用netstat -optn|grep 179,查看master与其他node的连接状态是否存在,是否为established
检查建立BGP连接的IP地址是否正确,有时候因为有些Node存在虚IP,或者多网卡会导致建立的BGP连接状态不对。
检查是否关闭源地址校验:
执行sysctl -a | grep rp_filter检查是否关闭地址校验,期望值为0
如果不为0则将下面俩行添加至/etc/sysctl.conf,添加完成后执行sysctl -p
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

检查selinux&firewalld是否关闭:
selinux及firewalld未关闭可以造成节点ping的通但通过curl或Telnet无法访问端口
1、实行sestatus查看是否关闭selinux,期望selinux关闭状态
如果selinux开启状态则实行setenforce 0暂时关闭,永久关闭selinux方法如下:
编辑 /etc/sysconfig/selinux 将SELINUX=enforcing修改成SELINUX=disabled,保持并重启服务器生效
2、实行systemctl status firewalld查看防火墙是否关闭,期望防火墙关闭状态
检查如黑果洞防路火由墙:开启状态,则实行systemctl stop firewalld && systemctl disable firewalld
跨主机访问报错:Failed to connect to 10.xxx.xx.232: Invalid argument,这种错一样平常都是黑洞路由导致的,可以检查
各个主机路由信息
办理方法:修改成精确的blackhole 路由
https://i-blog.csdnimg.cn/direct/33bb97b011b248a2adc196f9dfcc925e.png
检查MTU:
mtu导致的题目更准确的说是访问小文件时通,访问大数据时不通,由于ip包头占20字节,所以宿主机网卡和tunl0网卡
mtu值如果相差小于20,则可能造成跨节点的宿主机到容器curl不通,ping得通;同节点的宿主机到容器curl得通,ping
得通。(此现场仅存在calico ipip模式下)
比方物理网卡mtu为1450,tunl0 mtu为1440,则会导致ping的通curl不通,需要将calico mtu修改为1430
修改方法:kubectl edit cm -n kube-system calico-config
修改veth_mtu: "1430"保存后重启所有calico node,重启后再次查看tunl0是否为期望值
检查是否存在防火墙规则或策略路由:
1、检查是否配置了networkpolicy
kubectl get networkpolicy -A
2、检查是否配置策略路由
默认只有3条规则,如果有多的,则询问客户是否可以删除多余的路由规则
删除命令ip rule del pref
3、询问客户是否设置了防火墙规则
查看iptables默认规则:
iptables -nvL FORWARD
如果表现policy DROP则实行 iptables -t filter -P FORWARD ACCEPT
开启自动加规则方法:
/usr/lib/systemd/system/docker.service中 在ExecReload=/bin/kill -s HUP $MAINPID下加上一行
ExecPost=/usr/sbin/iptables -t filter -P FORWARD ACCEPT
九、证书更新

拉取脚本
git clone https://github.com/yuyicai/update-kube-cert.git
cd update-kubeadm-cert
chmod 755 update-kubeadm-cert.sh
更新证书
每个主控节点都需实行一次
./update-kubeadm-cert.sh all
查看证书
kubeadm certs check-expiration
备份数据(证书和配置)
cp -rp /etc/kubernetes /etc/kubernetes.bak
mv /etc/kubernetes/*.conf /tmp/
更新admin配置
cp /etc/kubernetes/admin.conf
~/.kube/config
重启etcd、apiserver、controller 、manager、scheduler
将/etc/kubernetes/manifests/暂时移出,
完成重启

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Kubernetes 系列 | k8s入门运维