k8s 高可用集群安装

Kubernetes

  • 学习Kubernetes之前请自行补充一定的docker 和Linux 相关基础知识

Kubernetes 是什么?

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。详情请查阅官网文档,官网文档写的很详细,本文内容旨在快速让你安装体验Kubernetes 集群

统一环境配置

#节点配置

主机名IP角色系统CPU/内存磁盘
kubernetes-master-01192.168.141.150MasterUbuntu Server 18.042核2G20G
kubernetes-master-02192.168.141.151MasterUbuntu Server 18.042核2G20G
kubernetes-master-03192.168.141.152MasterUbuntu Server 18.042核2G20G
kubernetes-node-01192.168.141.160MasterUbuntu Server 18.042核2G20G
kubernetes-node-02192.168.141.161MasterUbuntu Server 18.042核2G20G

开始

  • 请先开启一台虚拟机

关闭交换空间

swapoff -a

避免开机启动交换空间

 #注释 swap 开头的行
vi /etc/fstab

关闭防火墙

ufw disable

设置时区

dpkg-reconfigure tzdata
  • 选择 Asia(亚洲)
  • 选择 Shanghai(上海)

时间同步

# 安装 ntpdate
apt-get install ntpdate

# 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器)
ntpdate cn.pool.ntp.org

# 将系统时间写入硬件时间
hwclock --systohc

配置 IPVS

# 安装系统工具
apt-get install -y ipset ipvsadm

# 配置并加载 IPVS 模块
mkdir -p /etc/sysconfig/modules/
vi /etc/sysconfig/modules/ipvs.modules

# 输入如下内容
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

# 执行脚本,注意:如果重启则需要重新运行该脚本,自行实现开机启动
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
配置内核参数
# 配置参数
vi /etc/sysctl.d/k8s.conf
# 输入如下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
# 应用参数
sysctl --system

修改 cloud.cfg

vi /etc/cloud/cloud.cfg

# 该配置默认为 false,修改为 true 即可
preserve_hostname: true

安装 Docker

# 更新软件源
sudo apt-get update
# 安装所需依赖
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 新增软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 再次更新软件源
sudo apt-get -y update
# 安装 Docker CE 版
sudo apt-get -y install docker-ce

配置 Docker 加速器

特别注意:国内镜像加速器可能会很卡,请替换成你自己阿里云镜像加速器,在阿里云控制台的 容器镜像服务 -> 镜像加速器 菜单中可以找到,以下是我的自己的加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://eh8y2iv9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置软件源

# 安装系统工具
apt-get update && apt-get install -y apt-transport-https
# 安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 写入软件源;注意:我们用系统代号为 bionic,但目前阿里云不支持,所以沿用 16.04 的 xenial
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
> deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
> EOF

安装 kubeadm,kubelet,kubectl

安装

# 安装过程如下,注意 kubeadm 的版本号
apt-get update  
apt-get install -y kubelet kubeadm kubectl
  • kubeadm:用于初始化 Kubernetes 集群
  • kubectl:Kubernetes 的命令行工具,主要作用是部署和管理应用,查看各种资源,创建,删除和更新组件
  • kubelet:主要负责启动 Pod 和容器

安装 HAProxy + Keepalived

配置的思路就是利用 HAProxy + Keepalived 实现 kube-apiserver 虚拟 IP 访问从而实现高可用和负载均衡,拆解如下:

  • Keepalived 提供 kube-apiserver 对外服务的虚拟 IP(VIP)
  • HAProxy 监听 Keepalived VIP
    运行 Keepalived 和 HAProxy 的节点称为 LB(负载均衡) 节点
  • Keepalived 是一主多备运行模式,故至少需要两个 LB 节点
  • Keepalived 在运行过程中周期检查本机的 HAProxy 进程状态,如果检测到 HAProxy 进程异常,则触发重新选主的过程,VIP 将飘移到新选出来的主节点,从而实现 VIP 的高可用
  • 所有组件(如 kubeclt、apiserver、controller-manager、scheduler 等)都通过 VIP +HAProxy 监听的 6444 端口访问 kube-apiserver 服务(注意:kube-apiserver 默认端口为 6443,为了避免冲突我们将 HAProxy 端口设置为 6444,其它组件都是通过该端口统一请求 apiserver)

创建 HAProxy 启动脚本

mkdir -p /usr/local/kubernetes/lb
vi /usr/local/kubernetes/lb/start-haproxy.sh

# 输入内容如下
#!/bin/bash
# 修改为你自己的 Master 地址
MasterIP1=192.168.141.150
MasterIP2=192.168.141.151
MasterIP3=192.168.141.152
# 这是 kube-apiserver 默认端口,不用修改
MasterPort=6443

# 容器将 HAProxy 的 6444 端口暴露出去
docker run -d --restart=always --name HAProxy-K8S -p 6444:6444 \
        -e MasterIP1=$MasterIP1 \
        -e MasterIP2=$MasterIP2 \
        -e MasterIP3=$MasterIP3 \
        -e MasterPort=$MasterPort \
        wise2c/haproxy-k8s

# 设置权限
chmod +x start-haproxy.sh

创建 Keepalived 启动脚本

mkdir -p /usr/local/kubernetes/lb
vi /usr/local/kubernetes/lb/start-keepalived.sh

# 输入内容如下
#!/bin/bash
# 修改为你自己的虚拟 IP 地址
VIRTUAL_IP=192.168.141.200
# 虚拟网卡设备名
INTERFACE=ens33
# 虚拟网卡的子网掩码
NETMASK_BIT=24
# HAProxy 暴露端口,内部指向 kube-apiserver 的 6443 端口
CHECK_PORT=6444
# 路由标识符
RID=10
# 虚拟路由标识符
VRID=160
# IPV4 多播地址,默认 224.0.0.18
MCAST_GROUP=224.0.0.18

docker run -itd --restart=always --name=Keepalived-K8S \
        --net=host --cap-add=NET_ADMIN \
        -e VIRTUAL_IP=$VIRTUAL_IP \
        -e INTERFACE=$INTERFACE \
        -e CHECK_PORT=$CHECK_PORT \
        -e RID=$RID \
        -e VRID=$VRID \
        -e NETMASK_BIT=$NETMASK_BIT \
        -e MCAST_GROUP=$MCAST_GROUP \
        wise2c/keepalived-k8s

# 设置权限
chmod +x start-keepalived.sh

克隆4份当前虚拟机,克隆连接就好了,不用完全克隆
在这里插入图片描述

单独节点配置

特别注意:为 Master 和 Node 节点单独配置对应的 IP 和 主机名

配置 IP

编辑 vi /etc/netplan/50-cloud-init.yaml 配置文件,修改内容如下

network:
    ethernets:
        ens33:
          # 我的 Master 是 150 - 152,Node 是 160 - 162
          addresses: [192.168.141.150/24]
          gateway4: 192.168.141.2
          nameservers:
            addresses: [192.168.141.2]
    version: 2

使用 netplan apply 命令让配置生效

#配置主机名

修改主机名

hostnamectl set-hostname kubernetes-master-01

配置 hosts

cat >> /etc/hosts << EOF
192.168.141.150 kubernetes-master-01
EOF
  • 其他4台虚拟机请自行配置

3台master 节点配置

分别在 3 个 Master 中启动容器(执行HAProxy + Keepalived脚本)

sh /usr/local/kubernetes/lb/start-haproxy.sh && sh /usr/local/kubernetes/lb/start-keepalived.sh

查看网卡绑定的虚拟 IP

  • 分别在三台master 节点运行下面代码,有其中一台打印一下内容即可
ip a | grep ens33

# 输出如下
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.141.151/24 brd 192.168.141.255 scope global ens33
    inet 192.168.141.200/24 scope global secondary ens33

初始化 Master

  • 选择其中一台master 节点配置就好了
  • 创建工作目录并导出配置文件
# 创建工作目录
mkdir -p /usr/local/kubernetes/cluster

# 导出配置文件到工作目录
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
  • 修改配置文件
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
featureGates:
  supportIPVSProxyMode: true
mode: ipvs
localAPIEndpoint:
  advertiseAddress: 192.168.141.150
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: kubernetes-master1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
#控制平面ip
controlPlaneEndpoint: "192.168.141.200:6444"
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
 #改过镜像
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  # 设置pod网段等下配置网络时候用到 
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}

---
# 开启 IPVS 模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

kubeadm 初始化

# kubeadm 初始化
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
  • 你会得到两个token
#给其他maste加入
kubeadm join 192.168.186.200:6444 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:c3b5bd7edb7e51a014833e92d84620239be7144427da21b1579833816757e71f     --control-plane --certificate-key 8c320b65b9389d6f90ac3c7b17ab559789dbfda484dd5a719371302e19794131
#给node加入
kubeadm join 192.168.186.200:6444 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:26ef68ebbad12f9eb5e5cb416712408981fe9954452731f83c6607c6796b000b

配置 kubectl

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

安装网络插件

  • 下载网络插件
wget https://docs.projectcalico.org/v3.17/manifests/calico.yaml

vi calico.yaml
操作模式下 / + 192.168

- name: CALICO_IPV4POOL_CIDR
 value: "192.168.0.0/16"

修改为

- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

kubectl apply -f calico.yaml

验证是否成功

kubectl get node
root@cc:/usr/local/k8s# kubectl get nodes

NAME                 STATUS     ROLES                  AGE     VERSION
kubernetes-master1   Ready      control-plane,master   5d21h   v1.20.1
kubernetes-master2   Ready      control-plane,master   5d21h   v1.20.1
kubernetes-master3   Ready   control-plane,master   5d21h   v1.20.1
kubernetes-node-01   Ready      <none>                 5d16h   v1.20.1
kubernetes-node-02   Ready      <none>                 5d12h   v1.20.1

参考kubernetes官网
参考李哥博客


版权声明:本文为qq_33282573原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。