Kubernets(K8S) 使用kubeadm基础部署
部署方式
官网文档
二进制部署
- 这是生产环境下使用的方法ansible+playbook。使用二进制包安装的方式,每一步都需要手动处理。如:证书和配置过程都需要手动配置。
- Maser所需组件
- apiserver,scheduler,controller-manager,etcd,flannel - Node所需组件
- kublet,kub-proxy,docker(container engine),flannel - etcd:建议是部署多台专用的存储服务器,实验中也可以单独部署一台。
kubeadm 部署
- Kubeadm 是一个工具,它提供了 kubeadm init
以及 kubeadm join
这两个命令作为快速创建 kubernetes 集群的最佳实践。通过kubeadm init
完成集群master节点的初始化,用kubeadm join
把node节点加入集群
- k8s可以把k8s自身的大部分应用管控起来,即运行于pod上,但是kubelet
和docker
不能这样实现自托管,因此,只需要在所有主机都安装kubelet和docker,构建k8s集群。etcd也是托管于pod上运行,使用kubeadm进行部署,安装过程相对简单。每个主机都要运行flannel这个主件,可以运行为pod。
开始部署(kubeadm)
主机拓扑
- Master节点4G内存,Node节点2G内存。
- 主机系统为CentOS7.9
初始化工作
基本初始化
- 主机解析(所有节点)
vim /etc/hosts
192.168.45.11 Y11
192.168.45.12 Y12
192.168.45.13 Y13
192.168.45.14 Y14
192.168.45.15 Y15
- 配置免密登录:Master免密登录Node
- 使用的
kubeamd
工具自动化部署的要求 - 我这里做的是全节点的免密
- 使用的
ssh-keygen
ssh-copy-id <your-ip>
- 关闭swap分区(所有节点)
yes
会一直输出y
信息,后面跟内容可以反复输出该内容。
swapoff -a
yes|cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak | grep -v swap > /etc/fstab
- 关闭防火墙、dnsmasq、selinux (所有节点)
- 机器本身的防火墙和 selinux 是已经关闭了的
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager
概念补充
dnsmasq
是一个简单的轻量级网络服务软件,提供DNS(Domain Name System)和DHCP(Dynamic Host Configuration Protocol)等功能。Dnsmasq通常用于家庭局域网等小型网络环境中,它具有配置方便、占用资源少、易于维护等优点。NetworkManager
是 Linux 操作系统上一种用于管理网络连接的守护进程。它可以自动检测和配置系统中的网络设备,包括有线和无线网络,VPN,PPPoE和其他类型的网络连接。
思考
为什么关闭一些特定的服务呢?
配源下包
- 阿里base源(所有节点)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
- docker源 (所有节点)
yum install -y yum-untils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- k8s源 (所有节点)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
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
- 安装必备工具 (所有节点)
yum install wget psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git jsoup.noarch -y
- 时间同步(所有节点)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这个命令的作用是使系统中所有应用程序和日志以东八区(北京时间)的时间表示。
在 Linux 系统中,时区信息保存在 /usr/share/zoneinfo
目录中,该目录下包含各个国家和地区的对应时间信息,例如上述命令就是将 Asia/Shanghai 的时区信息链接到 /etc/localtime
。
这样做的好处是,在修改 timezone 后,每个连接到服务器的用户都不需要单独设置一遍时间了。此外,也能保证日志等记录及时正确。如果不设置时间,可能会导致很多问题,例如日志分析出的是美国时间而不是真实的UTC+8 时间,这些问题都可以通过执行 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
来迅速解决。
yum install -y ntp
ntpdate ntp1.aliyun.com
- 系统软件升级(第一次做的时候忽略了)
--exclude
忽略内核相关的软件- 这一步消耗时间较久
yum update -y --exclude=kernel* && reboot
升级内核
- 所有节点都需要升级
安装
网络安装
- 导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
- 安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
- 查看可用的系统内核包
yum -y --disablerepo="*" --enablerepo="elrepo-kernel" list available
- 安装最新版本内核
yum --enablerepo=elrepo-kernel install kernel-ml
- 查看系统可用内核
awk -F\' '$1=="menuentry" {print i++ " : " $2}' /etc/grub2.cfg
配置新内核启动
GRUB_DEFAULT=0
表示将上述编号为0的内核作为默认内核
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub
- 生成新的grub配置文件重启生效
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
- 重启后查看新内核
uname -a
内核调整
部署ipvsadm(所有节点)
- 安装
yum install ipvsadm ipset sysstat conntrack libseccomp -y
- 配置模块
vim /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
加载内核配置
systemctl enable --now systemd-modules-load.service
内核参数调整
- 文件限制参数
-ulimit
--S
表示软限制
--H
表示硬限制
--n
表示每个进程可以同时打开的最大文件数。 soft memlock unlimited
表示用户在当前 shell 会话中可以开启无限量的内存锁定(即可以使用不受限制的内存大小),但是该设置对进程并不生效,进程的内存锁定大小仍然受到系统的限制。hard memlock unlimited
则表示用户能够在当前 Shell 会话和其派生进程中都拥有无限的内存锁定资源。与 soft memlock 相比,hard memlock 的作用范围更广,可以影响直接或间接创建的所有进程。
ulimit -SHn 655350
vim /etc/security/limits.conf
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
- 内核参数调整
cat <<EOF > /etc/sysctl.d/k8s.conf
# 允许 IP 数据包转发,通常用于作为网关或路由器。
net.ipv4.ip_forward = 1
# 启用桥接时对 iptables 进行防火墙过滤规则处理。
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 允许卸载挂载在进程运行时的目录下的文件系统。
fs.may_detach_mounts = 1
# 开启内存 overcommit 策略,允许进程虚拟地址空间超过可用物理内存大小。
vm.overcommit_memory=1
# 遇到内存不足异常时只记录日志,不触发 kernel panic。
vm.panic_on_oom=0
# 提高使用 inotify 监测文件系统事件时监测文件数的上限。
fs.inotify.max_user_watches=89100
# 用于控制系统进程允许打开的最大文件数。
fs.file-max=52706963
fs.nr_open=52706963
# 设置 iptables 所使用的连接跟踪表最大大小。
net.netfilter.nf_conntrack_max=2310720
# TCP 连接空闲时发送 keepalive 消息的时间间隔。
net.ipv4.tcp_keepalive_time = 600
# 发出 keepalive 消息后,若仍未收到响应,则重新发送的次数。
net.ipv4.tcp_keepalive_probes = 3
# 两次发送 keepalive 消息的时间间隔。
net.ipv4.tcp_keepalive_intvl =15
# 系统最大允许同时保留的 timewait 状态 TCP 连接数量。
net.ipv4.tcp_max_tw_buckets = 36000
# 启用 TCP 连接复用功能。
net.ipv4.tcp_tw_reuse = 1
# 当 TCP 连接建立时,若系统资源不足,则放入 orphand 状态,此参数规定的是 orphan 的最大个数。
net.ipv4.tcp_max_orphans = 327680
# 当一个 orphan TCP 连接尝试重连的最大次数。
net.ipv4.tcp_orphan_retries = 3
# 启用 syncookies,防止 SYN 攻击。
net.ipv4.tcp_syncookies = 1
# 限制在内核中存储半连接状态和全连接状态的最大值。
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
# 禁用 TCP 时间戳,提高 TCP 性能。
net.ipv4.tcp_timestamps = 0
# Socket 中 backlog(等待连接队列长度)。
net.core.somaxconn = 16384
EOF
- 加载配置文件
-sysctl --system
命令会重新加载配置文件/etc/sysctl.conf
和/usr/lib/sysctl.d/*.conf
,使得修改的内核参数在系统下次启动时生效。
sysctl --system
部署Docker
- 全节点部署
- 在K8S的仓库中有Docker,直接yum安装
yum install docker-ce-19.03.* -y
- 启动
systemctl daemon-reload && systemctl enable --now docker
systemctl status docker
设置Cgroup驱动程序为systemd
- 概念
cgroup
,控制组,提供了一套机制用于控制一组特定进程对资源的使用。
如:使用cgroup
控制虚拟机进程或者docker
进程可以使用的资源,在Linux对应用进程做资源访问控制。
使用systemd
作为docker
的cgroup driver
可以确保服务器节点在资源紧张的情况更加稳定,因此,这里修改各个节点上docker
的cgroup driver
为systemd
。 - 设置
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
- 参数解释
"exec-opts": ["native.cgroupdriver=systemd"]
- 表示 Docker 执行时使用
systemd
作为cgroup
的driver
,这是为了更好地管理容器的资源。
- 表示 Docker 执行时使用
"log-driver"
和"log-opts"
- 表示 Docker 的日志输出方式和相关配置
- 这里是将日志输出到 json 文件中,并且最大大小为 100 m。
- 这样可以方便地记录容器的运行情况。
"storage-driver": "overlay2"
- 表示 Docker 使用 OverlayFS 作为存储驱动来管理镜像和容器数据。
- 这种驱动可以在多个容器之间共享底层文件系统,从而节省磁盘空间和加速容器启动。
配置镜像加速
vim /etc/docker/daemon.json
"registry-mirrors":["https://7icsaa0c.mirror.aliyuncs.com"],
- 重启生效
systemctl daemon-reload && systemctl enable docker
高可用组件安装(Master上部署)
下载安装包
yum install -y keepalived haproxy
配置HAProxy
vim /etc/haproxy/haproxy.cfg
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server Y11 192.168.45.11:6443 check
server Y12 192.168.45.12:6443 check
server Y13 192.168.45.13:6443 check
配置Keepalived
- 注意:
- 此处配置文件中的安全检查模块是关闭的 - Y11调整配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 192.168.45.11
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.45.88
}
# track_script {
# chk_apiserver
# }
}
- Y12调整配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.45.12
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.45.88
}
# track_script {
# chk_apiserver
# }
}
- Y13调整配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.45.13
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.45.88
}
# track_script {
# chk_apiserver
# }
}
- 配置检查脚本
vim /etc/keepalived/check_apiserver.sh
#!/bin/bash
err=0
for k in $(seq 1 3)
do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
- 启动haproxy和keepalived并查看vip
systemctl daemon-reload
systemctl enable --now haproxy
systemctl enable --now keepalived
ip a
- 测试 VIP 及端口
- 这个命令会尝试通过 Telnet 协议连接到 IP 地址为
192.168.45.88
,端口号为16443
的服务。 - 通常情况下,
6443
端口被用作 Kubernetes API Server 的安全端口,默认情况下需要 TLS 安全连接才能访问该端口。 #port- 因此,执行这个命令需要在目标主机上启动 Kubernetes API Server 并且开启了 TLS 认证。
- 如果连接成功并且 TLS 安全认证也成功,则该命令将打印出连接成功后显示的服务信息。如果连接失败,则会显示连接错误信息。
```sh
yum install -y telnet
telnet 192.168.45.88 16443
- 这个命令会尝试通过 Telnet 协议连接到 IP 地址为
- **正确**的信息
```go
[root@Y11 ~]# telnet 192.168.45.88 16443
Trying 192.168.45.88...
Connected to 192.168.45.88.
Escape character is '^]'.
Connection closed by foreign host.
- 错误的信息
Trying 192.168.45.88...
telnet: connect to address 192.168.45.88: Connection refused
以上为二进制包初始化流程
安装k8s组件
查看kubeadm
的版本
yum list kubeadm.x86_64 --showduplicates | sort -r
--showduplicates
是yum list
命令的一个参数,它表示如果系统中有同一软件包的多个版本,将会把这些版本都列出来。
- 这里排序是有点小问题的,截止20230415最新版本为1.27.1
安装k8s组件(所有节点)
- 选用1.21版本
yum install -y kubeadm-1.21* kubelet-1.21* kubectl-1.21*
- 启动kubelet
systemctl daemon-reload
systemctl enable --now kubelet
初始化K8S集群
- 在master节点上操作
kubeadm config print init-defaults >kubeadm.conf
- 调整配置文件
vim kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.45.11
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: Y11
taints: null
---
apiServer:
certSANs:
- 192.168.45.88
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.45.88:16443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.21.14
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 172.168.0.0/16
scheduler: {}
- 生成yaml格式的配置文件
kubeadm config migrate --old-config kubeadm.conf --new-config new.yaml
- 查看新的配置文件
vim new.yaml
- 拷贝配置文件到其它master
for i in Y12 Y13;do scp new.yaml $i:/root;done
- 查看镜像列表&拉取镜像
kubeadm config images list --config new.yaml
kubeadm config images pull --config new.yaml
- 查看拉取的镜像
docker images
- 镜像拉不下来的另一种解决办法
- 通过
docker.io/mirrorgooglecontainers
或者本地docker仓库中转一下 - 批量下载及转换标签(docker.io/mirrorgooglecontainers)
- 注意修改image标签
- 通过
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x
docker images | grep mirrorgooglecontainers | awk '{print "docker tag ",$1":"$2,$1":"$2}' | sed -e 's#docker.io/mirrorgooglecontainers#k8s.gcr.io#2' |sh -x
docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x
docker pull coredns/coredns:1.3.1
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker rmi coredns/coredns:1.3.1
配置集群
- 初始化集群
kubeadm init --config /root/new.yaml --upload-certs
- 设置环境变量
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 添加其他 master 节点
- 在其它两个 Master 节点配置
- 加入节点的秘钥在初始化的最后有,注意保存
kubeadm join 192.168.45.88:16443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1d961e3559ea74500616eaf70d267d5ba2a5879b00d9ada3d9be5439d9172acc \
--control-plane --certificate-key 216aeb7716f19b95b4bffd4c9569e214426e8aa1990eb905ee1a74535994c9cb
- 其它 Master 节点配置环境变量(普通用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 其它 Master 节点配置环境变量(root用户)
export KUBECONFIG=/etc/kubernetes/admin.conf
- 添加 Node 节点
kubeadm join 192.168.45.88:16443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1d961e3559ea74500616eaf70d267d5ba2a5879b00d9ada3d9be5439d9172acc
- 重新生成token
- 默认情况下token过期时间是24小时
- 以下命令将会创建一个新的令牌,并输出相应的加入命令,可以将该命令分发给要加入集群的节点
kubeadm token create --print-join-command
- 上传证书的命令
- 以下命令用于上传证书。
- 在 Kubernetes 集群初始化时,该命令会上传启动节点的证书,确保之后加入的控制平面节点和工作节点加入到集群时,它们的证书与初始证书匹配。
kubeadm init phase upload-certs --upload-certs
- 删除node节点
kubectl delete node <node name>
- 重置kubeadm
kubeadm reset && rm -rf $HOME/.kube
使用calico安装k8s网络
K8S支持的网络
- K 8 S 网络官方文档:集群网络系统 | Kubernetes
- Calico: Quickstart for Calico on Kubernetes )
Calico 概念
- 官方网站:Project Calico (tigera.io)
- 概念
Calico 是一种开源网络和网络安全解决方案,适用于容器、虚拟机和基于主机的本地工作负载。 Calico 支持广泛的平台,包括 Kubernetes、OpenShift、Mirantis Kubernetes Engine (MKE)、OpenStack 和裸机服务。- 支持多平面
Calico 支持多个数据平面,包括:纯 Linux eBPF 数据平面、标准 Linux 网络数据平面和 Windows HNS 数据平面。
- 支持多平面
- 解决方案
Calico 是一个基于BGP
的纯三层的网络方案,与 OpenStack、Kubernetes、AWS、GCE 等云平台都能够良好地集成。
Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发。
每个 vRouter 都通过 BGP1协议把在本节点上运行的容器的路由信息向整个 Calico 网络广播,并自动设置到达其他节点的路由转发规则。
Calico 保证所有容器之间的数据流量都是通过 IP 路由的方式完成互联互通的。Calico 节点组网时可以直接利用数据中心的网络结构(L2或者 L3),不需要额外的 NAT、隧道或者 Overlay Network,没有额外的封包解包,能够节约 CPU 运算,提高网络效率。
概念补充
- BGP(Border Gateway Protocol):一种用于广域网路由选择的协议,并常常用于连接 Internet 服务提供商中的不同网络。
- VRouter:是虚拟路由器的缩写,是指一类通过软件模拟实现的路由器,能够在云环境中动态地配置和管理正在运行的虚拟机之间的网络互联,从而达到各种策略的要求,如安全隔离、容灾备份、带宽保留等。
- 数据平面:是指与控制平面相对应的概念,控制平面通常用于定义网络拓扑及策略,而数据平面则是具体实现这些策略的数据处理部分。数据平面通常运行于底层硬件上,可以是交换机、路由器、防火墙等。
- CNI (Container Network Interface):是一种标准的可插拔的容器网络接口,它定义了容器网络如何连通和配置。CNI 接受来自容器运行时调用的插件并将网络配置传递给插件,插件可以完成容器跨主机的连通和隔离等功能。
- IP 路由:是指 Internet 协议 (IP)数据包从一个主机传到另一个主机所需经过的路径选择过程,即路径规划,路径通常由路由器确定。在处理 IP 数据包时会根据目标地址选择最佳路径,并对数据包进行转发。
配置 Calico
- 下载配置文件
如果无法下载,可以打开网页进行复制
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico-etcd.yaml
- 指定 ETCD 地址
sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://192.168.45.11:2379,https://192.168.45.12:2379, https://192.168.45.13:2379"#g' calico-etcd.yaml
- 配置 ETCD 证书
-tr -d '\n'
清除换行符
-base64
使用 base64编码集
- 将 etcd 服务器证书编码为 Base64 格式是因为在 K8S 中,证书等敏感信息需要以字符串方式保存在 YAML 格式的配置文件中。而在 YAML 文件中,若字符串中包含特殊字符或换行符等无法直接识别的字符,则必须将其进行 Base64 编码。
- 思考:如果不转化?会产生什么报错呢?
ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`
ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`
- 添加 ETCD 证书
sed -i "s@# etcd-key: null@etcd-key: ${ETCD_KEY}@g; s@# etcd-cert: null@etcd-cert: ${ETCD_CERT}@g; s@# etcd-ca: null@etcd-ca: ${ETCD_CA}@g" calico-etcd.yaml
- 添加 ETCD 证书 key 地址
sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: "" #etcd_key: "/calico-secrets/etcd-key" #g' calico-etcd.yaml
- 获取网段
awk -F= '{print $NF}'
:该部分使用awk
命令处理上一步查找到的行,并将其按等号分隔成两个字段。
{print $NF}
表达式只输出第二个字段的值,即cluster-cidr
参数指定的 Pod 网络子网。
POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
- 修改 pod ip 段
sed -i 's@# - name: CALICO_IPV4POOL_CIDR@- name: CALICO_IPV4POOL_CIDR@g; s@# value: "192.168.0.0/16"@ value: '"${POD_SUBNET}"'@g' calico-etcd.yaml
- 应用配置文件
kubectl apply -f calico-etcd.yaml
检查组件状态
cs
: ComponentStatus
的缩写,控制平面资源组件状态汇总,每个组件都会启动一个探测器,用于监测其内部状态的变化,并将其报告给 Kubernetes API Server。API Server 会将这些数据聚合到一个 ComponentStatus
对象中,并暴露给客户端检查控制平面组件的健康状态。
kubectl get cs
- 发现健康检查有问题
- 检查配置文件
/etc/kubernetes/manifests/kube-controller-manager.yaml
/etc/kubernetes/manifests/kube-scheduler.yaml
- 所有 master 节点修改端口
sed -i "s@- --port=0@#- --port=0@" /etc/kubernetes/manifests/kube-scheduler.yaml
sed -i "s@- --port=0@#- --port=0@" /etc/kubernetes/manifests/kube-controller-manager.yaml
- 所有 master 节点重启生效配置
systemctl restart kubelet
kubectl get cs
- 查看 kube-system 的运行状态
kube-system
即是控制平面
kubectl get pods -n kube-system
- 查看节点信息
kubectl get nodes
问题:Node NotReady
状态检查的时候发现有 Node 节点为准备
problem
查看 Node 服务状态
systemctl status -l kubelet
发现网路组件有问题
排查 cni 组件,问题搁置
- 发现配置文件下没有
/etc/cni/net.d/
- 到
Y14
上进行拷贝
scp /opt/cni/bin/calico 192.168.45.15:/opt/cni/bin/calico
- 继续查看日志,依旧报错。
systemctl status -l kubelet
- 此时查看 Master 的状态,状态却正常了
[root@Y11 ~]# kubectl get nodes
- 继续排查容器的情况,发现有问题的节点缺少运行容器
docker ps
- 无报错节点容器运行情况
- 初步判断是在 Calico 网络配置的过程中出现了问题,主要问题点在 Y 15 上无法拉取镜像
问题解决
- 在 Master 上查看缺失镜像的名称
[root@Y11 ~]# docker images
- 在 Y 15 上手动拉取镜像
- 这里拉取的镜像需要指定版本
docker pull calico/cni:v3.25.0
docker pull calico/node:v3.25.0
排错思路
- 确定无法拉取的 pod
- 使用
kubectl describe pod <pod_name>-n <namespace_name>
确定详情- 如果无法找到问题,可以到具体 node 上用
docker logs
检查日志
- 如果无法找到问题,可以到具体 node 上用
- 找到具体的问题镜像以后
- 手动拉取对应镜像
docker pull
- 根据报错调整对应的 yaml 文件
- 手动拉取对应镜像
Metrics Server 部署
概念
- 项目地址:kubernetes-sigs/metrics-server
- 在新版的 Kubernetes 中系统资源的采集均使用 Metrics-server,可以通过 Metrics 采集节点和 Pod 的内存、磁盘、CPU 和网络的使用率,并且可结合 HPA(Horizontal Pod Autoscalers)实现 Pod 资源的自动伸缩。
特性
1. 适用于大多数集群的单一部署
2. 快速自动缩放,每 15 秒收集一次指标
3. 资源消耗少,为集群中的每个节点使用1毫厘CPU 内核和 2 MB 内存
4. 可扩展支持多达 5,000 个节点集群
5. 基于 CPU/内存的水平自动缩放
6. 自动调整/建议容器所需的资源
部署
- 获取 yaml 文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml
- 修改 yaml 文件:
- 修改镜像源为国内源
- 关闭 tls 证书认证
vim components.yaml
136 - --kubelet-insecure-tls
138 image: registry.cn-shenzhen.aliyuncs.com/zengfengjin/metrics-server:v0.5.0
- 应用yaml文件
kubectl apply -f components.yaml
- 查看安装情况
- 命令解释:列出集群中
kube-system
命名空间下所有的 Pod,并显示它们的详细信息,包括名称、所在节点、IP 地址等。
- 命令解释:列出集群中
kubectl get pod -n kube-system -o wide
- 查看
service
情况kube-system
命名空间下所有的服务,显示每个服务的名称、类型、ClusterIP、外部 IP 地址等详细信息。
kubectl get svc -n kube-system
- 查看收集到的 node 指标
kubectl top node
- 查看收集到的 pod 指标
kubectl top node -n kube-system
kube-proxy 更改 ipvs
- 查看当前
kube-proxy
模式
curl 127.0.0.1:10249/proxyMode
- 修改为 ipvs
- 问题:无法保存文件
kubectl edit cm kube-proxy -n kube-system
44 mode: "ipvs"
- 删除之前的 pod
kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl -n kube-system delete pod
- 查看运行状态
kubectl get pod -n kube-system -o wide | grep proxy
- 查看现在
kube-proxy
模式
curl 127.0.0.1:10249/proxyMode
部署 Kubernetes Dashboard
概念
Kubernetes Dashboard (仪表盘)是一个旨在将通用的基于 Web 的监控和操作界面加入 Kubernetes 的项目。
配置
拉取配置文件
- 网址: https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.0/aio/deploy/recommended.yaml
- 复制文本内容到文件中
修改配置文件
- 名称空间修改为默认 system
/namespace/
: 匹配文件中包含字符串 "namespace" 的行。s/kubernetes-dashboard/kube-system/g
: 将上一步匹配到的行中的字符串 "kubernetes-dashboard" 替换为 "kube-system"。
sed -i '/namespace/ s/kubernetes-dashboard/kube-system/g' recommended.yaml
- 修改 yaml 文件
vim recommended.yaml
39 spec:
40 type: NodePort #增加type: NodePort
41 ports:
42 - port: 443
43 targetPort: 8443
44 nodePort: 31000 #增加nodePort: 31000
193 imagePullPolicy: IfNotPresent #修改拉去镜像权限
生效配置
- 生效配置文件
kubectl apply -f recommended.yaml
- 查看 Pod 状态
- Pod 的创建需要一定的时间,这里在十小时以后截图查看的状态。
kubectl get pod --namespace=kube-system -o wide | grep dashboard
- 查看svc
kubectl get service kubernetes-dashboard --namespace=kube-system
kubectl get pods -n kube-system | grep kubernetes-dashboard
- 配置登录权限
vim admin-token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
- 生效配置文件
kubectl create -f admin-token.yaml
- 查看 token
kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -n kube-system
- 访问 web 页面
问题
-
如无法访问 #problem
-
解决:在浏览器启动项中添加
--test-type --ignore-certificate-errors
-
如果无法打开网页,可以删除 pod,重新让 k8s 拉一个
kubectl delete pod kubernetes-dashboard-67fd685f67-q5kwr -n kube-system
配置登录Token
Dashboard 支持 Kubeconfig 和 Token 两种认证方式,为了简化配置,我们通过配置文件 dashboard-admin.yaml
为 Dashboard 默认用户赋予 admin 权限
生成配置文件
vim admin-token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
执行文件查看 Token
- 执行
kubectl create -f admin-token.yaml
- 查看
kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -n kube-system
kuboard 可视化部署
概念
安装
- 根据配置文件部署
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
- 查看 service
kubectl get svc -n kube-system
- 获取 Token
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
- 查看 svc
kubectl get svc -n kube-system
- 输入 Token 登录 Web
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!