單台主機搭建kubernetes多master高可用集群


使用家里閑置的單台家用台式機搭建kubernetes高可用多master集群環境

硬件介紹

cpu i5-10600KF六核心 十二線程
內存:8G*2 、16G*2 總共48G
磁盤:SSD480G*2 SSD250G*2 HDD2T*1

資源規划

主機:win10專業版
虛擬機:vmware:wmware16 por

centos7虛擬機總共9個,名稱和資源划分如下

9台centos7虛擬機中5台用於k8s集群,3台用於數據存儲,1台用於測試
k8s集群包含3個master節點、2個node節點。3台master所在虛擬機安裝nginx、Keepalived、ipvs實現高可用
數據存儲包含一個mysql集群和一個gluster文件系統

centos7安裝和環境配置

假設已經使用vmware安裝一台centos7虛擬機,進去虛擬機,進行如下設置

1關閉防火牆和NetworkManager
systemctl stop NetworkManager && systemctl disable NetworkManager
systemctl stop firewalld && systemctl disable firewalld 
2永久關閉selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config;cat /etc/selinux/config 
3修改主機名
hostnamectl set-hostname master-1
4修改hosts文件
cat >> /etc/hosts << EOF
192.168.2.191    master-1
192.168.2.192    master-2
192.168.2.193    master-3
192.168.2.194    node-1  
192.168.2.195    node-2  
EOF
5禁用swap
swapoff -a
sed -i.bak '/swap/s/^/#/' /etc/fstab
6內核參數修改
cat <<EOF >  /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 -p /etc/sysctl.d/k8s.conf
7新增kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

##########################
    [] 中括號中的是repository id,唯一,用來標識不同倉庫
    name 倉庫名稱,自定義
    baseurl 倉庫地址
    enable 是否啟用該倉庫,默認為1表示啟用
    gpgcheck 是否驗證從該倉庫獲得程序包的合法性,1為驗證
    repo_gpgcheck 是否驗證元數據的合法性 元數據就是程序包列表,1為驗證
    gpgkey=URL 數字簽名的公鑰文件所在位置,如果gpgcheck值為1,此處就需要指定gpgkey文件的位置,如果gpgcheck值為0就不需要此項了
8更新緩存
yum clean all
yum -y makecache
9安裝命令補全
1 安裝bash-completion
yum -y install bash-completion

2 加載bash-completion
source /etc/profile.d/bash_completion.sh
10安裝docker
1安裝依賴包
    yum install -y yum-utils   device-mapper-persistent-data   lvm2

2設置Docker源
	#推薦使用國內的
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


3安裝Docker CE
    docker可安裝版本查看
    yum list docker-ce --showduplicates | sort -r

安裝docker
    yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io -y

4啟動Docker並開機自啟
	systemctl start docker
	systemctl enable docker


5配置鏡像加速
    由於Docker Hub的服務器在國外,下載鏡像會比較慢,可以配置鏡像加速器提速

    配置daemon.json文件:
    mkdir -p /etc/docker
    vim /etc/docker/daemon.json
    {
    "registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"]
    }


6修改Cgroup Driver
    修改daemon.json 新增‘”exec-opts”: [“native.cgroupdriver=systemd”’
    修改cgroupdriver是為了消除告警:
      [WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver...

    vim /etc/docker/daemon.json 
    {
      "registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }

7重啟docker
    systemctl daemon-reload
    systemctl restart docker
11安裝iptables

ipvs

1安裝iptables
  yum install iptables-services -y

2禁用iptables
  systemctl disable iptables && systemctl stop iptables

3清空防火牆規則
  iptables -F

4創建ipvs.modules文件
  vim /etc/sysconfig/modules/ipvs.modules
    #!/bin/bash
    ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
    for kernel_module in ${ipvs_modules}; do
     /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
     if [ 0 -eq 0 ]; then
     /sbin/modprobe ${kernel_module}
     fi
    done

5執行腳本
 bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
 #不開啟ipvs將會使用iptables進行數據包轉發,但是效率低,所以官網推薦需要開通ipvs
12安裝其他必要軟件
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet rsync

centos7虛擬機快速創建

1.關閉上虛擬機
2.使用vmware的導出OVF功能,導出OVF
3.使用導出的OVF文件快速創建多個虛擬機
4.修改每台虛擬機的hostname和網絡配置,指定不同的內網ip,重啟網絡,即可xshell遠程連接

部署nginx、keepalived

在所有master節點部署nginx及keepalived
如下步驟僅需在master1、master2、master3三台虛擬機執行

安裝nginx、keepalived
rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx keepalived -y

編輯ngin配置文件
vim /etc/nginx/nginx.conf
  user nginx;
  worker_processes auto;
  error_log /var/log/nginx/error.log;
  pid /run/nginx.pid;

  include /usr/share/nginx/modules/*.conf;

  events {
      worker_connections 1024;
  }

  # 四層負載均衡,為兩台Master apiserver組件提供負載均衡
  stream {

      log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';

      access_log  /var/log/nginx/k8s-access.log  main;

      upstream k8s-apiserver {
         server 192.168.2.191:6443;   # centos7-1-master1 APISERVER IP:PORT
         server 192.168.2.192:6443;   # centos7-1-master2 APISERVER IP:PORT
         server 192.168.2.193:6443;   # centos7-1-master3 APISERVER IP:PORT
      }
      
      server {
         listen 64430; # 由於nginx與master節點復用,這個監聽端口不能是6443,否則會沖突
         proxy_pass k8s-apiserver;
      }
  }

  http {
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

      access_log  /var/log/nginx/access.log  main;

      sendfile            on;
      tcp_nopush          on;
      tcp_nodelay         on;
      keepalive_timeout   65;
      types_hash_max_size 2048;

      include             /etc/nginx/mime.types;
      default_type        application/octet-stream;

      server {
          listen       8000 default_server;
          server_name  _;

          location / {
          }
      }
  }

啟動nginx
systemctl start nginx &&  systemctl enable nginx

編輯keepalive配置文件
>注意每台虛擬機keepalived.conf的帶#注釋部分需設置不一樣的

mv  /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.bak
vim /etc/keepalived/keepalived.conf
   global_defs { 
     notification_email { 
       acassen@firewall.loc 
       failover@firewall.loc 
       sysadmin@firewall.loc 
     } 
     notification_email_from Alexandre.Cassen@firewall.loc  
     smtp_server 127.0.0.1 
     smtp_connect_timeout 30 
     router_id NGINX_MASTER
  } 

  vrrp_script check_nginx {
      script "/etc/keepalived/check_nginx.sh"
  }

  vrrp_instance VI_1 { 
      state BACKUP 
      interface ens33  # 修改為實際網卡名,根據實際網卡名字設置
      virtual_router_id 192 # VRRP 路由 ID實例,每個實例是唯一的 ,三台虛擬機設置成不一樣
      priority 100    # 優先級,三台虛擬機設置成不一樣 
      advert_int 1    # 指定VRRP 心跳包通告間隔時間,默認1秒 
      authentication { 
          auth_type PASS      
          auth_pass 1111 
      }  
      # 虛擬IP
      virtual_ipaddress { 
          192.168.2.100/24
      } 
      track_script {
          check_nginx
      } 
  }

創建keepalived用的判斷故障腳本
vim /etc/keepalived/check_nginx.sh 
  #!/bin/bash
  count=$(ps -ef |grep nginx | grep sbin | egrep -cv "grep|$$")
  if [ "$count" -eq 0 ];then
      systemctl stop keepalived
  fi
  [root@k8s-master2 ~]# chmod +x /etc/keepalived/check_nginx.sh
  #注:keepalived根據腳本返回狀態碼(0為工作正常,非0不正常)判斷是否故障轉移。  

啟動keepalived
systemctl start keepalived && systemctl enable keepalived

測試
...

安裝k8s

通過上一步操作得到5台虛擬機
在每一台虛擬機執行如下操作

1可安裝版本查看
yum list kubelet --showduplicates | sort -r
2安裝kubelet、kubeadm和kubectl
1 安裝
    yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5
      #kubelet 運行在集群所有節點上,用於啟動Pod和容器等對象的工具
      #kubeadm 用於初始化集群,啟動集群的命令工具
      #kubectl 用於和集群通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件

2 啟動kubelet並設置開機啟動
    systemctl enable kubelet && systemctl start kubelet

3 kubectl命令補全
    echo "source <(kubectl completion bash)" >> ~/.bash_profile
    source .bash_profile 
3准備kubernete必要容器鏡像

Kubernetes幾乎所有的安裝組件和Docker鏡像都放在goolge自己的網站上,直接訪問可能會有網絡問題
解決辦法:
從阿里雲鏡像倉庫下載鏡像,拉取到本地以后改回默認的鏡像tag。使用如下腳本實現。

1 鏡像下載的腳本
  cat image.sh 
        #!/bin/bash
        url=registry.aliyuncs.com/google_containers
        version=v1.23.5
        images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
        for imagename in ${images[@]} ; do
        docker pull $url/$imagename
        docker tag $url/$imagename k8s.gcr.io/$imagename
        docker rmi -f $url/$imagename
        done
        #url為阿里雲鏡像倉庫地址,version為安裝的kubernetes版本。

        docker pull registry.aliyuncs.com/google_containers/coredns:1.8.6 && docker tag registry.aliyuncs.com/google_containers/coredns:1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
        #coredns鏡像可能要手動pull,kubeadm執行初始化時需要

2 運行腳本image.sh下載鏡像
    sh image.sh
    # 注意 :每個節點都要執行,否則部分k8s必要的容器創建不成功
4初始化Master

任選一個master節點執行本部分操作(此處選的master-1)。

kubeadm init --apiserver-advertise-address=192.168.2.191 --kubernetes-version v1.23.5 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --upload-certs  --control-plane-endpoint 192.168.2.100:64430
# 192.168.2.100 是vip
#記錄上述面命令安裝成功后的輸出,后面需要這個命令將node節點和其他master節點加入集群中。
#注意master節點加入和node節點加入使用的參數是不一樣的,如下圖,上面一條是master用的、下面一條是node用的

如果初始化失敗,可執行kubeadm reset后重新初始化
  kubeadm reset
  rm -rf $HOME/.kube/config

加載環境變量,否則執行kubectl get node 會報錯The connection to the server localhost:8080 was refused
  echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
  source .bash_profile
拷貝證書(忘了是否必要執行次步驟以及何時執行)-----------------------------------?????
  scp  root@192.168.2.191:/etc/kubernetes/pki/ca.crt  /etc/kubernetes/pki/ca.crt 
  scp  root@192.168.2.191:/etc/kubernetes/pki/ca.key  /etc/kubernetes/pki/ca.key 
  scp  root@192.168.2.191:/etc/kubernetes/pki/sa.key  /etc/kubernetes/pki/sa.key 
  scp  root@192.168.2.191:/etc/kubernetes/pki/sa.pub  /etc/kubernetes/pki/sa.pub 
  scp  root@192.168.2.191:/etc/kubernetes/pki/front-proxy-ca.crt  /etc/kubernetes/pki/front-proxy-ca.crt 
  scp  root@192.168.2.191:/etc/kubernetes/pki/front-proxy-ca.key  /etc/kubernetes/pki/front-proxy-ca.key 
  scp  root@192.168.2.191:/etc/kubernetes/pki/etcd/ca.crt  /etc/kubernetes/pki/etcd/ca.crt 
  scp  root@192.168.2.191:/etc/kubernetes/pki/etcd/ca.key  /etc/kubernetes/pki/etcd/ca.key 
  scp  root@192.168.2.191:/etc/kubernetes/admin.conf  /etc/kubernetes/admin.conf 
加入集群

在加入集群前先關閉nginx ,預防訪問192.168.2.100:64430被路由到master-2、master-2上導致添加失敗
因為有監控腳本,當nginx關閉后,對應主機上的vip也會關閉
等所有節點都成功加入集群,再啟動nginx

在master-2、master-3 執行:  
  kubeadm join 192.168.2.100:64430 --token o0l7ya.8sr0b70ywafxe1m9 \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane --certificate-key xxx

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

在node-1、node-2 執行:
  kubeadm join 192.168.2.100:64430 --token o0l7ya.8sr0b70ywafxe1m9 \
--discovery-token-ca-cert-hash sha256:xxx 

添加成功會提示如下信息:

在master-1查看所有節點狀態:

  #圖示所有的節點狀態正常
安裝calico網絡

為什么不用flannel,好像安裝時遇到過問題搞不好,就用了calico

在任意主節點下載calico.yaml
  wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate

修改calico.yaml (忽略此步驟)
  ...
  #當使用kubeadm時,PodIP的范圍應該與kubeadm init的清單文件中的"podSubnet"字段或者"--pod-network-cidr"選項填寫的值相

查看calico.yaml用了哪些容器,並在所有節點上pull容器
  docker pull docker.io/calico/cni:v3.23.1
  docker pull docker.io/calico/kube-controllers:v3.23.1
  docker pull docker.io/calico/node:v3.23.1

在該主節點執行安裝
  kubectl apply -f calico.yaml

查看pod狀態
  kubectl get pods --all-namespaces
  #狀態應當全部是running

在k8s安裝Dashboard

Dashboard提供了可以實現集群管理、工作負載、服務發現和負載均衡、存儲、字典配置、日志視圖等功能。

下載yaml
  dashboard:v2.5.1已支持k8s:1.23.x
  wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml

修改yaml(鏡像可以支持下載忽略此步驟)
  #修改鏡像地址(由於默認的鏡像倉庫網絡訪問不通,故改成阿里鏡像)
  #sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml

  token失效較快,可設置參數延長失效時間- --token-ttl=432000,位置如下

映射到主機端口
  sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
  #配置NodePort,外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001

部署
  kubectl apply -f recommended.yaml

狀態查看
  kubectl get all -n kubernetes-dashboard 

令牌生成
  創建service accou  nt並綁定默認cluster-admin管理員集群角色:

創建用戶
kubectl create serviceaccount dashboard-admin -n kube-system

用戶授權
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

令牌查看
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

訪問測試
  外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001,默認運行在3個master任意一節點上,需要手動查看哪個機子開啟了30001端口
  選擇token方式登錄,輸入“3.4 令牌查看” 獲得的token,即可進入頁面

注意:
  默認情況下只能使用https訪問,但chrome可能會提示不安全,此時在瀏覽器當前頁面下鍵盤敲擊thisisunsafe可繼續訪問,
  火狐瀏覽器可正常進入,不會提示不安全。

未完


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM