虚拟机搭建搭建Kubernetes集群

  • 环境
    • 规划
  • 虚拟机搭建
  • 配置网络
  • 解决和主机复制粘贴的问题
    • 使用MobaXterm连接虚拟机
    • 安装vmware tools(建议使用MobaXterm)
  • 配置yum源
  • 关闭防火墙
  • 关闭Swap
  • 关闭 selinux
  • 配置k8s内核
  • 时间同步
  • 所有节点配置limit
  • 升级系统内核
  • 安装ipvs工具
  • 虚拟机快照(不要克隆)
  • 修改k8smaster2,k8smaster3的IP地址
  • 设置主机名
  • 在 master 添加 hosts
  • Master01节点免密钥登录其他节点
  • 安装Runtime
    • 安装Containerd作为Runtime
  • 安装 kubeadm,kubelet 和 kubectl
  • 高可用组件安装
    • 配置HAProxy
    • 配置KeepAlived
      • k8smaster1节点的配置
      • k8smaster2节点的配置
      • k8smaster3节点的配置
      • 配置KeepAlived健康检查文件
  • 集群初始化
  • 加入 Kubernetes master节点
  • 加入 Kubernetes worker节点
  • Token过期处理
  • 部署CNI网络插件(Calico)
  • Metrics部署
  • Dashboard部署
    • 登录dashboard
  • 【必看】注意事项
  • 彩蛋

环境

Windows10 64位,
vmware workstation pro 16、
CentOS-7-x86_64-Everything-2009.iso

规划

台式机资源不够,只能开启三台虚拟机,我把它全部当作master节点,如果资源够,可以开启3台master 2台node

主机名 IP地址 说明
k8smaster1 ~ 3 192.168.3.100 ~ 102 master节点 * 3
k8smaster-lb(不需要设置单独的ip) 192.168.3.100 keepalived虚拟IP
配置信息 备注
系统版本 CentOS 7.9
Docker版本 20.10.x
Pod网段 172.16.0.0/12
Service网段 10.96.0.0/16

宿主机网段、K8s Service网段、Pod网段不能重复,具体可以参考这儿
详解IP地址后面斜杠加具体数字

虚拟机搭建

我是官网下载vmware workstation pro 16,然后可以淘宝购买激活码或者网上搜
安装好之后,创建虚拟机





磁盘20G已经够用

网络家庭内部(连接相同wifi)使用桥接网络删掉声卡,打印机设备





这块的时间和日期要选对



配置网络

以上我们已经动态获取了虚拟机的IP,但动态IP可能会随着虚拟机的重启而发生变化,特别是存在多台虚拟机都动态获取IP时,不太利于我们的开发和测试,因此,统一配置静态IP是有必要的。
  第一步:设置VMware虚拟机的网关。

更改设置-》VMnet0选择宿主机上网的网卡)-》桥接

配置虚拟机网卡文件ifcfg-ens33。

vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_PRIVACY="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="edbc23f0-08c2-4d63-a117-d34fe5c7a615"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.3.100
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=114.114.114.114
DNS2=8.8.8.8
DNS3=4.2.2.2

IP,GATEWAY要设置成自己的,可以参考这篇文章中的解释

关于这些字段解释,可以参考这个文章

修改完成保存,然后执行命令 service network restart重启网络服务。

解决和主机复制粘贴的问题

使用MobaXterm连接虚拟机

vmware虚拟机开启之后,直接在vmware操作虚拟机很不方便,不能粘贴复制,显示也很不友好,所以后续用MobaXterm操作虚拟机


选这个然后可以同时操作三台虚拟机

安装vmware tools(建议使用MobaXterm)

在 Linux 虚拟机中手动安装 VMware Tools

Vmware workstation 安装解压 vmwaretools 提示只读文件“tar: vmware-tools-distrib:无法 mkdir: 只读文件系统”

配置yum源

不建议使用CentOS 7 自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。这里,我们使用阿里云的源予以替换,执行如下命令,替换文件/etc/yum.repos.d/CentOS-Base.repo:

yum install wget -y yum-utils device-mapper-persistent-data lvm2 psmisc net-tools telnet
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

关闭防火墙

防火墙一定要提前关闭,否则在后续安装K8S集群的时候是个trouble maker。执行下面语句关闭,并禁用开机启动:

systemctl stop firewalld & systemctl disable firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager

NetworkManager 公有云不要关闭,公司私有的主机要确定一下有没有用到

关闭Swap

类似ElasticSearch集群,在安装K8S集群时,Linux的Swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可以提前进行设置:执行 swapoff -a可临时关闭,但系统重启后恢复。用vim编辑/etc/fstab,即:

vim /etc/fstab

注释掉包含swap的那一行即可,重启后可永久关闭,如下所示:

关闭 selinux

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时

配置k8s内核

包括将桥接的 IPv4 流量传递到 iptables 的链

$ cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

生效

sysctl --system

net.ipv4.ip_forward 是pod 之间的路由转发的时候用到
重启之后检查有没有被加载

reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack

时间同步

集群的时间必须同步,与证书的签发有关系
设置时区

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
yum install ntpdate -y
ntpdate time.windows.com

使用阿里云时间服务器

crontab -e
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com

所有节点配置limit

这个是文件句柄,默认为1024,有可能存在集群使用一段时间之后,无法建立文件句柄的情况发生

ulimit -SHn 65535
vim /etc/security/limits.conf

末尾添加如下内容

* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited

升级系统内核

查看当前内核3.10.0-1160.76.1.el7.x86_64

uname -r

第一个组数字:3, 主版本号
第二个组数字:10, 次版本号,当前为稳定版本,一般这个数字为偶数表示稳定,奇数表示在开发版本,通常这样的不做生产使用。
第三个组数字:0, 修订版本号
第四个组数字:1160.76.1,表示发型版本的补丁版本
el7:则表示我正在使用的内核是 RedHat / CentOS 系列发行版专用内核 ,centos7
x86_64:采用的是适用64位的CPU的操作系统。

3.x升级到5.x

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

删除旧版的内核

yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))

安装ipvs工具

可以看到k8s中节点中ipvs的配置,路由的配置,转发的配置

yum install ipvsadm ipset sysstat conntrack libseccomp -y

所有节点配置ipvs模块:

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
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即可

虚拟机快照(不要克隆)

在安装k8s组件之前,此处关机拍快照保存,后续二进制安装的时候,从快照恢复
开机快照会占用较大空间而且容易文件丢失,建议用命令关机

shutdown -h now

其他几台机器不要用克隆,建议手动安装其他几台机器
克隆会有网络问题
克隆会有网络问题
克隆会有网络问题

我用的3台master ,因为master 可以当node 使用,而且台式机的硬件配置不够高,不能一次启动5个虚拟机,有条件的建议,3台master,2台node

修改k8smaster2,k8smaster3的IP地址

方法同master 的修改,记得修改之后,重启 service network restart

设置主机名

在三台机器分别执行

hostnamectl set-hostname k8smaster1
hostnamectl set-hostname k8smaster2
hostnamectl set-hostname k8smaster3

在 master 添加 hosts

cat >> /etc/hosts << EOF
192.168.3.100 k8smaster1
192.168.3.101 k8smaster2
192.168.3.102 k8smaster3
192.168.3.100 k8smaster-lb
EOF

Master01节点免密钥登录其他节点

装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:

ssh-keygen -t rsa
for i in k8smaster1 k8smaster2 k8smaster3;do ssh-copy-id -i /root/.ssh/id_rsa.pub $i;done

安装Runtime

安装Containerd作为Runtime

大于1.24 使用Containerd
装docker的同时会把Containerd安装上,而且后期学习也用用到docker
每个节点安装

yum install -y docker-ce-20.10.* docker-ce-cli-20.10.*

可以无需启动Docker,只需要配置和启动Containerd即可。
首先配置Containerd所需的模块(所有节点

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

所有节点加载模块

modprobe -- overlay
modprobe -- br_netfilter

所有节点,配置Containerd所需的内核

cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

所有节点加载内核:

sysctl --system

所有节点配置Containerd的配置文件:

mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

所有节点将Containerd的Cgroup改为Systemd:
k8s推荐Systemd 作为隔离机制(如果用docker,也需要更改)

vim /etc/containerd/config.toml

找到containerd.runtimes.runc.options,添加SystemdCgroup = true(如果已存在直接修改,否则会报错),如下图所示:

sandbox_imagePause镜像改成符合自己版本的地址registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

所有节点启动Containerd,并配置开机自启动:

systemctl daemon-reload
systemctl enable --now containerd

所有节点配置crictl客户端连接的运行时位置,找到哪个containnerd的sock 去执行命令

cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

安装 kubeadm,kubelet 和 kubectl

首先在Master01节点查看最新的Kubernetes版本是多少:

yum list kubeadm.x86_64 --showduplicates | sort -r

所有节点安装1.24.2版本kubeadm、kubelet和kubectl:

yum install -y kubelet-1.24.2 kubeadm-1.24.2 kubectl-1.24.2

如果选择的是Containerd作为的Runtime,需要更改Kubelet的配置使用Containerd作为Runtime,所有节点执行:

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
systemctl daemon-reload
systemctl enable kubelet

以上,基本完成了虚拟机的配置。

高可用组件安装

(注意:如果不是高可用集群,haproxy和keepalived无需安装)
公有云要用公有云自带的负载均衡,比如阿里云的SLB,腾讯云的ELB,用来替代haproxy和keepalived,因为公有云大部分都是不支持keepalived的,另外如果用阿里云的话,kubectl控制端不能放在master节点,推荐使用腾讯云,因为阿里云的slb有回环的问题,也就是slb代理的服务器不能反向访问SLB,但是腾讯云修复了这个问题。

如果是单个master节点,不需要安装haproxy和keepalived

所有Master节点通过yum安装HAProxy和KeepAlived

yum install keepalived haproxy -y

配置HAProxy

所有Master节点配置HAProxy(详细配置参考HAProxy文档,所有Master节点的HAProxy配置相同):

vim /etc/haproxy/haproxy.cfg

如果文件中有的话,要全部删掉(vim 执行 gg​ 这里是跳至文件首行再命令dG),再输入

globalmaxconn  2000ulimit-n  16384log  127.0.0.1 local0 errstats timeout 30sdefaultslog globalmode  httpoption  httplogtimeout connect 5000timeout client  50000timeout server  50000timeout http-request 15stimeout http-keep-alive 15sfrontend monitor-inbind *:33305mode httpoption httplogmonitor-uri /monitorfrontend k8s-masterbind 0.0.0.0:16443bind 127.0.0.1:16443mode tcpoption tcplogtcp-request inspect-delay 5sdefault_backend k8s-masterbackend k8s-mastermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100server k8smaster1    192.168.3.100:6443  checkserver k8smaster2  192.168.3.101:6443  checkserver k8smaster3  192.168.3.102:6443  check
systemctl restart haproxy

检查一下16443端口有没有被监听

 netstat -lntp

配置KeepAlived

所有Master节点配置KeepAlived,配置不一样,注意区分 [root@k8smaster1 pki]# vim /etc/keepalived/keepalived.conf ,注意每个节点的IP和网卡(interface参数,这个后面是网卡名称ip a命令查看)

vim /etc/keepalived/keepalived.conf

网卡的名称需要改成自己的,我就就是ens33,通过ip a 命令查看

k8smaster1节点的配置

! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
script_user rootenable_script_security
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5weight -5fall 2
rise 1
}
vrrp_instance VI_1 {state MASTERinterface ens33mcast_src_ip 192.168.3.100virtual_router_id 51priority 101advert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.3.100}track_script {chk_apiserver}
}

k8smaster2节点的配置

! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
script_user rootenable_script_security
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5weight -5fall 2
rise 1
}
vrrp_instance VI_1 {state BACKUPinterface ens33mcast_src_ip 192.168.3.101virtual_router_id 51priority 100advert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.3.100}track_script {chk_apiserver}
}

k8smaster3节点的配置

! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
script_user rootenable_script_security
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5weight -5fall 2
rise 1
}
vrrp_instance VI_1 {state BACKUPinterface ens33mcast_src_ip 192.168.3.102virtual_router_id 51priority 100advert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.3.100}track_script {chk_apiserver}
}

配置KeepAlived健康检查文件

所有master节点配置KeepAlived健康检查文件
循环探测haproxy的进程在不在,不在的话,VIP 会跳到master节点的其他节点

vim /etc/keepalived/check_apiserver.sh
#!/bin/basherr=0
for k in $(seq 1 3)
docheck_code=$(pgrep haproxy)if [[ $check_code == "" ]]; thenerr=$(expr $err + 1)sleep 1continueelseerr=0breakfi
doneif [[ $err != "0" ]]; thenecho "systemctl stop keepalived"/usr/bin/systemctl stop keepalivedexit 1
elseexit 0
fi
chmod +x /etc/keepalived/check_apiserver.sh

启动haproxy和keepalived

systemctl daemon-reload
systemctl enable --now haproxy
systemctl enable --now keepalived

重要:如果安装了keepalived和haproxy,需要测试keepalived是否是正常的
测试VIP(k8smaster1)

ping 192.168.3.100 -c 4
telnet 192.168.3.100 16443


是通的,但是apiserver没有起来,后面起就ok了

集群初始化

以下操作只在k8smaster1节点执行

vim kubeadm-config.yaml

注意更改kubernetesVersion的值和自己服务器kubeadm的版本一致:kubeadm version
certSANs改成你的vip或者公有云的负载均衡地址,证书颁发到这个地址,其他节点都是通过这个地址转发
controlPlaneEndpoint 是vip地址+HAProxy的端口

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: 7t2weq.bjbawausm0jaxuryttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.3.100bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockname: k8smaster1taints:- effect: NoSchedulekey: node-role.kubernetes.io/master
---
apiServer:certSANs:- 192.168.3.100timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.3.100:16443
controllerManager: {}
dns:type: CoreDNS
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.24.2
networking:dnsDomain: cluster.localpodSubnet: 172.16.0.0/12serviceSubnet: 10.96.0.0/16
scheduler: {}

更新kubeadm文件

kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

将new.yaml文件复制到其他master节点,

for i in k8smaster2 k8smaster3; do scp new.yaml $i:/root/; done

之后所有Master节点提前下载镜像,可以节省初始化时间(其他节点不需要更改任何配置,包括IP地址也不需要更改):

kubeadm config images pull --config /root/new.yaml

所有节点设置开机自启动kubelet

systemctl enable --now kubelet

(如果启动失败无需管理,初始化成功以后即可启动)

k8smaster1节点初始化,初始化以后会在/etc/kubernetes目录下生成对应的证书和配置文件,之后其他Master节点加入k8smaster2即可:

kubeadm init --config /root/new.yaml  --upload-certs

如果失败kubeadm reset -f ; ipvsadm --clear ; rm -rf ~/.kube 回退
可以查看/var/log/messages日志信息
初始化成功以后,会产生Token值,用于其他节点加入时使用,因此要记录下初始化成功生成的token值(令牌值)

k8smaster1节点配置环境变量,用于访问Kubernetes集群:
kubectl 命令是通过配置文件连接到集群

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看节点

kubectl get nodes

采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:

kubectl get po -n kube-system

加入 Kubernetes master节点

多了一个证书key

kubeadm join 192.168.3.100:16443 --token 7t2weq.bjbawausm0jaxury \--discovery-token-ca-cert-hash sha256:4a792b61810b1edca5e757ea7fdf5374fe3ac00fd2fcd431ac939833eb7c7ca1 \--control-plane --certificate-key 6c45b60bb62b6a4262a06a3770d789583c9c25353b5ca13e081a2e09d30c60f0

加入 Kubernetes worker节点

kubeadm join 192.168.3.100:16443 --token 7t2weq.bjbawausm0jaxury \--discovery-token-ca-cert-hash sha256:4a792b61810b1edca5e757ea7fdf5374fe3ac00fd2fcd431ac939833eb7c7ca1

Token过期处理

新建的集群时间是24小时,查看token时间

kubectl get secret -n kube-system

查看节点加入集群用的token是哪一个,打开new.yaml中token: 7t2weq.bjbawausm0jaxury

后面的7t2weq意味着你要使用这个token加入集群

kubectl get secret -n kube-system |grep 7t2weq

kubectl get secret -n kube-system bootstrap-token-7t2weq -oyaml
apiVersion: v1
data:auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=expiration: MjAyMi0wNi0yN1QwODo0NjozOFo=token-id: N3Qyd2Vxtoken-secret: YmpiYXdhdXNtMGpheHVyeQ==usage-bootstrap-authentication: dHJ1ZQ==usage-bootstrap-signing: dHJ1ZQ==
kind: Secret
metadata:creationTimestamp: "2022-06-26T08:46:38Z"name: bootstrap-token-7t2weqnamespace: kube-systemresourceVersion: "264"uid: 58176a1b-f945-448f-ad1e-be6f0bfad072
type: bootstrap.kubernetes.io/token

expiration是加密过的,解密过后查看(输出的时间要加8小时)

echo "MjAyMi0wNi0yN1QwODo0NjozOFo=" |base64 -d

以下步骤是上述init命令产生的Token过期了才需要执行以下步骤,如果没有过期不需要执行,直接join即可
Token过期后生成新的token:

kubeadm token create --print-join-command

Master需要生成–certificate-key

kubeadm init phase upload-certs  --upload-certs

部署CNI网络插件(Calico)

CNI网络插件 是pod 之间通讯必备的组件
k8smaster1 上执行

cd /root/ ; git clone https://github.com/dotbalo/k8s-ha-install.git
cd /root/k8s-ha-install && git checkout manual-installation-v1.24.x && cd calico/

修改Pod网段:

POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

将输出的内容改到calico.yaml文件中

sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml
kubectl apply -f calico.yaml

会返回下面的信息

需要多等一会,使用下面的命令

kubectl get pods -n kube-system

直到结果的STATUS全部为running

执行可以看到node节点全部ready

 kubectl get nodes


查看pod IP地址

kubectl get po -n kube-system -owide

Metrics部署

在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率
将k8smaster1节点的front-proxy-ca.crt复制到所有Node节点

scp /etc/kubernetes/pki/front-proxy-ca.crt node节点名称:/etc/kubernetes/pki/front-proxy-ca.crt

记得修改comp.yaml中的--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt 如果是二进制安装的需要改成front-proxy-ca.pem二进制安装生成的证书是pem,kubeadm安装生成的证书是crt

cd /root/k8s-ha-install/kubeadm-metrics-server
kubectl  create -f comp.yaml

查看状态

kubectl get po -n kube-system -l k8s-app=metrics-server

我的一直pending,用下面的命令查看问题

kubectl describe pods  metrics-server-6c48d8f6d6-hgwgq -n kube-server

不能部署到master节点,master节点默认不允许部署pod,通过以下命令删除Taint

kubectl  describe nodes -l node-role.kubernetes.io/control-plane=  | grep Taints
kubectl  taint node  -all node-role.kubernetes.io/control-plane-

查看资源

 kubectl top nodekubectl top po -A

Dashboard部署

cd /root/k8s-ha-install/dashboard/
kubectl  create -f .

官方GitHub地址,可以在官方dashboard查看到最新版dashboard

登录dashboard

在谷歌浏览器(Chrome)启动文件中加入启动参数,用于解决无法访问Dashboard的问题,参考图:

--test-type --ignore-certificate-errors

更改dashboard的svc为NodePort:

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

kubectl get svc -n kubernetes-dashboard

根据自己的实例端口号,通过任意安装了kube-proxy的宿主机的IP+端口即可访问到dashboard:
访问Dashboard:https://192.168.3.100:30453,选择登录方式为令牌(即token方式)

所有master节点vim /etc/kubernetes/manifests/kube-apiserver.yaml,然后在这个文件的command参数的倒数第二行,添加 --feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false (如果有feature-gates参数,直接在后面添加,LegacyServiceAccountTokenNoAutoGeneration=false即可),然后保存退出,

之后同样的方式修改vim /etc/kubernetes/manifests/kube-controller-manager.yaml
保存后重启kubelet。

systemctl restart kubelet

然后删除重建dashboard,重新获取token

kubectl delete -f dashboard-user.yaml
kubectl create -f dashboard-user.yaml

查看token值

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

【必看】注意事项

将Kube-proxy改为ipvs模式,因为在初始化集群的时候注释了ipvs配置,所以需要自行修改一下:
在master01节点执行

kubectl edit cm kube-proxy -n kube-system
mode: "ipvs"

更新Kube-Proxy的Pod:

kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system

验证Kube-Proxy模式

curl 127.0.0.1:10249/proxyMode

ipvs

注意:kubeadm安装的集群,证书有效期默认是一年。master节点的kube-apiserver、kube-scheduler、kube-controller-manager、etcd都是以容器运行的。可以通过kubectl get po -n kube-system查看。
启动和二进制不同的是,
kubelet的配置文件在/etc/sysconfig/kubelet/var/lib/kubelet/config.yaml,修改后需要重启kubelet进程
其他组件的配置文件在/etc/kubernetes/manifests目录下,比如kube-apiserver.yaml,该yaml文件更改后,kubelet会自动刷新配置,也就是会重启pod。不能再次创建该文件
kube-proxy的配置在kube-system命名空间下的configmap中,可以通过
kubectl edit cm kube-proxy -n kube-system进行更改

彩蛋

你辛辛苦苦搭建完了,学完东西了,但是得想一想有没有简单的办法呢?
推荐一个搭建工具
kubeasz 致力于提供快速部署高可用k8s集群的工具,中间遇到报错的时候可以看我的其他文章

k8s学习(2)- 虚拟机搭建搭建Kubernetes集群(1.24.2)相关推荐

  1. 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernet ...

  2. Kubernetes 学习总结(19)—— Kubernetes 集群管理平台如何选择?Rancher vs KubeSphere

    前言 Kubernetes(K8s)集群管理平台都是基于 Kubernetes 提供功能,可以说他们是在 K8s 的基础上封装了一层更为友好的操作方式.他们都是为了降低 k8s 集群运维复杂度,降低运 ...

  3. 如何低成本的搭建一个真实的Kubernetes集群

    引言:kubernetes作为当前事实上的容器编排标准,其势头可谓是如日中天,然而,kubernetes一直以来被人诟病的就是其复杂的搭建成本,作为个人,除了用miniKube等工具在个人电脑上模拟一 ...

  4. Kubernetes 集群基于 Rook 搭建 Ceph 分布式存储系统

    文章目录 1.Rook & Ceph 介绍 1.1.Rook 1.2.Ceph 2.环境.软件准备 3.Kubernetes HA 集群搭建 4.部署 Rook Operator 5.配置 R ...

  5. 初试 Kubernetes 集群使用 CephFS 文件存储

    目录 Kubernetes PersistentVolumes 介绍 环境.软件准备 单节点使用 CephFS Kubernetes PV & PVC 方式使用 CephFS 测试跨节点使用 ...

  6. 二进制包安装Kubernetes集群环境完整版

    Kubernetes 概述 1. Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. K8S用于容器化应用程序的部署 ...

  7. 使用rancher-2.5.5部署单节点kubernetes集群

    rancher2.5.x发布,除了新的feature外,更加简洁,体验/研究/熟悉一下,方便后续的落地使用.感觉:太爽了 相关版本信息: rancher:v2.5.5 helm3:v3.5.1 kub ...

  8. Prometheus-使用Prometheus监控Kubernetes集群

      Prometheus是一个集数据收集存储.数据查询和数据图表显示于一身的开源监控组件.本文主要讲解如何搭建Prometheus,并使用它监控Kubernetes集群. 准备工作 Kubernete ...

  9. 向Kubernetes集群添加/删除Node

    向Kubernetes集群添加/移除Node Minion Node操作前准备 #关闭防火墙 systemctl stop firewalld #禁止防火墙开机启动 systemctl disable ...

  10. Kubernetes 集群的零停机服务器更新 | 文末有料!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://vflong.github.i ...

最新文章

  1. mysql 安装dso命令_使用tengine DSO 来动态编译安装第三方模块(Lua
  2. 如何优雅地为程序中的变量和函数命名
  3. 【数据结构与算法】之面试必考的“二分算法”系统梳理
  4. UVa 1609 (博弈) Foul Play
  5. oracle服务器找不到怎么解决,简析Oracle数据库常见问题及解决方案
  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...
  7. 前端学习(3144):react-hello-react之对比新旧周期
  8. 牛客16785 Cantor表
  9. 字节跳动高伟豪:端到端深度召回算法
  10. 欧拉函数之和(51nod 1239)
  11. (22)Linux下解压unrar文件
  12. 华为服务器修改登录密码,服务器登录修改密码
  13. 联想无线网卡 linux驱动,联想R7000 Ubuntu无线网卡驱动
  14. 豆瓣评分9.4,邱锡鹏教授蒲公英书姊妹篇《神经网络与深度学习:案例与实践》重磅来袭...
  15. Winform/C#入门编程之第三部分容器(四:缩放控件SplitContainer)
  16. 互联网商业化中,广告策略到底有哪些?(一)
  17. 从0-1的CTF比赛环境搭建过程
  18. 北风:在给我一面国旗换头像中,有人通过这个来获利吗?(亲身经历)
  19. potplay显示服务器关闭,PotPlayer怎么关闭左上角显示播放时间?关掉左上角显示播放时间步骤一览...
  20. linux使用过程中出现的问题

热门文章

  1. 使用R语言绘制graph:无向图(ug)和有向无环图(dag)
  2. Android中EditText中文英文长度控制
  3. 虎年屠虎:巨亏下的IPO,你也太虎了吧
  4. 计算点到直线/线段的距离
  5. linux raid5热备,有热备盘的服务器RAID-5数据恢复实例
  6. QGIS插件python开发环境配置和PyCharm配置调试环境
  7. Redis安装(Ubuntu)
  8. mysql主从同步检测
  9. 解决PHP报错:Call to undefined function array_column()
  10. python 线程函数传参