K8S 实战(一)| 运营管理生产级 K8S 高可用集群之初始化

前言

春暖花开的五月,疫情基本过去,值得庆贺,在这美好的日子里我们来实战一下 K8S 的高可用负载均衡集群吧。

更新历史

平台环境

软件信息

  • CentOS Linux release 7.7.1908 (Kernel 3.10.0-1062.18.1.el7.x86_64)
  • Docker CE 18.09.9
  • Kubernetes v1.18.2
  • Calico v3.8
  • Keepalived v1.3.5
  • HAproxy v1.5.18

硬件信息

主机名 ip
master01 192.168.10.12
master02 192.168.10.13
master03 192.168.10.14
work01 192.168.10.15
work02 192.168.10.16
work03 192.168.10.17
VIP 192.168.10.19

集群配置

初始化

master/worker 均执行

# cat >> /etc/hosts << EOF
192.168.10.12    master01
192.168.10.13    master02
192.168.10.14    master03
192.168.10.15    work01
192.168.10.16    work02
192.168.10.17    work03

EOF
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

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

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

# 安装wget
yum install wget -y

# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 获取阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 清理缓存并创建新的缓存
yum clean all && yum makecache

# 更新
yum update -y

#同步时间
timedatectl
timedatectl set-ntp true

安装 Docker

master/worker 均安装

# 安装 Docker CE
# 设置仓库
# 安装所需包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 新增 Docker 安装源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker CE.
yum install -y containerd.io \
    docker-ce-18.09.9 \
    docker-ce-cli-18.09.9

# 启动 Docker 并添加开机启动
systemctl start docker
systemctl enable docker

#将Docker 的 Cgroup Driver 修改为 systemd
#修改为国内源

cat > /etc/docker/daemon.json <<EOF
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    },
    "storage-driver": "overlay2",
    "registry-mirrors":[
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl daemon-reload
systemctl restart docker

安装 kubeadm、kubelet 、kubectl

master/worker 节点均执行

# 配置K8S的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=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg  https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 增加配置
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 加载
sysctl --system

# 安装当前日期最新稳定版(v1.18.2) kubelet、 kubeadm 、kubectl

yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes

# 启动并设置 kubelet 开机启动
systemctl start kubelet
systemctl enable kubelet

HAProxy 实现 apiserver 负载均衡集群

所有 master 节点执行

yum install haproxy-1.5.18 -y

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

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    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

frontend  k8s-api
    mode tcp
    option tcplog
    bind *:16443
    default_backend      k8s-api

backend k8s-api
    mode        tcp
    balance     roundrobin
    server master01 192.168.10.12:6443 check
    server master02 192.168.10.13:6443 check
    server master03 192.168.10.14:6443 check
EOF

所有 master 节点启动 HAProxy

systemctl start haproxy
systemctl enable haproxy

Keepalived实现 apiserver 高可用集群

所有 master 节点执行

yum -y install keepalived psmisc

master01 上 keepalived 的配置:

# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
   router_id master01
   
   script_user root
   enable_script_security 
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 10
}

vrrp_instance VI_1 {
    state MASTER 
    interface ens192
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.19
    }
    track_script {
        check_haproxy
    }
}
EOF

master02 上 keepalived 的配置:

# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
   router_id master02
   
   script_user root
   enable_script_security 
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 10
}

vrrp_instance VI_1 {
    state BACKUP 
    interface ens192
    virtual_router_id 50
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.19
    }
    track_script {
        check_haproxy
    }
}
EOF

master03 上 keepalived 的配置:

# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
   router_id master03
   
   script_user root
   enable_script_security 
}

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 10
}

vrrp_instance VI_1 {
    state BACKUP 
    interface ens192
    virtual_router_id 50
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.19
    }
    track_script {
        check_haproxy
    }
}
EOF

所有 master 节点执行

service keepalived start
systemctl enable keepalived

注意

  • vrrp_script 中参数 weight 一定要大于 master 和 backup 的 priority 的相差值
  • vrrp_instance 中参数 nopreempt 可以防止 master 恢复后自动回切

创建 K8S 集群

在初始化之前,需要先设置 hosts 解析
MASTER_IP 为 VIP 的地址
APISERVER_NAME 为 VIP 的域名

export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

在 master01 上执行 kubeadm init 进行初始化

kubeadm init \
 --apiserver-advertise-address 0.0.0.0 \
 --apiserver-bind-port 6443 \
 --cert-dir /etc/kubernetes/pki \
 --control-plane-endpoint k8s.api \
 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
 --kubernetes-version 1.18.2 \
 --pod-network-cidr 192.10.0.0/16 \
 --service-cidr 192.20.0.0/16 \
 --service-dns-domain cluster.local \
 --upload-certs

注意保存结果中两行 kubeadm join 开头内容,用于添加其他 master、worker 节点到集群中。

加载环境变量

master01 上执行,用于管理集群

如果在root用户下

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile

如果非root用户下

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

安装 Pod 网络组件

master01 上执行

# 获取配置文件
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml

# 修改配置文件
vi calico.yaml
# 找到 192.168.0.0/16 ,修改为 192.10.0.0/16

# 部署 Pod 网络组件
kubectl apply -f calico.yaml

实时查看 pod 的状态

watch kubectl get pods --all-namespaces -o wide

添加其他 master 节点到K8S集群

在其他 master 节点执行

使用 master01 上 kubeadm init 的执行结果中包含 join 的指令信息

端口由 6443 修改为 16443

export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join k8s.api:16443 --token ztjux9.2tau56zck212j9ra \
    --discovery-token-ca-cert-hash sha256:a2b552266902fb5f6620330fc1a6638a9cdd6fec3408edba1082e6c8389ac517 \
    --control-plane --certificate-key 961494e7d0a9de0219e2b0dc8bdaa9ca334ecf093a6c5f648aa34040ad39b61a
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile

将所有 Worker 节点添加到K8S集群

在worker 节点执行

使用 master01 上 kubeadm init 的执行结果中包含 join 的指令信息

端口由 6443 修改为 16443

export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join k8s.api:16443 --token ztjux9.2tau56zck212j9ra \
    --discovery-token-ca-cert-hash sha256:a2b552266902fb5f6620330fc1a6638a9cdd6fec3408edba1082e6c8389ac517

master01 上查看集群

watch kubectl get nodes -o wide

全部为 Ready 说明集群安装成功。

破坏性测试

  • 把 master01 的 haproxy 停掉
  • 把 master01 机器关机

可以看到 VIP 可以漂移到 master02 上

然后可以在 master02 做同样操作观察 VIP 是否可以漂到 master03 上

结束语

今天主要是实战搭建了 K8S 高可用负载均衡集群,是我实际操作的记录。

那么你有没有发现有个地方其实可以进一步的优化。

送你一碗鸡汤喝

  • 问题遇到的越早越好,如果你没有遇到问题,说明你的问题更大。

参考文章

https://wsgzao.github.io/post/keepalived

https://www.kubernetes.org.cn/7315.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341