美文网首页
k8s高可用部署

k8s高可用部署

作者: 小屁孩云熙 | 来源:发表于2022-11-20 17:13 被阅读0次

1. 环境

主机名 IP
k8s-master01 10.0.0.10
k8s-master02 10.0.0.11
k8s-master03 10.0.0.12
k8s-node01 10.0.0.13
k8s-node02 10.0.0.14
k8s-node03 10.0.0.15
master-lb 10.0.0.16

2. 基础环境部署

2.1 配置 hosts 文件

cat >> /etc/hosts <<'EOF'
10.0.0.10  k8s-master01
10.0.0.11  k8s-master02
10.0.0.12  k8s-master03
10.0.0.13  k8s-node01
10.0.0.14  k8s-node02
10.0.0.15  k8s-node03
10.0.0.16  master-lb
10.0.0.3   harbor.nbsre.cn
EOF

2.2 关闭 swap

# 临时关闭
swapoff -a 
sysctl -w vm.swappiness=0

# 永久关闭(修改配置文件)
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
echo vm.swappiness=0 >>/etc/sysctl.conf
sysctl -p

2.3 允许 iptables 检查桥接流量

cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

2.4 安装 docker

# 01. 配置docker源
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 查看版本
yum list docker-ce --showduplicates

# 02. 安装docker,可安装指定版本(1.22 版本安装最新docker即可)
yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15
yum -y install docker-ce

yum -y install bash-completion
source /usr/share/bash-completion/bash_completion

2.5 配置 docker 镜像加速

# 配置cgroupdriver为systemd(1.22版本)

mkdir -pv /etc/docker && cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "registry-mirrors": ["https://v5yfisvk.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload
systemctl enable --now docker

2.6 配置 kubernetes yum源配置文件

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
EOF

2.7 安装 kubeadm,kubectl 和 kubelet

# 安装kubeadm,kubelet,kubectl(版本需要一致)
# 可查看版本
yum -y list kubeadm --showduplicates | sort -r
# 指定版本安装
yum -y install kubeadm-1.22.15-0 kubelet-1.22.15-0 kubectl-1.22.15-0
# 启动
systemctl enable --now kubelet
systemctl status kubelet

3. 高可用组件部署(master节点部署)

3.1 部署nginx(所有master节点)

# 01. 下载
mkdir -p /server/tools
cd /server/tools
wget http://nginx.org/download/nginx-1.22.1.tar.gz

# 02. 安装以来环境
yum install pcre-devel openssl-devel -y

# 03. 解压编译安装 ngx
tar xf nginx-1.22.1.tar.gz
cd nginx-1.22.1

./configure --prefix=/usr/local/nginx \
--with-pcre \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--with-http_gzip_static_module

make -j2 && make install

# 04. 修改 nginx 配置文件
cat >/usr/local/nginx/conf/nginx.conf <<'EOF'
user nginx;
worker_processes  auto;

events {
    worker_connections  10240;
}
error_log /usr/local/nginx/logs/error.log info;

stream {
    upstream kube-apiservers {
        hash $remote_addr consistent;
        server k8s-master01:6443 weight=5 max_fails=1 fail_timeout=3s;
        server k8s-master02:6443 weight=5 max_fails=1 fail_timeout=3s;
        server k8s-master03:6443 weight=5 max_fails=1 fail_timeout=3s;
    }
    server {
        listen 8443 reuseport;
        proxy_connect_timeout 3s;
        proxy_timeout 3000s;
        proxy_pass kube-apiservers;
    }
}
EOF

# 05. 创建ngx用户
useradd nginx -s /sbin/nologin -M

# 06. 编写启动文件
cat >/usr/lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
TimeoutStopSec=5
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

# 07. 启动服务,并检查
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx

netstat -lntup|grep nginx

3.2 部署keepalived

# 01. 安装 keepalived
yum install keepalived -y

# 02. 编辑配置文件(修改router_id 和 mcast_src_ip)
cp /etc/keepalived/keepalived.conf{,.bak}
cat >/etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived

global_defs {
    # 改为每台机器的IP
    router_id  10.0.0.10
}
vrrp_script check_k8s {
    script "/server/scripts/check-k8s.sh"
    interval 2
    weight 2
    fall 3
    rise 2
}
vrrp_instance k8s-master {
    # 其他两台机器改为 BACKUP
    state MASTER
    interface eth0
    virtual_router_id 51
    # 其他两台机器优先级低于100,要不同
    priority 100
    advert_int 1
    # 每台机器mcast_src_ip不一样,自己网卡IP
    mcast_src_ip 10.0.0.10
    authentication {
        auth_type PASS
        auth_pass k8s-master-ha
    }
    track_script {
        check_k8s
    }   
    virtual_ipaddress {
        10.0.0.16/24
    }
}
EOF

# 03. 编写健康检查脚本
cat >/server/scripts/check-k8s.sh <<'EOF'
#!/bin/bash

function check_kube-apiserver(){
for i in `seq 5`
do
    pid=`pgrep kube-apiserver`
    if [[ -n $pid ]]
    then
        sleep 1
        continue
    else
        pid=0
        break
    fi    
done
}

check_kube-apiserver
if [[ $pid -eq 0 ]]
then
    systemctl stop keepalived
    exit 1
else
    exit 0
fi
EOF

chmod +x /server/scripts/check-k8s.sh

# 04. 启动服务
systemctl start keepalived
systemctl enable keepalived

4. 初始化 master01 节点

4.1 生成初始化预处理文件

# 01. 生成一个 预处理文件
kubeadm config print init-defaults > kubeadm-init.yaml

# 02. 修改初始化文件


4.2 修改 初始化文件

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # master IP地址
  advertiseAddress: 10.0.0.10
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master01
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 修改镜像源
#imageRepository: k8s.gcr.io
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.22.0
# 负载地址和端口
controlPlaneEndpoint: 10.0.0.16:8443
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  # pod子网
  podSubnet: 10.244.0.0/16
scheduler: {}

4.3 检查 初始化 配置文件

# 03. 检查配置文件是否有错
kubeadm init --config kubeadm-init.yml --dry-run

正确 如图所示

image-20221121114128362.png

4.4 预拉取镜像

用于预览要下载的镜像,用来检测网络连通性

kubeadm config images list --config kubeadm-init.yml
image-20221121114948640.png

4.5 基于 kubeadm 配置文件初始化集群

kubeadm init --config kubeadm-init.yml --upload-certs
image-20221121115336878.png
# 扩展:重置,初始化
kubeadm reset
rm -fr ~/.kube/  /etc/kubernetes/*  /var/lib/etcd/*
image-20221121125528599.png

4.6 复制 kubectl 的 kubeconfig ,便于集群管理

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

# 查看configmap资源,初始化的配置文件
kubectl -n kube-system get cm kubeadm-config -o yml
image-20221121130012806.png

5. 将其他master节点加入集群

 kubeadm join 10.0.0.16:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:cbbe897b1467b0106c486afc4a0b603e8a57d82c49fa81da32a43a3cbe9ece72 \
    --control-plane --certificate-key 9f986be54b905873cb49286374baa96fcb91c32659d4438ee51a41f3c04b38ea

6. 将其他 node 节点加入集群

kubeadm join 10.0.0.16:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:cbbe897b1467b0106c486afc4a0b603e8a57d82c49fa81da32a43a3cbe9ece72 

7. 安装网络插件

# 01. 获取node节点信息,发现全部处于 NotReady 状态,需要安装网络 插件
kubectl get nodes
image-20221121133833441.png
# 02. 安装网络插件
kubectl apply -f flannel.yml
image-20221121135351507.png image-20221121143626517.png

8. 扩展内容 - 如何手动生成 token,并将其他节点加入集群

# 01. 查看列举当前的 token 信息
kubeam token list

# 02. master 上创建 token,生成加入 集群的命令
date +%s | md5sum | cut -c 5-20

kubeadm token create yunxia.16e4539da45b0cd7 --ttl 0 --print-join-command

# 03. 删除token
kubeadm token delete yunxia.16e4539da45b0cd7 

# 04. 集群扩容
kubeadm join 10.0.0.60:6443 --token yunxia.16e4539da45b0cd7     --discovery-token-ca-cert-hash sha256:84b4a0b4d2933e4b0228249d696863c38d2eb48ffa8495090c27bb7091a55a97

8.1 master 节点

# 01. 创建一个永不过期的 key
kubeadm token create --print-join-command --ttl 0

## 新生成的 token
kubeadm join 10.0.0.16:8443 --token wz6uhk.358bt7k1tq3jogpy --discovery-token-ca-cert-hash \
sha256:fab2f37f8299d8a3dea38fc2d300f5a4d1bdb20675c2de7f0ed9b793b93abe9

## kubeadm 生成的token数据存储在k8s集群
kubectl -n kube-system get secret
kubectl -n kube-system get secret bootstrap-token-wz6uhk -o yaml

image-20221121141458591.png
# 02. 将 master 证书上传到kubeadm的证书文件中(将控制面板证书文件上传到kubeadm证书)
kubeadm init phase upload-certs --upload-certs

# 03. 上传至kubeadm 证书后,会生成一个 key
db898f2d68537969c68bf60a6e0aaab287d38065066dbf9f3036c965c01582c5
image-20221121141842645.png
# 04. 将其他master节点加入集群
kubeadm join 10.0.0.16:8443 --token wz6uhk.358bt7k1tq3jogpy --discovery-token-ca-cert-hash \
sha256:fab2f37f8299d8a3dea38fc2d300f5a4d1bdb20675c2de7f0ed9b793b93abe9 \
--control-plane  --certificate-key db898f2d68537969c68bf60a6e0aaab287d38065066dbf9f3036c965c01582c5

# 05. 复制 kubectl 的 kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

8.2 node 节点

kubeadm join 10.0.0.16:8443 --token wz6uhk.358bt7k1tq3jogpy --discovery-token-ca-cert-hash \
sha256:fab2f37f8299d8a3dea38fc2d300f5a4d1bdb20675c2de7f0ed9b793b93abe9

9. 去掉 master 污点

kubectl taint node k8s-master01 node-role.kubernetes.io/master:NoSchedule-
kubectl taint node k8s-master02 node-role.kubernetes.io/master:NoSchedule-
kubectl taint node k8s-master03 node-role.kubernetes.io/master:NoSchedule-
image-20221121150652576.png

10. kube-proxy 修改为 ipvs 模式

# 01. 安装软件包(所有节点安装)
yum -y install conntrack-tools ipvsadm

# 02. 配置模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

# 03. 修改 mode 为 ipvs (master节点)
kubectl -n kube-system edit cm kube-proxy

# 04. 查看
kubectl -n kube-system describe cm kube-proxy | grep mode

# 05. 删除旧的 kube-proxy
kubectl get pods -A | grep kube-proxy | awk '{print $2}' | xargs kubectl -n kube-system delete pods 

# 06. 查看日志验证
kubectl -n kube-system logs -f kube-proxy-xxx

相关文章

网友评论

      本文标题:k8s高可用部署

      本文链接:https://www.haomeiwen.com/subject/xbywxdtx.html