环境

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

规划

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

主机名IP地址说明
k8smaster1 ~ 3192.168.3.100 ~ 102master节点 * 3
k8smaster-lb(不需要设置单独的ip)192.168.3.100keepalived虚拟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),再输入

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 k8smaster1	192.168.3.100:6443  check
  server k8smaster2	192.168.3.101:6443  check
  server 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 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.3.100
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_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 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.3.101
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_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 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.3.102
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_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/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
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-token
  token: 7t2weq.bjbawausm0jaxury
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.3.100
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  name: k8smaster1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - 192.168.3.100
  timeoutForControlPlane: 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.local
  podSubnet: 172.16.0.0/12
  serviceSubnet: 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: N3Qyd2Vx
  token-secret: YmpiYXdhdXNtMGpheHVyeQ==
  usage-bootstrap-authentication: dHJ1ZQ==
  usage-bootstrap-signing: dHJ1ZQ==
kind: Secret
metadata:
  creationTimestamp: "2022-06-26T08:46:38Z"
  name: bootstrap-token-7t2weq
  namespace: kube-system
  resourceVersion: "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 node
 kubectl 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集群的工具,中间遇到报错的时候可以看我的其他文章

Logo

开源、云原生的融合云平台

更多推荐