Kubernetes 系列 | k8s入门运维

目录

  • 一、K8S集群搭建
    • [1.1 部署方式](#1.1 部署方式)
    • [1.2 了解kubeadm](#1.2 了解kubeadm)
    • [1.3 部署流程](#1.3 部署流程)
      • [1.3.1 初始化配置](#1.3.1 初始化配置)
      • [1.3.2 安装容器运行时](#1.3.2 安装容器运行时)
      • [1.3.3 安装K8S软件包](#1.3.3 安装K8S软件包)
      • [1.3.4 创建集群](#1.3.4 创建集群)
  • 二、集群高可用
    • [1.1 集群高可用-堆叠](#1.1 集群高可用-堆叠)
    • [1.2 集群高可用-集群外etcd](#1.2 集群高可用-集群外etcd)
  • 三、Pod运维
    • [3.1 Pod运维](#3.1 Pod运维)
    • [3.2 Pod的生命周期](#3.2 Pod的生命周期)
    • [3.3 Pod状况](#3.3 Pod状况)
    • [3.4 Pod阶段](#3.4 Pod阶段)
    • [3.5 容器状态](#3.5 容器状态)
    • [3.6 Pod调度](#3.6 Pod调度)
    • [3.7 Pod排错](#3.7 Pod排错)
    • [3.8 Pod状态](#3.8 Pod状态)
  • 四、Node运维
  • 五、Etcd运维
  • 六、Corndns运维
  • 七、Ingress-controller运维
  • 八、Calico运维
  • 九、证书更新

一、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搭建直通车

下文的流程只是参考并不是可实操的文档,若需要部署请使用上文。

1.3.1 初始化配置

  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

  2. 设置主机名

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

  3. 挂载存储

    etcd盘
    docker盘
    kubelet盘

  4. 内核参数调优

    将桥接的 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

  5. 时间同步

    手动同步
    ntpdate
    chrony

1.3.2 安装容器运行时

  1. 安装CRI

    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
    /etc/yum.repos.d/docker-ce.repo
    yum -y imstall docker-ce/containerd

  2. 调整cgroups驱动

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

  3. 启动并开机自启

    systemctl enable docker && systemctl start docker

1.3.3 安装K8S软件包

  1. 添加K8S的yum源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    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

  2. 安装kubeadm、kubelet、kubectl

    dnf install -y kubelet-1.25.7 kubeadm-1.25.7 kubectl-1.25.7
    --disableexcludes=kubernetes

  3. 设置开机自启

    systemctl enable --now kubelet

1.3.4 创建集群

  1. 初始化控制平面节点

    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 小时

  2. 拷贝配置文件

    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

  3. 加入节点

    kubeadm join 10.10.102.224:6443 --token mu567i.b2e80ic54vhr13yl
    --discovery-token-ca-cert-hash sha256:f812c6b9e157ee6c0bd11d85f59252fd8b33f349af30167738aa766442d77e33
    #重新生成token
    kubeadm token create --print-join-command

  4. 部署网络插件

    wget https://projectcalico.docs.tigera.io/v3.25/manifests/calico.yaml
    kubectl apply -f calico.yaml
    kubectl get pods -n kube-system

二、集群高可用

1.1 集群高可用-堆叠

1.2 集群高可用-集群外etcd

三、Pod运维

3.1 Pod运维


3.2 Pod的生命周期

3.3 Pod状况

简介

可以通过查看Pod的Condition列表了解更多信息,pod的Condition指示pod是否已达到某个状态,以及为什么会这样,与状态相反,一个Pod同时具有多个Conditions
pod的条件表

Pod Condition 描述
PodScheduled 表示pod是否已调度到节点
Initialized Pod的 init容器都已成功完成
ContainersReady Pod 中所有容器都已就绪
Ready Pod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中

显示Pod的状况

kubectl describe po <pod-name> -n <namespace> | grep Conditions: -A5

3.4 Pod阶段

简介

Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态

的综合汇总,也不是为了成为完整的状态机。
pod的条件表

显示Pod的阶段

kubectl get po <pod-name> -n <namespace> -o yaml | grep phase:

3.5 容器状态

3.6 Pod调度

影响Pod调度

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状态

Pod状态-Pending

Pod状态- ContainerCreating 或Waiting

Pod状态-CrashLoopBackOff

Pod状态-ImagePullBackOff

四、Node运维

主机上线

主机下线

主机重命名

  1. 备份节点yaml文件
    kubectl get node -o yaml > nodename.yaml
  2. 节点下线
  3. 清理数据
    清理iptables/IPVS表
    iptables:iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    ipvs:ipvsadm -C
    清理calico数据
    rm -rf /var/lib/calico
  4. 设置节点名称
  5. 加入集群
    kubeadm join xxx
  6. 恢复节点标签和污点信息
    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

查看主机相关组件状态

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

  • 查看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
etcd命令二

  • 查看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

  • 删除成员

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

  • 检查结果

执行返回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 解析配置初始化成集群内的配置。

    coredns 常见问题
  • 添加自定义host

编辑configmap:kubectl edit cm coredns -n kube-system

  • 添加集群外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

七、Ingress-controller运维

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的协议号

如果抓不到数据包,说明Node之间没有放开IPIP数据包。

检查calico相关的pod的状态是否正常:

calico-node所包含的pod必须为running和ready状态

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网卡

 刷新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 路由

检查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/临时移出,

完成重启

相关推荐
白手小弟3 分钟前
docker部署Stirling-PDF
docker·容器·pdf
文牧之14 分钟前
PostgreSQL的walsender和walreceiver进程介绍
运维·数据库·postgresql
炸裂狸花猫1 小时前
Linux技术04-IPVS
linux·运维·服务器
快快小毛毛1 小时前
CC攻击防御策略要怎么调整?使用游戏盾有效解决
运维·服务器·网络·tcp/ip·游戏·udp
HoweWWW1 小时前
k8s 微服务 ingress-nginx 金丝雀发布
微服务·容器·kubernetes
ʚɞ4961 小时前
k8s环境下的相关操作
运维·excel
向往风的男子1 小时前
【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(三十一)
学习·容器·kubernetes
J老熊1 小时前
Linux下抓包分析Java应用程序HTTP接口调用:基于tcpdump与Wireshark的综合示例
java·linux·运维·web安全·http·面试
HoweWWW1 小时前
k8s中的存储
linux·容器·kubernetes
苏supper2 小时前
k8s的NodeIP、PodIP、ClusterIP、ExternalIP
kubernetes