1、准备7台机器

主机ip主机名说明
192.168.100.128k8s-master01master节点1
192.168.100.129k8s-master02master节点2
192.168.100.130k8s-master03master节点3
192.168.100.131k8s-node01worker节点1
192.168.100.132k8s-node02worker节点2
192.168.100.141haproxy01ha节点1
192.168.100.142haproxy02ha节点2
192.168.100.140ha-vipvip节点

2、使用haproxy01、haproxy02服务器,搭建haproxy、keepalived动态代理服务器,实现负载均衡

#修改内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_nonlocal_bind = 1
EOF
#查看内核参数
sysctl -p
#安装配置haproxy
apt update
apt -y install haproxy
# 添加下面行
cat >> /etc/haproxy/haproxy.cfg <<EOF
listen stats
    mode http
    bind 0.0.0.0:8888
    stats enable
    log global
    stats uri /status
    stats auth admin:12345678
listen kubernetes-api-6443
    bind 192.168.100.140:6443
    mode tcp
    server k8s-master01 192.168.100.128:6443 check inter 3s fall 3 rise 3
    server k8s-master02 192.168.100.129:6443 check inter 3s fall 3 rise 3
    server k8s-master03 192.168.100.130:6443 check inter 3s fall 3 rise 3
EOF
# 重启haproxy
systemctl restart haproxy

3、在haproxy01、haproxy02安装Keepalived

安装keepalived实现HAProxy高可用

apt update
apt -y install keepalived
vim /etc/keepalived/keepalived.conf
#内容如下
globla_defs {
	router_id ha1 #在haproxy02上为ha2
}
vrrp_script check_haproxy { #指定脚本
	script "/etc/keepalived/check_haproxy.sh"
	interval 1
	weight -30
	fall 3
	rise 2
	timeout 2
}
vrrp_instance VI_1 {
	state MASTER #在haproxy02上为BACKUP
	interface ens32
	garp_master_delay 10
	smtp_alert
	virtual_router_id 66 #指定虚拟路由器ID,haproxy01和haproxy02此值必须相同
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.100.140/24 dev ens32 label ens32:1 #指定VIP,haproxy01和haproxy02此值必须相同
	}
	track_script {
		check_haproxy #调用上面定义的脚本
	}
}
# 编写check_haproxy.sh脚本
cat > /etc/keepalived/check_haproxy.sh <<EOF
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
EOF
# 修改权限
chmod a+x /etc/keepalived/check_haproxy.sh
# 重启keepalived
systemctl restart keepalived

4、所有主机初始化

4.1 配置ssh key验证

配置ssh key 验证,方便后续同步文件

# 生成密钥
ssh-keygen
# 把密钥发送到其它服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.129

4.2 设置主机名和解析

# 设置主机名
hostnamectl set-hostname k8s-master01
# 修改hosts文件
cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.140 ha-vip
192.168.100.128 k8s-master01
192.168.100.129 k8s-master02
192.168.100.130 k8s-master03
192.168.100.131 k8s-node01
192.168.100.132 k8s-node02
192.168.100.141 haproxy01
192.168.100.142 haproxy02
EOF
# 同步配置到其它服务器
for i in {129..132};do scp /etc/hosts 192.168.100.$i:/etc/ ;done
for i in {141..142};do scp /etc/hosts 192.168.100.$i:/etc/ ;done

4.3 禁用swap

# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab

4.4 时间同步

# 借助于chronyd服务设定各节点时间精确同步
apt -y install chrony
# 执行同步
chronyc sources -v

4.5 禁用防火墙

# 禁用默认配置的iptables防火墙服务
ufw diable
ufw status

4.6 内核参数调整

如果是安装docker会自动配置以下的内核参数,无需手动实现

如果安装containerd,需要手动配置

允许iptables检查桥接流量,若要显式加载此模块,需运行modprobe br_netfilter

为让linux节点的iptables能够正确查看桥接流量,还需要确认net.bridge.bridge-nf-call-iptables设置为1

# 加载模块
modprobe overlay
modprobe br_netfilter
# 开机加载
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 设置所需的sysctl参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用sysctl参数而不重新启动
sysctl --system

5 所有主机安装Containerd

5.1 包安装Containerd

在所有节点安装Containerd

#Ubuntu20.04利用内置仓库安装containerd
apt update
apt -y install containerd
# 服务启动
systemctl status containerd
# 利用containerd的客户端工具ctr验证修改是否成功
containerd --version
ctr version
# 修改containerd配置,将sanbox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml

grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
		endpoint = ["https://registry.aliyuncs.com"]
# 配置containerd cgroup驱动程序systemd
# 替换
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 查看SystemdCgroup参数
grep SystemdCgroup /etc/containerd/config.toml
# 重启containerd
systemctl restart containerd

5.2 二进制安装Containerd

Containerd有两种二进制安装包:

  • containerd-xxx: 不包含runC,需要单独安装runc
  • cri-containerd-cni-xxx:包含runC和kubernetes里的所需要的相关文件
5.2.1 下载Containerd

地址

解压到根目录 tar xf cri-containerd-cni-版本号-linux-amd64.tar.gz -C /

5.2.2 配置containerd
# 修改containerd的配置,将sandox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml

grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
		endpoint = ["https://registry.aliyuncs.com"]

systemctl daemon-reload
systemctl status containerd
systemctl enable --now containerd
systemctl is-active containerd

5.2.3 安装CNI插件工具

解决CNI问题

# 下载链接https://github.com/containernetworking/plugins/releases
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
# 覆盖原有文件
tar xf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin

6 所有主机安装kubeadm、kubelet和kubectl

通过国内镜像站点阿里云安装 的参考链接

阿里云安装

apt-get update && apt-get install -y apt-transport-https

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

for i in {128..132};do scp /etc/apt/sources.list.d/kubernetes.list 192.168.100.$i:/etc/apt/sources.list.d/;done

apt-get update

#查看版本
apt-cache madison kubeadm|head
#安装指定版本
apt install -y kubeadm=1.25.0-00 kubelet=1.25.0-00 kubectl=1.25.0-00
#安装最新版本
apt install -y kubeadm kubelet kubectl

7 在第一个master节点初始化kubernetes集群

初始化参数说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8cLPun1-1664185593468)(D:\software\学习资料\自编文档\imgs\image-20220921122016588.png)]

初始化集群:

# 命令加参数的方式
kubeadm init --control-plane-endpoint="ha-vip" --kubernetes-version=v1.25.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --image-repository registry.aliyuncs.com/google_containers --upload-certs

8 在第一个master节点生成kubectl命令的授权文件

kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权以后才能执行相应的管理操作。kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的$home/.kube/config的路径进行加载。用户也可以在kubectl命令上使用–kubeconfig选项指定一个另的位置。

下面复制认证为kubernetes系统管理员的配置文件到目标用户的家目录下:

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

9 实现kubectl命令补全

安装bash-completion工具
sudo apt install bash-completion

执行bash_completion
source /usr/share/bash-completion/bash_completion

#在bash shell 中永久的添加自动补全(永久有效,不受切换终端影响)
echo "source <(kubectl completion bash)" >> ~/.bashrc

10 在第一个master节点配置网络组件

kubernetes系统中的pod网络的实现依赖于第三方插件进行,简单易用的是为CoreOS担任的flannel项目。但由于国内无法访问,我们使用calico

在初始化的第一个master节点上运行如下命令,向kubernetes部署calico。

# 默认没有网络插件,显示如下状态
kubectl get nodes

curl https://docs.projectcalico.org/manifests/calico.yaml -O
#修改CIDR
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16" #与初始化集群的--pod-network-cidr=10.244.0.0/16一致
# 指定网卡
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
  # 下面添加
  - name: IP_AUTODETECTION_METHOD
    value: "interface=ens32" # ens32为本地网卡名字
# 安装
kubectl apply -f calico.yaml

# 再次查看状态
kubectl get nodes

10 将所有worker节点加入kubernetes集群中

kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
        --discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b
# 其它主节点加入集群
kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值 --control-plane --certificate-key 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
        --discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b \
        --control-plane --certificate-key 368be5b6bd9ebc2644406dadf9fe96e08fc095ef502570223f9d3ef1c7fb1da3

11 Containerd客户端工具

11.1 ctr和crictl

ctr是由containerd提供的一个客户端工具。

crictl是CRI兼容的容器运行时命令接口,和containerd无关,由kubernetes提供,可以使用它来检查和调试k8s节点上的容器运行时和应用程序。

命令dockerctrcrictl
查看镜像docker imagesctr image lscrictl images
拉取镜像docker pullctr image pullcrictl pull
推送镜像docker pushctr image push
删除镜像docker rmictr image rmcrictl rmi
导入镜像docker loadctr image import
导出镜像docker savectr image export
修改镜像标签docker tagctr image tag
创建一个新的容器docker createctr container createcrictl create
运行一个新的容器docker runctr run
删除容器docker rmctr container rmcrictl rm
查看运行容器docker psctr task ls / ctr container lscrictl ps
启动已有容器docker startctr task startcrictl start
关闭已有容器docker stopctr task killcrictl stop
在容器内部执行命令docker execcrictl exec
查看容器内信息docker inspectctr container infocrictl inspect
查看容器日志docker logscrictl logs
查看容器资源docker statscrictl stats

11.2 nerdctl

nerdctl是与Docker兼容的CLI for Containerd,其支持compose

nerdctl和docker命令行语法类似

nerdctl发布包含两安装版本:

  • Mininal:仅包含nerdctl二进制文件以及rootless模式下的辅助安装脚本
  • Full:包含containerd、CNI、runC、BuildKit等完整组件
11.2.1 安装与使用
11.2.1.1 单机使用nerdctl 代替docker
# 在新主机使用nerdctl代替docker
wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-full-0.23.0-linux-amd64.tar.gz
# 查看文件内容
tar tf nerdctl-full-0.23.0-linux-amdj64.tar.gz
# 解压
tar zxvf nerdctl-full-0.23.0-linux-amdj64.tar.gz -C /usr/local
# 启动
systemctl enable --now containerd
# 查看帮助
nerdctl --help

12 token过期

#查看token
kubectl get secret -n kube-system
kubectl get secret -n kube-system bootstrap-token-mmujyx -oyaml
#重新生成token
kubeadm token create --print-join-command
# 请注意,证书密钥可以访问集群敏感数据,请保密!作为保障,上传的证书将在两小时内删除
kubeadm init phase upload-certs --upload-certs

13 Metrics部署和Dashboard部署

13.1 部署Metrics

# 创建目录
mkdir ~/metrics
# 下载metrics配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改文件
containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls # 加入参数 
        image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1 # 替换成国内镜像
# 应用
kubectl apply -f components.yaml

13.2 部署Dashboard(推荐使用kuboard)

# 下载安装文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

问题:访问不了raw.githubusercontent.com

解决:1、查询对应ip raw.githubusercontent.com服务器iP raw.githubusercontent.com域名解析 raw.githubusercontent.comiP查询 raw.githubusercontent.com域名iP查询 (ip138.com)

2、修改hosts

185.199.109.133 raw.githubusercontent.com

14 卸载k8s

# 删除所有的k8s节点
kubectl delete node --all
# 重置kubeadm
kubeadm reset
modprode -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.serive
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
apt uninstall kube*
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐