Kubeadm-K8s1.20-高可用部署-详细-生产环境(四)

2023-05-16

文章目录

  • kubeadm部署高可用集群
    • 注意事项
      • k8s部署 二进制与高可用的区别
    • 一、环境配置
      • 1、所有节点修改主机名
      • 2、所有节点进行域名解析
      • 3、所有节点关闭相关应用
        • 3.1、防火墙关闭
        • 3.2、dnsmasq关闭
        • 3.3、NetworkManager关闭
        • 3.4、关闭SWAP分区
        • 3.5、检查MAC和product_uuid
      • 4、所有节点获取相关软件
        • 4.1、获取aliyun源
        • 4.2、获取docker-yum源
        • 4.3、配置k8s-Yum源
        • 4.4、安装必备工具
      • 5、所有节点时间同步
        • 5.1、安装ntpdate
        • 5.2、时间同步
        • 5.3、计划任务时间同步
      • 6、所有节点实现Linux的资源限制
      • 7、master1进行免密
    • 二、内核配置
      • 1、所有节点进行升级update、重启
      • 2、所有节点升级内核
        • 2.1、master1获取RPM包
        • 2.2、master1拷贝至所有节点
        • 2.3、安装内核
        • 2.3、更改内核启动方式
      • 3、所有节点安装与配置ipvsadm
        • 1、安装软件
        • 2、配置内核参数
        • 3、配置生效
        • 4、开启k8s必须的内核参数
        • 5、重启,加载内核
    • 三、基本组件安装、配置
      • 1、所有节点部署Docker
        • 1.1、安装docker-ce
        • 1.2、修改 CgroupDriver 为 systemd
        • 1.3、开机自启动Docker
      • 2、所有节点安装k8s组件
        • 2.1、查看可安装的k8版本
        • 2.2、安装kubeadm
        • 2.3、配置默认的拉取镜像仓库
        • 2.4、设置kubelet开机自启
    • 四、高可用组件安装、配置
      • 1、master节点部署Haproxy
        • 1.1、安装haproxy
        • 1.2、编写haproxy配置
      • 2、master节点部署keepalived
        • 2.1、安装keepalived
        • 2.2、配置keepalived
          • a、master1配置
          • b、master2配置
          • c、master3配置
        • 2.3、创建对应的脚本文件
        • 2.4、脚本授权
      • 3、master节点启动LB与HA
        • 1、开机自启动
        • 2、检测VIP可用性
    • 五、集群初始化
      • 1、master1编写yaml配置文件
      • 2、master所有节点提前拉取镜像
        • 2.1、master1拉取镜像
        • 2.2、master2拉取镜像
        • 2.3、master3拉取镜像
      • 3、所有节点自启动kubelet
      • 4、master1进行初始化
        • 4.1、master1节点进行初始化
          • 4.1.1、初始化失败,进行的操作
        • 4.2、master1节点配置环境变量
        • 4.3、kubelet命令补全
      • 5、所有节点加入集群
        • 5.1、master节点加入集群
        • 5.2、node节点加入集群
        • 5.3、master1再次查看集群信息
    • 六、master1 网络插件 Calico 部署
      • 1、下载所需的源码文件
      • 2、修改yaml配置文件
        • 2.1、修改etcd_endpoints为master节点IP
        • 2.2、将etcd的CA证书进行加密、赋值
        • 2.3、将值对内容进行替换
        • 2.4、定义Calico的网段
      • 3、执行配置文件
      • 4、calico网络测试
    • 七、Master1 部署 Metrics
      • 1、Master1节点操作
      • 2、master1节点apply
      • 3、查看效果
    • 八、Master1 部署 Dashboard
      • 1、指定版本安装(本实验)
      • 2、安装最新版本(二选一)
        • 2.1、官网指定命令执行
        • 2.2、创建管理员用户
      • 3、登入Web页面
        • 3.1、更改dashboard的svc为NodePort
        • 3.2、再次查看svc
        • 3.3、访问Web页面
        • 3.4、获取token
        • 3.5、登入Web页面查看
    • 九、kube-proxy开启 ipvs
      • 1、Mastrer1 修改模式
      • 2、更新kube-proxy
      • 3、所有节点进行验证
    • 十、学会查看官方文档 -> kubectl备忘录
    • 十一、测试环境节省资源,驱离Node节点
      • 1、驱离 k8s-node1
      • 2、驱离k8s-node2
      • 3、测试查看
    • 十二、问题解决
      • 1、加入集群的 Token 过期
        • 1.1、生成Node节点加入集群的 Token
        • 1.2、生成Master节点加入集群的 --certificate-key
      • 2、master节点 无法部署非系统Pod
        • 2.1、查看污点
        • 2.2、取消污点
      • 3、修改NodePort的默认端口

kubeadm部署高可用集群

在这里插入图片描述

注意事项

  • 最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳

  • 学会一个版本的 高可用部署,其他版本操作都差不多

  • 不要使用带中文的服务器

  • 宿主机尽量不要使用克隆(可能在后期calico网络部署时,pod网络不同的问题),使用全新的机器

  • 宿主机尽量升级到CentOS 7.9

  • 内核kernel升级到 4.19+ 这种稳定的内核

  • 部署k8s版本时,尽量找 1.xx.5 这种大于5的小版本(这种一般是比较稳定的版本)

  • k8s版本在一年之内进行更新一次

  • master在测试环境 为 2核3G

  • node节点在测试环境为 2核2G

k8s部署 二进制与高可用的区别

二进制部署

  • 部署难,管理方便,集群伸展性能好
  • 更稳定,集群规模到达一定的规模(几百个节点、上万个Pod),二进制稳定性是要高于kubeadm部署
  • 遇到故障,宿主机起来了,进程也会起来

kubeadm部署

  • 部署简单,管理难
  • 是以一种容器管理容器的方式允许的组件及服务,故障恢复时间比二进制慢
  • 遇到故障,启动宿主机,在启动进程,最后去启动容器,集群才能恢复,速度比二进制慢

一、环境配置

Sys-VersionhostnameIP地址性能
CentOS7.9k8s-master1192.168.178.512核3G
CentOS7.9k8s-master2192.168.178.522核3G
CentOS7.9k8s-master3192.168.178.532核3G
CentOS7.9k8s-node1192.168.178.542核2G
CentOS7.9k8s-node2192.168.178.552核2G
Sys-VersionAPP
v1.20.12Kubernetes
v20.10.10Docker
v3.15.3Calico
v2.0.4Dashboard

1、所有节点修改主机名

# hostnamectl set-hostname k8s-master1
# hostnamectl set-hostname k8s-master2
# hostnamectl set-hostname k8s-master3
# hostnamectl set-hostname k8s-node1
# hostnamectl set-hostname k8s-node2

2、所有节点进行域名解析

# vi /etc/hosts
192.168.178.51  k8s-master1
192.168.178.52  k8s-master2
192.168.178.53  k8s-master3
192.168.178.200 k8s-master-lb	#此为VIP的地址
192.168.178.54  k8s-node1
192.168.178.55  k8s-node2

3、所有节点关闭相关应用

3.1、防火墙关闭

# systemctl disable --now firewalld
# setenforce 0
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

3.2、dnsmasq关闭

#没有该目录就直接跳过
# systemctl disable --now dnsmasq

3.3、NetworkManager关闭

# systemctl disable --now NetworkManager

3.4、关闭SWAP分区

# swapoff -a && sysctl -w vm.swappiness=0
# sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

3.5、检查MAC和product_uuid

# ip link
# cat /sys/class/dmi/id/product_uuid

4、所有节点获取相关软件

4.1、获取aliyun源

# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# yum install -y yum-utils device-mapper-persistent-data lvm2

4.2、获取docker-yum源

# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.3、配置k8s-Yum源

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=1
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

4.4、安装必备工具

# yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git bash-completion lrzsz -y

5、所有节点时间同步

5.1、安装ntpdate

# rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
# yum install ntpdate -y

5.2、时间同步

# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# echo 'Asia/Shanghai' >/etc/timezone
# ntpdate time2.aliyun.com

5.3、计划任务时间同步

# systemctl enable --now crond
# crontab -e
添加并保存退出,每隔5秒进行时间同步
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com
# crontab -l
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com

6、所有节点实现Linux的资源限制

# 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

7、master1进行免密

生成公钥
# ssh-keygen -t rsa

公钥推送
# for i in k8s-master1 k8s-master2 k8s-master3 k8s-node1 k8s-node2;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

二、内核配置

1、所有节点进行升级update、重启

# yum update -y --exclude=kernel*
# reboot

2、所有节点升级内核

2.1、master1获取RPM包

[root@k8s-master1 ~]# wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm

[root@k8s-master1 ~]# wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm

2.2、master1拷贝至所有节点

# for i in k8s-master2 k8s-master3 k8s-node1 k8s-node2;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done

2.3、安装内核

# cd /root/
# yum localinstall -y kernel-ml*

2.3、更改内核启动方式

# grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg

# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

# grubby --default-kernel

#reboot

3、所有节点安装与配置ipvsadm

1、安装软件

# yum install ipvsadm ipset sysstat conntrack libseccomp -y

2、配置内核参数

🔺注意:所有节点配置ipvs模块,在内核**4.19+**版本nf_conntrack_ipv4已经改为nf_conntrack, 4.18-以下使用nf_conntrack_ipv4即可

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

3、配置生效

# systemctl enable --now systemd-modules-load.service

4、开启k8s必须的内核参数

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 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

5、重启,加载内核

# reboot

#重启之后查看参数是否生效
#lsmod | grep --color=auto -e ip_vs -e nf_conntrack

三、基本组件安装、配置

1、所有节点部署Docker

1.1、安装docker-ce

# yum makecache  && yum -y install docker-ce -y 

1.2、修改 CgroupDriver 为 systemd

🔺**注意:**由于新版kubelet建议使用systemd,所以可以把docker的CgroupDriver改成systemd

# mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

1.3、开机自启动Docker

# systemctl daemon-reload && systemctl enable --now docker

# docker info | grep Cgroup
 Cgroup Driver: systemd
 
# docker -v
Docker version 20.10.10, build b485636

2、所有节点安装k8s组件

2.1、查看可安装的k8版本

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

2.2、安装kubeadm

1、安装指定版本(本实验采用)
# yum install kubeadm-1.20* kubelet-1.20* kubectl-1.20* -y

2、安装最新版本
# yum install kubeadm kubelet kubectl -y

2.3、配置默认的拉取镜像仓库

🔺**注意:**默认配置的pause镜像使用gcr.io仓库, 国内可能无法访问, 所以这里配置Kubelet使用阿里云的pause镜像

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF

2.4、设置kubelet开机自启

# systemctl daemon-reload
# systemctl enable --now kubelet

四、高可用组件安装、配置

🔺**注意:**如果不是高可用集群,haproxy和keepalived无需安装

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

1、master节点部署Haproxy

1.1、安装haproxy

# yum -y install haproxy

1.2、编写haproxy配置

所有master节点配置一致

# cd /etc/haproxy/
# cp -r haproxy.cfg  haproxy.cfg.bak

# vim haproxy.cfg
global				#全局配置
  maxconn  2000		#最大连接数
  ulimit-n  16384	#资源限制
  log  127.0.0.1 local0 err		#err 级别日志定义
  stats timeout 30s				# 30秒超时

defaults			#默认配置
  log global		#日志定义					
  mode  http		#使用 http 协议
  option  httplog
  timeout connect 5000		#超时连接 5秒
  timeout client  50000		#客户端超时连接 50秒
  timeout server  50000		#服务端超时连接 50秒
  timeout http-request 15s	#http请求超时 15s
  timeout http-keep-alive 15s	#keepalived长连接保存 15s

frontend monitor-in			#Web监控页面
  bind *:33305				#绑定地址
  mode http					
  option httplog
  monitor-uri /monitor		#地址为 IP:33305/monitor

frontend k8s-master			#前端配置
  bind 0.0.0.0:16443		#绑定地址,通过该地址 IP: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			#tcp检测
  balance roundrobin		#轮询策略
  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  server k8s-master1	192.168.178.51:6443  check		#对应的k8s集群中的master
  server k8s-master2	192.168.178.52:6443  check
  server k8s-master3	192.168.178.53:6443  check

2、master节点部署keepalived

2.1、安装keepalived

# yum -y install keepalived
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf

2.2、配置keepalived

a、master1配置
! Configuration File for keepalived
global_defs {			#全局配置
    router_id k8s-master1	#路由标识符,节点配置不同
	script_user root		#使用脚本的用户
    enable_script_security	#脚本安全性
}
vrrp_script chk_apiserver {			#开启监控脚本
    script "/etc/keepalived/check_apiserver.sh"		#对应目录编写脚本,授权 +x
    interval 5		#每隔5秒去检测一次
    weight -5		#检测命中,权重减少 5
    fall 2  		#总共检测 2次
	rise 1			#命中一次,该主机的权重减5
}
vrrp_instance VI_1 {	#虚拟路由组唯一标识符,同一 "主备" 需配置一样
    state MASTER		#该主机的身份 为 Master
    interface ens33		#本主机的接口
    mcast_src_ip 192.168.178.51		#心跳源,本机IP
    virtual_router_id 51			#虚拟路由ID,同 "主备" 相同
    priority 101					#权重,优先级
    advert_int 2					#j的间隔,每2秒执行一次
    authentication {				#认证,同 "主备" 必须一致
        auth_type PASS				#认证类型
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {				#虚拟VIP的地址
        192.168.178.200
    }
    track_script {					#开启监控检查脚本,遇上方的 名称 一致
       chk_apiserver
    }
}
b、master2配置
! Configuration File for keepalived
global_defs {
    router_id k8s-master2     #路由唯一标识符
	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		#角色为 BACKUP	
    interface ens33
    mcast_src_ip 192.168.178.52		#心跳源
    virtual_router_id 51
    priority 100		#权重、优先级为 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.178.200
    }
    track_script {
       chk_apiserver
    }
}
c、master3配置
! Configuration File for keepalived
global_defs {
    router_id k8s-master3	#路由标识符
	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		#身份为 BACKUP
    interface ens33
    mcast_src_ip 192.168.178.53		#心跳源
    virtual_router_id 51
    priority 100		#权重、优先级 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.178.200
    }
    track_script {
       chk_apiserver
    }
}

2.3、创建对应的脚本文件

# vim /etc/keepalived/check_apiserver.sh

#!/bin/bash
#time:2021-11-04
#user:CloudPeng
#description
#该脚本用于检测haproxy的运行状态,检测失败,停止 keepalived 实现 VIP 的转移
err=0	#失败次数
for k in $(seq 1 3)		#总共检查第三次
do
    check_code=$(pgrep haproxy)		#pgrep 检查正在运行的程序,成功显示进程 PID,不成功显示 空
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 1
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then		#如果检测失败的次数不为0,停止keepalived 实现 VIP 转移
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi

🔺**注意:**这里还有一个脚本可以选择,两个脚本选择其中一个即可,看自己的需求

#!/bin/bash
#user: CloudPeng
#time: 2021-10-17
#description
#该脚本用于监控Haproxy的状态,当Haproxy的状态为down,干掉keepalived,实现 failover 故障转移

        counter=$(ps -C haproxy --no-heading|wc -l)
         if [ "${counter}" = "0" ]; then
             systemctl restart haproxy
             sleep 5                  #尝试启动一次nginx,停止5秒后再次检测
          counter=$(ps -C haproxy --no-heading|wc -l)
          if [ "${counter}" = "0" ]; then
                 systemctl stop keepalived #如果启动没成功,就杀掉keepalive触发主备>切换
          fi
         fi

2.4、脚本授权

# chmod +x /etc/keepalived/check_apiserver.sh 
# ls -l
total 12
-rwxr-xr-x 1 root root  356 Nov  4 20:09 check_apiserver.sh
-rw-r--r-- 1 root root  590 Nov  4 20:31 keepalived.conf
-rw-r--r-- 1 root root 3598 Nov  4 19:51 keepalived.conf.b

3、master节点启动LB与HA

1、开机自启动

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

2、检测VIP可用性

1、在master1上查看VIP:
[root@k8s-master1 keepalived]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.178.51/24 brd 192.168.178.255 scope global ens33
    inet 192.168.178.200/32 scope global ens33	#VIP

2、所有节点ping,测试VIP:
# ping 192.168.178.200
PING 192.168.178.200 (192.168.178.200) 56(84) bytes of data.
64 bytes from 192.168.178.200: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 192.168.178.200: icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from 192.168.178.200: icmp_seq=3 ttl=64 time=0.079 ms

# telnet 192.168.178.200 16443
Trying 192.168.178.200...
Connected to 192.168.178.200.
Escape character is '^]'.		#连接成功
Connection closed by foreign host.

五、集群初始化

所有master节点

registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.20.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.20.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.20.0
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2

所有node节点

registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.0

registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2

registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 #只在一个节点,使用选择器

1、master1编写yaml配置文件

# vim /root/kubeadm-config.yaml
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.178.51		#master1 的 IP
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master1			#自定义名称
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - 192.168.178.200			#VIP地址
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.178.200:16443		#VIP地址:端口,加入
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  podSubnet: 172.168.0.0/12			#Pod网段
  serviceSubnet: 10.96.0.0/12		#Service网段
scheduler: {}


2、更新 Yaml 文件
# cd /root
# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

2、master所有节点提前拉取镜像

2.1、master1拉取镜像

[root@k8s-master1 ~]# kubeadm config images pull --config /root/new.yaml
[root@k8s-master1 ~]# docker image ls
REPOSITORY                             TAG        IMAGE ID       CREATED         SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.0    10cc881966cf   11 months ago   118MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.0    ca9843d3b545   11 months ago   122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.0    b9fa1895dcaa   11 months ago   116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.0    3138b6e3d471   11 months ago   46.4MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   14 months ago   253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   16 months ago   45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   20 months ago   683kB


#拷贝yaml配置文件给其他主机,通过配置文件进行拉取镜像
[root@k8s-master1 ~]# scp -r new.yaml k8s-master2:/root/
[root@k8s-master1 ~]# scp -r new.yaml k8s-master3:/root/

2.2、master2拉取镜像

[root@k8s-master2 ~]# kubeadm config images pull --config /root/new.yaml
[root@k8s-master2 ~]# docker image ls
REPOSITORY                                                                    TAG        IMAGE ID       CREATED         SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.0    10cc881966cf   11 months ago   118MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.0    ca9843d3b545   11 months ago   122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.0    b9fa1895dcaa   11 months ago   116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.0    3138b6e3d471   11 months ago   46.4MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   14 months ago   253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   16 months ago   45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   20 months ago   683kB

2.3、master3拉取镜像

[root@k8s-master3 keepalived]# kubeadm config images pull --config /root/new.yaml
[root@k8s-master3 keepalived]# docker image ls
REPOSITORY                                                                    TAG        IMAGE ID       CREATED         SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.0    10cc881966cf   11 months ago   118MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.0    b9fa1895dcaa   11 months ago   116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.0    3138b6e3d471   11 months ago   46.4MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.0    ca9843d3b545   11 months ago   122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   14 months ago   253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   16 months ago   45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   20 months ago   683kB

3、所有节点自启动kubelet

# systemctl enable --now kubelet

4、master1进行初始化

4.1、master1节点进行初始化

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

[root@k8s-master1 ~]# kubeadm init --config /root/new.yaml  --upload-certs
.........
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:
#master节点加入使用的命令,记录!
  kubeadm join 192.168.178.200:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
    --control-plane --certificate-key 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:
#node节点加入使用的命令。记录!
kubeadm join 192.168.178.200:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98
4.1.1、初始化失败,进行的操作
# kubeadm reset -f
# ipvsadm --clear 
# rm -rf ~/.kube
# 再次进行初始化

4.2、master1节点配置环境变量

cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
[root@k8s-master1 ~]# source ~/.bashrc 

[root@k8s-master1 ~]# kubectl get nodes
NAME           STATUS     ROLES                  AGE     VERSION
k8s-master01   NotReady   control-plane,master   4m59s   v1.20.12

[root@k8s-master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8m59s

[root@k8s-master1 ~]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-54d67798b7-7d676               0/1     Pending   0          12m
coredns-54d67798b7-mkrmq               0/1     Pending   0          12m
etcd-k8s-master01                      1/1     Running   0          12m
kube-apiserver-k8s-master01            1/1     Running   0          12m
kube-controller-manager-k8s-master01   1/1     Running   0          12m
kube-proxy-tbl27                       1/1     Running   0          12m
kube-scheduler-k8s-master01            1/1     Running   0          12m

4.3、kubelet命令补全

[root@k8s-master1 ~]# source <(kubectl completion bash)
[root@k8s-master1 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
# 退出当前shell生效,重登
[root@k8s-master1 ~]# exit

5、所有节点加入集群

5.1、master节点加入集群

#使用上方的master1初始化成功时进行记录的命令:
kubeadm join 192.168.178.200:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
    --control-plane --certificate-key 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96
    
.........
This node has joined the cluster and a new control plane instance was created:

* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane (master) label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.

To start administering your cluster from this node, you need to run the following as a regular user:

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

Run 'kubectl get nodes' to see this node join the cluster.

5.2、node节点加入集群

#使用上方的master1初始化成功时进行记录的命令:
kubeadm join 192.168.178.200:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98

.........
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

5.3、master1再次查看集群信息

[root@k8s-master1 ~]# kubectl get nodes 
NAME           STATUS     ROLES                  AGE     VERSION
k8s-master01   NotReady   control-plane,master   25m     v1.20.12
k8s-master2    NotReady   control-plane,master   3m51s   v1.20.12
k8s-master3    NotReady   control-plane,master   2m52s   v1.20.12
k8s-node1      NotReady   <none>                 102s    v1.20.12
k8s-node2      NotReady   <none>                 98s     v1.20.12

六、master1 网络插件 Calico 部署

所有节点

registry.cn-beijing.aliyuncs.com/dotbalo/cni
registry.cn-beijing.aliyuncs.com/dotbalo/pod2daemon-flexvol
registry.cn-beijing.aliyuncs.com/dotbalo/node
registry.cn-beijing.aliyuncs.com/dotbalo/kube-controllers #只有该镜像只在一个节点 replicas:1

1、下载所需的源码文件

**下载地址:**https://codeload.github.com/dotbalo/k8s-ha-install/zip/refs/heads/manual-installation-v1.20.x
在这里插入图片描述

[root@k8s-master1 ~]# mkdir /root/git ; cd /root/git/
将下载的压缩包上传该目录
[root@k8s-master1 git]# yum -y install lrzsz unzip
[root@k8s-master1 git]# unzip k8s-ha-install-manual-installation-v1.20.x.zip 
[root@k8s-master1 git]# ls
k8s-ha-install-manual-installation-v1.20.x

2、修改yaml配置文件

2.1、修改etcd_endpoints为master节点IP

[root@k8s-master1 git]# cd k8s-ha-install-manual-installation-v1.20.x/calico/

[root@k8s-master1 calico]# sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://192.168.178.51:2379,https://192.168.178.52:2379,https://192.168.178.53:2379"#g' calico-etcd.yaml

2.2、将etcd的CA证书进行加密、赋值

解析:

  • 先将 ca.crt 证书进行 base64 加密,去掉换行符,赋值给 ETCD_CA
  • 先将 server.crt 证书进行 base64 加密,去掉换行符,赋值给 ETCD_CERT
  • 先将 server.key 证书进行 base64 加密,去掉换行符,赋值给 ETCD_KEY
[root@k8s-master1 calico]# ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
[root@k8s-master1 calico]# ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`

[root@k8s-master1 calico]# ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`

2.3、将值对内容进行替换

解析:

对 calico-etcd.yaml 文件进行操作

  • 将内容中的 # etcd-key: null 替换为 etcd-key: ${ETCD_KEY}

  • 将内容中的 # etcd-cert: null 替换为 etcd-cert: ${ETCD_CERT}

  • 将内容中的 # etcd-ca: null 替换为 etcd-ca: ${ETCD_CA}@g

  • 将内容中的 etcd_ca: “” 替换为 etcd_ca: “/calico-secrets/etcd-ca”

  • 将内容中的 etcd_cert: “” 替换为 etcd_cert: “/calico-secrets/etcd-cert”

  • 将内容中的 etcd_key: “” 替换为 etcd_key: “/calico-secrets/etcd-key”

[root@k8s-master1 calico]# 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

[root@k8s-master1 calico]# 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

2.4、定义Calico的网段

[root@k8s-master1 ~]# cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'
172.168.0.0/12

[root@k8s-master1 calico]# POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

[root@k8s-master1 calico]# 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


[root@k8s-master1 calico]# cat calico-etcd.yaml | grep -A1 'CALICO_IPV4POOL_CIDR'
            - name: CALICO_IPV4POOL_CIDR
              value: 172.168.0.0/12
              #之前master1初始化集群是设置的Pod的网段

3、执行配置文件

[root@k8s-master1 calico]# kubectl apply -f calico-etcd.yaml 
secret/calico-etcd-secrets created
configmap/calico-config created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

[root@k8s-master1 calico]# kubectl get pod -n kube-system 
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5f6d4b864b-5tfck   1/1     Running   0          2m6s
calico-node-8zn7h                          1/1     Running   0          2m6s
calico-node-btngk                          1/1     Running   0          2m6s
calico-node-j6847                          1/1     Running   0          2m6s
calico-node-k86mh                          1/1     Running   0          2m6s
calico-node-v78kq                          1/1     Running   0          2m6s
coredns-54d67798b7-7d676                   1/1     Running   0          73m
coredns-54d67798b7-mkrmq                   1/1     Running   0          73m
etcd-k8s-master01                          1/1     Running   2          73m
etcd-k8s-master2                           1/1     Running   0          51m
etcd-k8s-master3                           1/1     Running   0          49m
kube-apiserver-k8s-master01                1/1     Running   2          73m
kube-apiserver-k8s-master2                 1/1     Running   0          51m
kube-apiserver-k8s-master3                 1/1     Running   1          49m
kube-controller-manager-k8s-master01       1/1     Running   3          73m
kube-controller-manager-k8s-master2        1/1     Running   0          51m
kube-controller-manager-k8s-master3        1/1     Running   0          50m
kube-proxy-87g9m                           1/1     Running   0          50m
kube-proxy-fwj5h                           1/1     Running   0          49m
kube-proxy-rl6r5                           1/1     Running   0          51m
kube-proxy-tbl27                           1/1     Running   2          73m
kube-proxy-w7pz2                           1/1     Running   0          49m
kube-scheduler-k8s-master01                1/1     Running   3          73m
kube-scheduler-k8s-master2                 1/1     Running   0          51m
kube-scheduler-k8s-master3                 1/1     Running   0          49m

[root@k8s-master1 calico]# kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master01   Ready    control-plane,master   75m   v1.20.12
k8s-master2    Ready    control-plane,master   54m   v1.20.12
k8s-master3    Ready    control-plane,master   53m   v1.20.12
k8s-node1      Ready    <none>                 51m   v1.20.12
k8s-node2      Ready    <none>                 51m   v1.20.12

4、calico网络测试

**解析:**测试Calico部署的网络是否有用,创建多个Pod,Pod之间的通信,与Svc之间的通信等。

[root@k8s-master1 ~]# vim nginx-dp.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: daocloud.io/library/nginx:latest
        name: nginx

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc

spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx-deploy
    
[root@k8s-master1 ~]# kubectl apply -f nginx-dp.yaml 
deployment.apps/nginx-deploy created
service/nginx-svc created

[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP           NODE   
nginx-deploy-76bcbdfc49-vlzzd   1/1     Running   0      52s   172.173.131.7    k8s-node2  
nginx-deploy-76bcbdfc49-whkxh   1/1     Running   0      52s   172.175.156.68   k8s-node1  

[root@k8s-master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        13h
nginx-svc    NodePort    10.109.140.116   <none>        80:30080/TCP   68s
1、使用Pod-IP访问:
[root@k8s-master1 ~]# curl -I 172.173.131.7
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:16:16 GMT

[root@k8s-master1 ~]# curl -I 172.175.156.68
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:16:27 GMT

2、使用的clustr-IP访问:
[root@k8s-master1 ~]# curl -I 10.109.140.116:80
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:17:12 GMT

3、使用NodePort-IP访问:
[root@k8s-master1 ~]# curl -I 192.168.178.54:30080
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:18:22 GMT
[root@k8s-master1 ~]# curl -I 192.168.178.55:30080
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:19:11 GMT

4、使用容器中的Pod访问:
[root@k8s-master1 ~]# kubectl exec -it  nginx-deploy-76bcbdfc49-vlzzd -- /bin/sh
# curl -I 172.175.156.68
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:22:03 GMT

# curl -I 10.109.140.116
HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Fri, 05 Nov 2021 04:23:42 GMT

七、Master1 部署 Metrics

你可以通过 节点选择 去部署该组件,只在一个节点部署即可

registry.cn-beijing.aliyuncs.com/dotbalo/metrics-server:v0.4.1

**解析:**Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。

1、Master1节点操作

解析:将Master01节点的front-proxy-ca.crt复制到所有Node节点

[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node1:/etc/kubernetes/pki/front-proxy-ca.crt

[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node2:/etc/kubernetes/pki/front-proxy-ca.crt

2、master1节点apply

[root@k8s-master1 ~]# cd /root/git/k8s-ha-install-manual-installation-v1.20.x/metrics-server-0.4.x-kubeadm/

[root@k8s-master1 metrics-server-0.4.x-kubeadm]# ls
comp.yaml

[root@k8s-master1 metrics-server-0.4.x-kubeadm]# kubectl apply -f comp.yaml 
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

3、查看效果

[root@k8s-master1 ~]# kubectl top node 
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master01   123m         6%     1000Mi          34%       
k8s-master2    122m         6%     1438Mi          50%       
k8s-master3    125m         6%     1369Mi          47%       
k8s-node1      54m          2%     813Mi           40%       
k8s-node2      64m          3%     876Mi           43%

[root@k8s-master1 ~]# kubectl top pod -n kube-system         

八、Master1 部署 Dashboard

你可以通过 节点选择 去部署该组件,只在一个节点部署即可

registry.cn-beijing.aliyuncs.com/dotbalo/dashboard:v2.0.4
registry.cn-beijing.aliyuncs.com/dotbalo/metrics-scraper:v1.0.4

1、指定版本安装(本实验)

[root@k8s-master1 ~]# cd /root/git/k8s-ha-install-manual-installation-v1.20.x/dashboard/

[root@k8s-master1 dashboard]# ls
dashboard-user.yaml  dashboard.yaml

[root@k8s-master1 dashboard]# kubectl apply -f ./
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

[root@k8s-master1 dashboard]# kubectl get svc -n kubernetes-dashboard 
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
dashboard-metrics-scraper   ClusterIP   10.109.202.201   <none>        8000/TCP   5m29s
kubernetes-dashboard        ClusterIP   10.96.194.27     <none>        443/TCP    5m29s

2、安装最新版本(二选一)

🥇**官方GitHub地址:**https://github.com/kubernetes/dashboard

在这里插入图片描述

2.1、官网指定命令执行

# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2.2、创建管理员用户

# vim admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding 
metadata: 
  name: admin-user
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
  
# kubectl apply -f admin.yaml -n kube-system

3、登入Web页面

3.1、更改dashboard的svc为NodePort

[root@k8s-master1 dashboard]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
#找到并修改
spec:
  clusterIP: 10.96.194.27
  clusterIPs:
  - 10.96.194.27
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort	#找到此处进行修改

3.2、再次查看svc

[root@k8s-master1 dashboard]# kubectl get svc -n kubernetes-dashboard 
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.109.202.201   <none>        8000/TCP        7m40s
kubernetes-dashboard        NodePort    10.96.194.27     <none>        443:32661/TCP   7m40s

3.3、访问Web页面

关闭该提示,注意 此为 谷歌浏览器 Google

在这里插入图片描述

参数:–test-type --ignore-certificate-errors

在这里插入图片描述

重启浏览器,再次访问,没有提示
在这里插入图片描述

3.4、获取token

[root@k8s-master1 dashboard]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-7pm6f
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: f52de3a4-31b0-4ffa-8851-7dba77a8b029

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlA1a3A5M2pydjdFZGlycTFjaFhfRUdXLVBfNnNzNGQ2UGdNdjN4NW9RTkkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTdwbTZmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmNTJkZTNhNC0zMWIwLTRmZmEtODg1MS03ZGJhNzdhOGIwMjkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.SwF42kujMIzyHtGWSitDXASeSqgZ5PL2PJjdq-cIe-2hYAh9SsYsXVFRWuka6jG66OeNG71IZ7huKe8_sfv5cQ_v_j0ilMiP0aTo3YQhdU-PKKWIsfGwI7BfiRtk9JzWQlDYJCPM8Nn_lFZDLCMoeJ_FeQG8zBxoAkgL1nvAaJICPQbs_A-PwwMTmuUurttiu9CF6HOoiWlCxCMWLEGXIwGl43Wc4evP3qpuBYcsrymeC91LSd4Szn-uqb5_aS6JKKYtTQb2_nQ8LjECCvMyH6tPbqW_pPSi8FNfqhSUtMV3ls93Ilmm8X6ZJNjCkBxcxN89ED1RKcrJBrGgL2aE_A

在这里插入图片描述

3.5、登入Web页面查看

在这里插入图片描述在这里插入图片描述

九、kube-proxy开启 ipvs

🔺**注意:**在后期实验中发现,要实现Pod内部与Service之间的通信,就是我们可以通过 ServiceName.Namespace.svc.cluster.local 访问到Service,必须把kube-proxy的模式修改为 IPVS 模式,才能进行通信。

1、Mastrer1 修改模式

[root@k8s-master1 ~]# kubectl edit cm kube-proxy -n kube-system
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"	#添加此处 ipvs 即可,保存退出

2、更新kube-proxy

[root@k8s-master1 ~]# kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system

3、所有节点进行验证

[root@k8s-master1 ~]# curl 127.0.0.1:10249/proxyMode
ipvs
[root@k8s-master2 ~]# curl 127.0.0.1:10249/proxyMode
ipvs
[root@k8s-master3 keepalived]# curl 127.0.0.1:10249/proxyMode
ipvs
[root@k8s-node1 ~]# curl 127.0.0.1:10249/proxyMode
ipvs
[root@k8s-node2 ~]# curl 127.0.0.1:10249/proxyMode
ipvs

十、学会查看官方文档 -> kubectl备忘录

🥇**官网地址:**https://kubernetes.io/

🥇**官方文档:**https://kubernetes.io/zh/docs/reference/kubectl/
在这里插入图片描述

十一、测试环境节省资源,驱离Node节点

🗡**注意:**进行驱离Node节点节省资源,驱离完成后,需要在master上部署Pod,但master节点上有污点,参考下方的 "问题解决 " 中的 < 2、master节点 无法部署非系统Pod >

1、驱离 k8s-node1

[root@k8s-master1 ~]# kubectl drain k8s-node2 --delete-local-data --ignore-daemonsets --force 
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/k8s-node2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-8zn7h, kube-system/kube-proxy-6t2b8
evicting pod kubernetes-dashboard/dashboard-metrics-scraper-7645f69d8c-78x8r
evicting pod default/nginx-deploy-7d5f68dc69-smjtv
evicting pod kube-system/coredns-54d67798b7-mkrmq
evicting pod kube-system/coredns-54d67798b7-7d676
evicting pod kube-system/metrics-server-545b8b99c6-d2ldd
pod/dashboard-metrics-scraper-7645f69d8c-78x8r evicted
pod/metrics-server-545b8b99c6-d2ldd evicted
pod/nginx-deploy-7d5f68dc69-smjtv evicted
pod/coredns-54d67798b7-mkrmq evicted
pod/coredns-54d67798b7-7d676 evicted
node/k8s-node2 evicted

[root@k8s-master1 ~]# kubectl get nodes
NAME           STATUS                     ROLES                  AGE   VERSION
k8s-master01   Ready                      control-plane,master   37h   v1.20.12
k8s-master2    Ready                      control-plane,master   37h   v1.20.12
k8s-master3    Ready                      control-plane,master   37h   v1.20.12
k8s-node1      Ready                      <none>                 37h   v1.20.12
k8s-node2      Ready,SchedulingDisabled   <none>                 37h   v1.20.12

[root@k8s-master1 ~]# kubectl delete nodes k8s-node2 
node "k8s-node2" deleted

[root@k8s-master1 ~]# kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master01   Ready    control-plane,master   37h   v1.20.12
k8s-master2    Ready    control-plane,master   37h   v1.20.12
k8s-master3    Ready    control-plane,master   37h   v1.20.12
k8s-node1      Ready    <none>                 37h   v1.20.12


2、驱离k8s-node2

[root@k8s-master1 ~]# kubectl drain k8s-node1 --delete-local-data --ignore-daemonsets --force 
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/k8s-node1 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-k86mh, kube-system/kube-proxy-rswpm
evicting pod kubernetes-dashboard/kubernetes-dashboard-78cb679857-gvfx2
evicting pod default/hello-f9jr6
evicting pod default/nginx-deploy-7d5f68dc69-v6s8p
evicting pod kube-system/calico-kube-controllers-5f6d4b864b-5tfck
evicting pod kube-system/metrics-server-545b8b99c6-jnc9r
evicting pod default/nginx-deploy-7d5f68dc69-xtrdr
pod/hello-f9jr6 evicted
pod/nginx-deploy-7d5f68dc69-xtrdr evicted
pod/metrics-server-545b8b99c6-jnc9r evicted
pod/kubernetes-dashboard-78cb679857-gvfx2 evicted
pod/nginx-deploy-7d5f68dc69-v6s8p evicted
pod/calico-kube-controllers-5f6d4b864b-5tfck evicted
node/k8s-node1 evicted

[root@k8s-master1 ~]# kubectl delete nodes k8s-node1 
node "k8s-node1" deleted

[root@k8s-master1 ~]# kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master01   Ready    control-plane,master   37h   v1.20.12
k8s-master2    Ready    control-plane,master   37h   v1.20.12
k8s-master3    Ready    control-plane,master   37h   v1.20.12

3、测试查看

**解析:**可以编写一个简单的 yaml 文件进行测试,查看 Pod部署的主机

[root@k8s-master1 ~]# vim nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: daocloud.io/library/nginx:latest
        imagePullPolicy: IfNotPresent
        name: nginx

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc

spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 80
  selector:
    app: nginx-deploy

[root@k8s-master1 ~]# kubectl get pod -o wide 
NAME                          READY   STATUS    RESTARTS   AGE   IP         NODE         
nginx-deploy-7d5f68dc69-hjnhq   1/1     Running   0   28s   172.171.95.195    k8s-master3 
nginx-deploy-7d5f68dc69-nvj4b   1/1     Running   0   22s   172.170.159.132   k8s-master01 

十二、问题解决

1、加入集群的 Token 过期

🔺**注意:**Token值在集群初始化后,有效期为 24小时 ,过了24小时过期。进行重新生成Token,再次加入集群,新生成的Token为 2小时。

1.1、生成Node节点加入集群的 Token

[root@k8s-master1 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.178.200:16443 --token menw99.1hbsurvl5fiz119n     --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab865	12420215242c4313fb830a4eb98

1.2、生成Master节点加入集群的 --certificate-key

[root@k8s-master1 ~]# kubeadm init phase upload-certs  --upload-certs
I1105 12:33:08.201601   93226 version.go:254] remote version is much newer: v1.22.3; falling back to: stable-1.20
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
38dba94af7a38700c3698b8acdf8e23f273be07877f5c86f4977dc023e333deb

#master节点加入集群的命令
kubeadm join 192.168.178.200:16443 --token menw99.1hbsurvl5fiz119n     --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
 --control-plane --certificate-key 38dba94af7a38700c3698b8acdf8e23f273be07877f5c86f4977dc023e333deb

2、master节点 无法部署非系统Pod

**解析:**主要是因为master节点被加上污点,污点是不允许部署非系统 Pod,在 测试 环境,可以将污点去除,节省资源,可利用率。

2.1、查看污点

[root@k8s-master1 ~]# kubectl  describe node -l node-role.kubernetes.io/master=  | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             node-role.kubernetes.io/master:NoSchedule

2.2、取消污点

[root@k8s-master1 ~]# kubectl  taint node  -l node-role.kubernetes.io/master node-role.kubernetes.io/master:NoSchedule-
node/k8s-master01 untainted
node/k8s-master02 untainted
node/k8s-master03 untainted

[root@k8s-master1 ~]# kubectl  describe node -l node-role.kubernetes.io/master=  | grep Taints
Taints:             <none>
Taints:             <none>
Taints:             <none>

3、修改NodePort的默认端口

原理: 默认k8s的使用端口的范围为30000左右,作为对外部提供的端口。我们也可以通过对配置文件的修改去指定默认的对外端口的范围。

#报错
The Service "nginx-svc" is invalid: spec.ports[0].nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767


[root@k8s-master1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --service-cluster-ip-range=10.96.0.0/12
- --service-node-port-range=1-65535    #找到后进行添加即可

#无需重启,k8s会自动生效
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubeadm-K8s1.20-高可用部署-详细-生产环境(四) 的相关文章

  • oninput完美限制输入正整数

    oninput完美限制输入非0正整数 注意vue中需要 64 input进行绑定 方法一 64 input 61 34 if this value length 61 61 1 this value 61 this value replac
  • 行内存放数据属性data-id

    data 61 39 data 39 为行内存放数据的属性 xff0c 可通过事件源中的currentTarget dataset获取data 存放的值 另外css可通过 data 放置的标签名 data 61 39 data 39 设置
  • js常用封装方法

    span class token comment 生成随机数 64 length 指定长度 return 随机数 span span class token keyword export span function span class t
  • 计数器组件

    涉及事件 64 longpress 长按时触发 xff0c 64 touchend 手指从屏幕上离开时触发 1 计数器为文本标签的子组件 lt template gt lt view class 61 34 counter box 34 g
  • rich-text 富文本

    rich text 富文本 普通的text文件不能显示格式 xff0c 富文本格式rtf文件可以显示出很多格式信息 xff0c 比如可以在一个文本包含不同颜色 不同字号的文本 官方 lt rich text nodes 61 34 cont
  • uni-app实现全局组件注册

    uni app 全局注册组件三种方式 1 传统vue组件需要创建 引用 组成三个步骤 2 在page json中对应page设置 34 globalStyle 34 34 autoscan 34 true 和pages同级 3 HBuild
  • Vue--混入(Mixin)

    Vue 混入 Mixin 当不同组件有相同功能时 xff0c 不必重复定义属性和方法 xff0c 可使用vue中的混入 Mixin 来分发 Vue 组件中的可复用功能 一个 mixin 对象可以包含任意组件选项 xff0c 即data me
  • uni-app--tabs切换swiper

    父组件 span class token operator lt span template span class token operator gt span span class token operator lt span view
  • 关于移动端 html5诸多事件

    1 点击事件 64 click与 64 tap的区别 xff1a 64 click 在web手机端上点击 xff0c 有300ms延迟再被触发 64 tap具有事件穿透特点 而 64 click没有 事件冒泡 xff1a 当父元素有点击事件
  • vuex状态管理

    vue 1 下载vuex依赖 2 创建store目录store js xff0c 然后在js中引入 span class token keyword import span span class token module Vue span
  • Jmeter性能测试(8)--断言

    jmeter xff08 8 xff09 断言 jmeter中有个元件叫做断言 xff08 Assertion xff09 xff0c 它的作用和loadrunner中的检查点类似 xff1b 用于检查测试中得到的响应数据等是否符合预期 x
  • Class类

    class类的基本写法 es6引入了class类的概念 xff0c 可通过class关键字来定义类每个类都会有一个构造函数 xff0c 即constructor 方法 xff0c 用于创建和初始化class对象要注意 xff0c 如果一个类
  • install与directive

    install Vue option Vue js提供install方法 xff0c 可用于开发新插件以及全局注册组件等 span class token keyword export span span class token keywo
  • STC15W4K56S4学习笔记——LCD12864滚动显示

    STC15W4K56S4学习笔记 LCD12864滚动显示 最近在准备学校的单片机校赛 xff0c 重新回顾了一遍51单片机 xff0c 上手了STC15W4K56S4试验箱 xff0c 写一些笔记来记录一下 xff0c 水平有限 xff0
  • STM32用XCOM调试助手打印不出数据

    STM32用XCOM调试助手打印不出数据 被困扰了一段时间的串口终于解决了 xff0c 用STM332F103ZET6写串口 xff0c 但是不懂为什么打开串口调试助手就是打印不出数据 首先检查了代码有没有错 xff0c 因为是按照网上的代
  • OpenCV-python学习笔记(十二)——图像轮廓

    十二 图像轮廓 图像轮廓是指将边缘连接起来形成的一个整体 xff0c 用于后续的计算 因为边缘检测得到的边缘是不连续的 查找图像内的轮廓信息 xff1a cv2 findContours 绘制轮廓 xff1a cv2 drawContour
  • k210——maix bit串口通信

    k210 串口通信 k210 一共有3个 uart xff0c 每个 uart 可以进行自由的引脚映射 一 API函数介绍 1 1 register pin function force 61 True K210 可以通过映射来改变引脚功能
  • k210——Maixhub 云端模型训练

    k210 Maixhub 云端模型训练 一 前言 k210的模型训练可以在Maixhub 上进行 xff0c 只需要准备好需要训练的数据集 xff0c 不需要搭建训练环境和代码 xff0c 上传训练数据即可快速训练出模型 Maixhub 有
  • 自动控制原理MATLAB常用函数总结

    自动控制原理MATLAB常用函数总结 一 控制系统的数学模型 1 传递函数数学模型 G xff08 s xff09 61
  • MCS-51汇编软件实验

    MCS 51汇编软件实验 实验一 内存块移动 将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去 移动3000H起始的256个字节到4000H起始的256个字节 代码示例 xff1a ORG 0000H MOV DPTR 300

随机推荐

  • Jmeter性能测试(9)--逻辑控制器

    jmeter中逻辑控制器 xff08 Logic Controllers xff09 的作用域只对其子节点的sampler有效 xff0c 作用是控制采样器的执行顺序 jmeter提供了17种逻辑控制器 xff0c 它们各个功能都不尽相同
  • MapReduce的工作流程:map和reduce分别做了哪些工作,以及shuffle机制实现了什么

    一 map和reduce分别做了哪些工作 Map 待处理数据分片放入缓冲区 xff0c 分区 排序 合并 归并 xff0c 写入本地磁盘 将处理杂乱无章的数据 xff0c 找出规律 xff0c 归纳处理 1 读取hdfs上的文件 xff0c
  • Prometheus监控部署

    文章目录 一 通用监控系统基础知识以及Prometheus的概述1 监控系统的发展史 xff1a 2 什么是Prometheus 二 工作原理及适用性1 prometheus获取数据的方式 三 xff0c 实验环境1 关闭防火墙和核心防护P
  • Docker之 神操作!居然能修改已运行的 Docker 容器端口映射

    文章目录 一 容器未启动 xff1f 二 容器已启动 xff1f 2 1 但是想修改或者添加端口时 xff0c 先停止掉正在运行的容器 2 2 查看容器完整的 96 hash of the container 96 数值 xff1a 2 3
  • python版MapReduce基础实战

    第一关 xff1a 成绩统计 任务描述 本关任务 xff1a 使用Map Reduce计算班级中年龄最大的学生 相关知识 为了完成本关任务 xff0c 你需要掌握 xff1a 1 什么是MapReduce xff0c 2 如何使用MapRe
  • 视觉SLAM十四讲笔记六(第七讲)

    1 引言 前几节介绍了运动方程和观测方程的具体形式 xff0c 并讲解了以非线性优化为 主的求解方法 本讲 xff0c 我们将介绍什么是特征点 xff0c 如何提取和匹配特征点 xff0c 以及如何根据配对的特征点估计相机运动 2 特征点法
  • [C++教程①]--了解c语言以及第一行代码

    hellohello xff0c 我是离 今天开始 xff0c 我会对小白朋友讲解c 43 43 C 43 43 是什么 C 43 43 是C语言的继承 xff0c 它既可以进行C语言的过程化程序设计 xff0c 又可以进行以抽象数据类型为
  • 虚拟机可以ping通IP,但是ping通不了域名

    今天用VMware安装了一个centos7系统 xff0c 正常安装上去 xff0c 编辑了ifcfg ens33网卡信息 在物理机上ping虚拟机地址和百度的域名 xff0c 测试可以ping通 又去虚拟机上ping一下百度域名www b
  • 笔记(STM32篇)day12——USART串口介绍、串口初始化结构体

    目录 一 USART介绍 1 USART简介 2 USART功能框图 二 串口初始化结构体 参考 一 USART介绍 1 USART简介 通用同步异步收发器 Universal Synchronous Asynchronous Receiv
  • 京东Java后台开发岗社招面试经验分享,4面的面经!

    前言 正好最近我一朋友面试京东回来 xff0c 和我聊了他的面试经过 xff0c 最后经过四面成功斩获offer xff01 下面我把他所得经验毫无保留的分享给大家 xff01 希望对正准备面试小伙伴们能有所帮助 xff01 xff01 x
  • 关于系统架构

    系统架构 1 系统架构包括什么形式2 C S架构2 1 C S架构的软件或者系统2 2 C S架构的特点2 3 C S架构的优缺点 3 B S架构3 1 优缺点3 2 B S结构的系统的通信原理关于域名 4 WEB服务器软件4 1 WEB服
  • Jmeter性能测试(10)--参数化

    参数化是自动化测试脚本的一种常用技巧 简单来说 xff0c 参数化的一般用法就是将脚本中的某些输入使用参数来代替 xff0c 在脚本运行时指定参数的取值范围和规则 xff1b 这样 xff0c 脚本在运行时就可以根据需要选取不同的参数值作为
  • AT指令1

    我之前认为手机号码与SIM卡是一一对应的 xff0c 后来想想不对 xff0c 因为有换卡不换号的情况啊 xff0c 所以SIM卡应该只是一个电话号码的储存介质 xff0c 而与SIM卡一一对应的是另一个编码 IMSI xff08 国际移动
  • Keil5 的常见错误

    1 C Source led c 22 warning 69 D integer conversion resulted in truncation 这个是由于实际值的范围超过了定义值的范围 2 C Source main c 15 err
  • c语言实现FTP

    这个实现了客户端和服务端文件的相互传输 xff08 只在本机上运行过 xff09 xff0c 如果是要两台计算机相互传数据要改ip 给大家看一下实现过程 xff08 exe文件要先开服务端的 xff09 输入1 直接将快捷方式拖拽上去就有绝
  • 2021 => 手把手搭建dhcp服务(详细)

    架构解析 dhcp服务器配置 配置实验环境 关闭VMware的dhcp服务 给虚拟机添加网卡为VMnet1 安装与配置dhcp服务 给新添的网络配置IP 配置dhcp服务 在真实的主机系统上查看dhcp配置 为真实主机系统分配固定的IP 修
  • 2021 => 手把手教你NFS部署(实用)

    NFS服务 原理 xff1a 供文件共享服务 为Web Server 配置集群中的后端存储 支持多节点同时挂载以及并发送与写入 架构解析 这是一张大型网站高并发架构图 xff0c 我们只需注意图中圈红的地方 建立NFS文件系统本质就是用来进
  • 2021最新阿里云部署k8s集群(篇1 购买服务器)

    实验kubernetes版本 xff1a v1 22 1 x1f947 阿里云地址 阿里云开发者社区 阿里云官网开发者社区 云计算社区 注意 xff1a 做此实验先准备100RM xff0c 本实验为抢占实例 CentOs版本 xff1a
  • 七层负载均衡HAproxy生产环境LVS+Keepalived+HAproxy(三)

    LB Haproxy Nginx x1f4af 解析 xff1a 七层负载均衡器 xff0c 为与七层模型上的应用层 xff0c 通过URL地址 xff08 应用层 xff09 进行负载均衡 优点 xff1a 详细地址 xff0c 数据精准
  • Kubeadm-K8s1.20-高可用部署-详细-生产环境(四)

    文章目录 kubeadm部署高可用集群注意事项k8s部署 二进制与高可用的区别 一 环境配置1 所有节点修改主机名2 所有节点进行域名解析3 所有节点关闭相关应用3 1 防火墙关闭3 2 dnsmasq关闭3 3 NetworkManage