一 基础环境

1.1 资源

节点名称 ip地址
VIP 192.168.12.150
master01 192.168.12.48
master02 192.168.12.242
master03 192.168.12.246
node01 192.168.12.83
node02 192.168.12.130
node03 192.168.12.207
node04 192.168.12.182
node05 192.168.12.43
node06 192.168.12.198

1.2 修改所有节点hosts文件

vi /etc/hosts
cat >> /etc/hosts<<EOF
192.168.12.100 master
192.168.12.48 master01
192.168.12.242 master02
192.168.12.246 master03
192.168.12.83 node01
192.168.12.130 node02
192.168.12.207 node03
192.168.12.182 node04
192.168.12.43 node05
192.168.12.198 node06
10.0.7.141 harbor.xmkj.gz
EOF

1.3 免密配置

master01节点执行

#获取秘钥
ssh-keygen -t rsa #备份公钥
cp -p .ssh/id_rsa.pub .ssh/authorized_keys #本地秘钥同步其他节点
for H in master0{2..3}; do ssh-copy-id $H; done
for H in node0{1..6}; do ssh-copy-id $H; done

1.4 修改各节点hostname

master01节点执行

for H in master0{1..3}; do ssh $H  hostnamectl set-hostname $H ; done
for H in node0{1..6}; do ssh $H hostnamectl set-hostname $H ; done

1.5 关闭防火墙

所有节点执行

systemctl stop firewalld
systemctl disable firewalld
yum install iptables-services -y

1.6 关闭SeLinux

所有节点执行

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

1.7 关闭 swap

所有节点执行

swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

1.8 更新系统

yum install wget -y
rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum update -y

1.9 允许 iptables 检查桥接流量(可选,所有节点)

所有节点

加载br_netfilter模块

modprobe br_netfilter
modprobe overlay

查看br_netfilter 模块是否已加载

lsmod | grep br_netfilter

开机自动加载

cat <<EOF | sudo 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
echo "net.ipv4.ip_nonlocal_bind = 1" >>/etc/sysctl.conf
EOF

应用 sysctl 参数而不重新启动

sysctl --system

1.10 加载ipvs模块

所有节点

若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack

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

安装相关管理工具

yum install ipset ipvsadm -y

1.11 时钟同步

所有节点

yum install chrony -y

编辑chronyd配置文件

egrep -v "^$|#" /etc/chrony.conf
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
local stratum 10
logdir /var/log/chrony

二 高可用环境配置

2.1 pacemaker部署

所有master节点

安装pacemaker

yum install pacemaker pcs corosync fence-agents resource-agents -y

启动pcs服务

systemctl enable pcsd
systemctl start pcsd
systemctl status pcsd

修改集群管理员hacluster(默认生成)密码

echo pacemaker_pass | passwd --stdin hacluster

2.2 配置pacemaker集群

其中一台master节点执行

节点认证配置,组件集群,采用上一步设置的password

pcs cluster auth master01 master02 master03 -u hacluster -p pacemaker_pass --force

创建并命名集群

生成配置文件:/etc/corosync/corosync.conf

pcs cluster setup --force --name k8s_cluster_ha master01 master02 master03

2.3 启动集群

其中一台master节点执行

启动集群

pcs cluster start --all
pcs status

设置集群开机启动

pcs cluster enable --all

设置集群属性

pcs property set pe-warn-series-max=1000 pe-input-series-max=1000 pe-error-series-max=1000 cluster-recheck-interval=5

关闭

pcs property set stonith-enabled=false

corosync默认启用stonith,但stonith机制并没有配置相应的stonith设备,此时pacemaker将拒绝启动任何资源,关闭stonith

查询修改后配置

pcs property set stonith-enabled=false

2.4 安装haproxy负载均衡

所有master节点

yum install haproxy -y

修改happroxy配置

cat >/etc/haproxy/haproxy.cfg<<EOF
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
bind 0.0.0.0:1080
mode http
stats enable
stats uri /
stats realm kubernetes\ Haproxy
stats auth admin:admin
stats refresh 30s
stats show-node
stats show-legends
stats hide-version
listen k8s-api
bind 192.168.12.100:6443
mode tcp
option tcplog
log global
server master01 192.168.12.221:6443 check inter 3000 fall 2 rise 5
server master02 192.168.12.163:6443 check inter 3000 fall 2 rise 5
server master03 192.168.12.152:6443 check inter 3000 fall 2 rise 5
EOF

开机自启

systemctl enable haproxy

2.5 创建集群资源

任意master节点

配置虚ip

pcs resource create kube-api-vip ocf:heartbeat:IPaddr2 ip=192.168.12.100 cidr_netmask=24 op monitor interval=30s

添加haproxy资源

pcs resource create k8s-haproxy systemd:haproxy

配置资源启动顺序

pcs constraint order kube-api-vip then k8s-haproxy

设置资源开机自启

pcs resource enable kube-api-vip k8s-haproxy

通过绑定资源服务,将两种资源约束在1个节点

pcs constraint colocation add k8s-haproxy with kube-api-vip

查看集群情况

pcs status

三 Kubernetes集群安装

3.1 docker安装

所有节点

安装依赖环境

yum install -y yum-utils device-mapper-persistent-data lvm2 nfs-utils vim

配置docker yum源

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

查看docker版本列表

yum list docker-ce --showduplicates | sort -r

安装指定版本

yum install docker-ce-20.10.9-3.el7 docker-ce-cli-20.10.9-3.el7 containerd.io-1.4.11-3 -y

或安装最新版本

yum install docker-ce docker-ce-cli containerd.io -y

设置镜像加速

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

启动docker

systemctl daemon-reload
systemctl start docker
systemctl enable docker

3.2 kubernetes安装

配置kubernetes yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

查看kubernetes版本

yum list kubeadm --showduplicates | sort -r

安装指定版本

小编安装1.22.2版本。

yum install kubeadm-1.22.2-0 kubelet-1.22.2-0 kubectl-1.22.2-0 lrzsz -y

或安装最新版本

yum install kubeadm kubelet kubectl lrzsz -y

修改docker Cgroup Driver为systemd管理

将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd

如果不修改,在添加 worker 节点时可能会碰到如下错误

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".

Please follow the guide at https://kubernetes.io/docs/setup/cri/

sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service

docker重启

systemctl enable docker&&systemctl restart docker

启动kubelet

systemctl enable kubelet && systemctl start kubelet

3.3 初始化集群

master01节点

获取初始化配置文件

kubeadm config print init-defaults > kubeadm-init.yaml

修改初始化配置

vim kubeadm-init.yaml

主要修改localAPIEndpoint:的ip地址,此处为master01ip地址,controlPlaneEndpoint:,imageRepository: ,apiVersion: kubeproxy.config.k8s.io/v1alpha1等。

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.12.221
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: master01
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
controlPlaneEndpoint: "master:6443"
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.22.0
networking:
dnsDomain: cluster.local
#serviceSubnet: 10.96.0.0/12
podSubnet: "10.100.0.1/16"
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"

根据配置文件初始化集群

kubeadm init --config kubeadm-init.yaml

3.4 部署calico网络

master01节点运行

获取calico配置文件

curl https://docs.projectcalico.org/manifests/calico.yaml -O

修改calico配置

vim calico.yaml

取消CALICO_IPV4POOL_CIDR注释,修改pod网段地址

配置kubectl环境变量

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

部署calico

kubectl apply -f calico.yaml

3.5 其他节点加入集群

分配kubernetes秘钥至其他master节点

USER=root
CONTROL_PLANE_IPS="master02 master03"
for host in ${CONTROL_PLANE_IPS}; do ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"; scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/; scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/; scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/; scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/; scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/; done

其他master节点加入集群

kubeadm join master:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9cf6eb4106afb43e6487a1975563bfacff9e85ad96886fef6109bf8aa6fc6f5b --control-plane

其他node节点加入集群

kubeadm join master:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9cf6eb4106afb43e6487a1975563bfacff9e85ad96886fef6109bf8aa6fc6f5b

token过期,重新获取

kubeadm token create --print-join-command

3.6 kuboard管理界面

master01节点执行

在线部署

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

查看 Kuboard 运行状态:

kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system

输出结果如下所示:

NAME                       READY   STATUS        RESTARTS   AGE
kuboard-54c9c4f6cb-6lf88 1/1 Running 0 45s

获得管理员用户、只读用户的Token。

此Token拥有 ClusterAdmin 的权限,可以执行所有操作

echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

取输出信息中 token 字段

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWc4aHhiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDhiYjVlNi04Y2RjLTExZTktYjY3ZS1mYTE2M2U1ZjdhMGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.DZ6dMTr8GExo5IH_vCWdB_MDfQaNognjfZKl0E5VW8vUFMVvALwo0BS-6Qsqpfxrlz87oE9yGVCpBYV0D00811bLhHIg-IR_MiBneadcqdQ_TGm_a0Pz0RbIzqJlRPiyMSxk1eXhmayfPn01upPdVCQj6D3vAY77dpcGplu3p5wE6vsNWAvrQ2d_V1KhR03IB1jJZkYwrI8FHCq_5YuzkPfHsgZ9MBQgH-jqqNXs6r8aoUZIbLsYcMHkin2vzRsMy_tjMCI9yXGiOqI-E5efTb-_KbDVwV5cbdqEIegdtYZ2J3mlrFQlmPGYTwFI8Ba9LleSYbCi4o0k74568KcN_w

通过NodePort访问

Kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 为 32567;

http://任意一个Worker节点的IP地址:32567/

Kubeadm部署高可用K8S集群的更多相关文章

  1. kubeadm部署高可用K8S集群(v1.14.2)

    1. 简介 测试环境Kubernetes 1.14.2版本高可用搭建文档,搭建方式为kubeadm 2. 服务器版本和架构信息 系统版本:CentOS Linux release 7.6.1810 ( ...

  2. centos7使用kubeadm配置高可用k8s集群

    CountingStars_ 关注 2018.08.12 09:06* 字数 464 阅读 88评论 0喜欢 0 简介 使用kubeadm配置多master节点,实现高可用. 安装 实验环境说明 实验 ...

  3. Rancher 2.2.2 - HA 部署高可用k8s集群

    对于生产环境,需以高可用的配置安装 Rancher,确保用户始终可以访问 Rancher Server.当安装在Kubernetes集群中时,Rancher将与集群的 etcd 集成,并利用Kuber ...

  4. kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml

    主机 系统版本      配置       ip Mater.Node,ansible CentOS 7.2                                             4 ...

  5. 使用kubeadm部署一套高可用k8s集群

    使用kubeadm部署一套高可用k8s集群 有疑问的地方可以看官方文档 准备环境 我的机器如下, 系统为ubuntu20.04, kubernetes版本1.21.0 hostname IP 硬件配置 ...

  6. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  7. hype-v上centos7部署高可用kubernetes集群实践

    概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...

  8. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  9. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

随机推荐

  1. C# 发送Http请求,传文件和其他参数

    /// <summary> /// httpWebRequest post by dic /// </summary> /// <param name="url ...

  2. Luogu1502 窗口的星星 (线段树扫描线)

    将每个点拓展为矩形,将\(y\)离散,延\(x\)轴扫描,每次更新最值 用了一百年的pushdown操作疑似有问题,亦或这道题特殊,我乱改了pushdown位置就过了,我能怎么办,WA了一发,y数组没 ...

  3. java学习第一天.day02

    整数类型常量 整数类型的常量JVM默认使用 int 类型来存储 小数类型类型 小数类型的常量JVM默认使用 double 类型来存储 . ASCII表 A在码表的顺序是65,a在码表的顺序是97

  4. 用HTTP服务的方式集成learned cardinality estimate方法进 Postgresql

    代码地址:postgresql-13.1-ml: Integration of CardEst Methods into PostgreSQL by HTTP Server (github.com) ...

  5. Mybatis介绍、使用IDEA快速入门

    1. Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 JavaEE三层架构:表现层.业务层.持久层 JDBC 与 MyBatis 对比: MyBatis 本是 A ...

  6. 744. 寻找比目标字母大的最小字母--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-smallest-letter-greater-than-target 著作权归领扣网络所有. ...

  7. vue.js及H5常见跨域问题解决方案

    一.原生H5跨域问题解决方案 1.live-server 代理解决 首先在有node.js环境下,打开命令行工具,输入 npm install live-server -g 全局安装全局安装 live ...

  8. [HDU1812] Count the Tetris - polya定理

    题面 Problem Description 话说就是因为这个游戏,Lele已经变成一个名人,每当他一出现在公共场合,就有无数人找他签名,挑战. 为了防止引起社会的骚动,Lele决定还是乖乖呆在家里. ...

  9. .net core + eureka + spring boot 服务注册与调用

    .net core + eureka + spring boot 服务注册与简单的调用 假期小长假遇上疫情只能去家里蹲了,刚好有时间总结一下. 概述 微服务架构是当前比较火的分布式架构,本篇基于.ne ...

  10. Maven 过滤问题

    <build> <resources> <resource> <directory>src/main/resources</directory&g ...