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

——————————————————————————————————————————————
博主介紹:Java領域優質創作者,博客之星城市賽道TOP20、專注于前端流行技術框架、Java后端技術領域、項目實戰運維以及GIS地理信息領域。

🍅文末獲取源碼下載地址🍅

👇🏻 精彩專欄推薦訂閱👇🏻 歡迎點贊收藏評論拍磚…

【Docker Swarm總結】《容器技術 Docker+K8S專欄》?

【uniapp+uinicloud多用戶社區博客實戰項目】《完整開發文檔-從零到完整項目》?

【Springcloud Alibaba微服務分布式架構 | Spring Cloud】《系列教程-更新完畢》?

【SpringSecurity-從入門到精通】《學習完整筆記-附(完整demo源碼)》?

【從零開始Vue項目中使用MapboxGL開發三維地圖教程】《系列教程-不定時更新》?

【Vue.js學習詳細課程系列】《共32節專欄收錄內容》?

感興趣的可以先收藏起來相關問題都可以給我留言咨詢,希望幫助更多的人。

——————————————————————————————————————————————

文章目錄

    • 1. 安裝要求
    • 2. 準備環境
    • 3. 所有master節點部署keepalived
      • 3.1 安裝相關包和keepalived
      • 3.2配置master節點
      • 3.3 啟動和檢查
    • 4. 部署haproxy
      • 4.1 安裝
      • 4.2 配置
      • 4.3 啟動和檢查
    • 5. 所有節點安裝Docker/kubeadm/kubelet
      • 5.1 安裝Docker
      • 5.2 添加阿里云YUM軟件源
      • 5.3 安裝kubeadm,kubelet和kubectl
    • 6. 部署Kubernetes Master
      • 6.1 創建kubeadm配置文件
      • 6.2 在master1節點執行
    • 7.安裝集群網絡
    • 8、master2節點加入集群
      • 8.1 復制密鑰及相關文件
      • 8.2 master2加入集群
    • 5. 加入Kubernetes Node
    • 7. 測試kubernetes集群

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
master1192.168.44.155
master2192.168.44.156
node1192.168.44.157
VIP(虛擬ip)192.168.44.158
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld# 關閉selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 臨時# 關閉swap
swapoff -a  # 臨時
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久# 根據規劃設置主機名
hostnamectl set-hostname <hostname># 在master添加hosts
cat >> /etc/hosts << EOF
192.168.44.158    master.k8s.io   k8s-vip
192.168.44.155    master01.k8s.io master1
192.168.44.156    master02.k8s.io master2
192.168.44.157    node01.k8s.io   node1
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-ltdlyum install -y keepalived

3.2配置master節點

master1節點配置

cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalivedglobal_defs {router_id k8s
}vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}vrrp_instance VI_1 {state MASTER interface ens33 virtual_router_id 51priority 250advert_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}virtual_ipaddress {192.168.44.158}track_script {check_haproxy}}
EOF

master2節點配置

cat > /etc/keepalived/keepalived.conf <<EOF 
! Configuration File for keepalivedglobal_defs {router_id k8s
}vrrp_script check_haproxy {script "killall -0 haproxy"interval 3weight -2fall 10rise 2
}vrrp_instance VI_1 {state BACKUP interface ens33 virtual_router_id 51priority 200advert_int 1authentication {auth_type PASSauth_pass ceb1b3ec013d66163d6ab}virtual_ipaddress {192.168.44.158}track_script {check_haproxy}}
EOF

3.3 啟動和檢查

在兩臺master節點都執行

# 啟動keepalived
$ systemctl start keepalived.service
設置開機啟動
$ systemctl enable keepalived.service
# 查看啟動狀態
$ systemctl status keepalived.service

啟動后查看master1的網卡信息

ip a s ens33

4. 部署haproxy

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 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemon # turn on stats unix socketstats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------  
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#--------------------------------------------------------------------- 
frontend kubernetes-apiservermode                 tcpbind                 *:16443option               tcplogdefault_backend      kubernetes-apiserver    
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiservermode        tcpbalance     roundrobinserver      master01.k8s.io   192.168.44.155:6443 checkserver      master02.k8s.io   192.168.44.156:6443 check
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen statsbind                 *:1080stats auth           admin:awesomePasswordstats refresh        5sstats realm          HAProxy\ Statisticsstats uri            /admin?stats
EOF

4.3 啟動和檢查

兩臺master都啟動

# 設置開機啟動
$ systemctl enable haproxy
# 開啟haproxy
$ systemctl start haproxy
# 查看啟動狀態
$ systemctl status haproxy

檢查端口

netstat -lntup|grep haproxy

5. 所有節點安裝Docker/kubeadm/kubelet

Kubernetes默認CRI(容器運行時)為Docker,因此先安裝Docker。

5.1 安裝Docker

$ wget https://mirrors.aliyun.com/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://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

5.2 添加阿里云YUM軟件源

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

5.3 安裝kubeadm,kubelet和kubectl

由于版本更新頻繁,這里指定版本號部署:

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

6. 部署Kubernetes Master

6.1 創建kubeadm配置文件

在具有vip的master上操作,這里為master1

$ mkdir /usr/local/kubernetes/manifests -p$ cd /usr/local/kubernetes/manifests/$ vi kubeadm-config.yamlapiServer:certSANs:- master1- master2- master.k8s.io- 192.168.44.158- 192.168.44.155- 192.168.44.156- 127.0.0.1extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "master.k8s.io:16443"
controllerManager: {}
dns: type: CoreDNS
etcd:local:    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.16.3
networking: dnsDomain: cluster.local  podSubnet: 10.244.0.0/16serviceSubnet: 10.1.0.0/16
scheduler: {}

6.2 在master1節點執行

$ 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 cskubectl get pods -n kube-system

7.安裝集群網絡

從官方地址獲取到flannel的yaml,在master1上執行

mkdir flannel
cd flannel
wget -c https://raw.githubusercontent.com/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.44.156 mkdir -p /etc/kubernetes/pki/etcd# scp /etc/kubernetes/admin.conf root@192.168.44.156:/etc/kubernetes# scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.44.156:/etc/kubernetes/pki# scp /etc/kubernetes/pki/etcd/ca.* root@192.168.44.156:/etc/kubernetes/pki/etcd

8.2 master2加入集群

執行在master1上init后輸出的join命令,需要帶上參數--control-plane表示把master控制節點加入集群

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

檢查狀態

kubectl get nodekubectl get pods --all-namespaces

5. 加入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 nodekubectl get pods --all-namespaces

7. 測試kubernetes集群

在Kubernetes集群中創建一個pod,驗證是否正常運行:

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

訪問地址:http://NodeIP:Port

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ImmunityCanvas7.26安裝詳細教程

ImmunityCanvas7.26 大家想必都已經知道了Immunity Canvas7.26武器于2021年3月2日泄露了吧那我就廢話不多說了。 很多人已經有了這款工具不得不說這工具很nice如果要買的話一年的話3萬美金我的天我窮了。。 簡單介紹 Immunity Canvas是美國ImmunitySec出品的安全漏洞檢測工具…

數據庫產品層出不窮,金融行業應該怎么選?|飛輪科技聯合創始人連林江

眾所周知&#xff0c;金融行業對于數據有著極為嚴苛的標準和要求&#xff0c;尤其當在線化、實時化業務場景增多以后&#xff0c;金融行業也面臨著多重的挑戰&#xff1a;既要滿足實時數據分析的高性能、高效率需求&#xff0c;又要確保數據的安全性和完整性。基于此&#xff0…

[GPT]Andrej Karpathy微軟Build大會GPT演講(上)--GPT如何訓練

前言 OpenAI的創始人之一,大神Andrej Karpthy剛在微軟Build 2023開發者大會上做了專題演講:State of GPT(GPT的現狀)。 他詳細介紹了如何從GPT基礎模型一直訓練出ChatGPT這樣的助手模型(assistant model)。作者不曾在其他公開視頻里看過類似的內容,這或許是OpenAI官方…

產品經理在項目周期中扮演的角色Axure的安裝與基本使用

目錄 一.項目周期流程 二.Axure是什么 三.Axure安裝 3.1 一鍵式安裝 3.2 漢化 3.3 授權登錄 四.Axure的界面介紹及基本使用 4.1 菜單欄的使用 4.2 工具欄的使用 4.3 頁面概要的使用及組件的使用 4.4 組件的樣式設計 一.項目周期流程 在一般的項目周期中包含的工作內容有&…

2005-2021年全國各省資本存量測算數據(含原始數據+測算過程+計算結果)

2005-2021年全國各省資本存量測算數據&#xff08;含原始數據測算過程計算結果&#xff09; 1、時間&#xff1a;2005-2021年&#xff08;以2005年為基期&#xff09; 2、范圍&#xff1a;30個省市&#xff08;不含西藏&#xff09; 3、指標&#xff1a;固定資產形成總額、固…

利用工具JStack排查:死鎖問題和CPU100%問題

無論是再面試過程中還是再實際項目開發當中我們都有可能遇到這兩個問題。我之前有同學面試這兩個問題都有問道過。哈哈哈。所以我絕對把他們了解下并利用博客記錄。 1、工具JStack是什么&#xff1f; JStack可以顯示Java應用程序中每個線程的堆棧跟蹤&#xff0c;幫助開發人員…

【PTA題目】7-8 矩陣運算 分數 10

7-8 矩陣運算 分數 10 全屏瀏覽題目 切換布局 作者 C課程組 單位 浙江大學 給定一個nn的方陣&#xff0c;本題要求計算該矩陣除副對角線、最后一列和最后一行以外的所有元素之和。副對角線為從矩陣的右上角至左下角的連線。 輸入格式: 輸入第一行給出正整數n&#xff08;…

Azure Machine Learning - 使用自己的數據與 Azure OpenAI 模型對話

在本文中&#xff0c;可以將自己的數據與 Azure OpenAI 模型配合使用。 對數據使用 Azure OpenAI 模型可以提供功能強大的對話 AI 平臺&#xff0c;從而實現更快、更準確的通信。 關注TechLead&#xff0c;分享AI全維度知識。作者擁有10年互聯網服務架構、AI產品研發經驗、團隊…

臺式掃描電鏡中的掃描速度和掃描模式如何選擇?

臺式掃描電鏡&#xff08;SEM&#xff09;是一種利用電子束掃描樣品表面&#xff0c;通過檢測樣品反射或發射的次級電子、背散射電子、X 射線等信號&#xff0c;來獲取樣品的形貌、結構、組成和分布等信息的儀器。臺式掃描電鏡具有體積小、操作簡單、樣品制備方便、分辨率高、成…

AttributeError: cannot assign module before Module.__init__() call 解決方法

這個錯誤通常是由于在__init__方法之外對模塊中的某些成員進行了初始化或賦值操作&#xff0c;導致模塊還沒有被完全初始化就已經被調用了。為了解決這個問題&#xff0c;需要將所有的初始化或賦值操作移到__init__方法內部。 例如&#xff0c;如果有一個自定義模塊MyModule&a…

量化交易與人工智能:Python庫的應用與效用

&#x1f482; 個人網站:【 海擁】【神級代碼資源網站】【辦公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;輕量化工具創作平臺&#x1f485; 想尋找共同學習交流的小伙伴&#xff0c;請點擊【全棧技術交流群】 量化交易簡介 量化交易是一種利用計算機算法執…

Windows使用virtualenv創建python環境

假設已有python和pip環境使用pip安裝vitualenv pip install virtualenv 將virtualenv的路徑加入環境變量使用virtualenv創建一個虛擬環境 virtualenv virtual_name --pythonpython3.9 激活虛擬環境 virtual_name\Script\activate 遇到問題&#xff1a; 使用工作電腦激活…

VUE+webrtc-streamer 實現實時視頻播放(監控設備-rtsp)

效果 下圖則啟動成功&#xff0c;此時在瀏覽器訪問127.0.0.1:8000可以看到本機監控畫面 1、下載webrtc-streamer 地址&#xff1a;https://github.com/mpromonet/webrtc-streamer/releases 2、解壓下載包 3、雙擊webrtc-streamer.exe啟動服務 4、將下載包html文件夾下webrt…

Vue筆記-在axios中的than函數中使用this需要注意的地方

在Vue中&#xff0c;可以使用this關鍵字來訪問到組件中定義的變量。然而&#xff0c;在axios的then函數中&#xff0c;this關鍵字的作用域會改變&#xff0c;會指向axios對象本身而不是Vue組件實例。因此&#xff0c;不能直接訪問到Vue組件中定義的變量。 解決這個問題的一種方…

數據分析Pandas

數據分析Pandas Pandas簡介第一個PandasPandas APIPandas數據結構Pandas數據結構SeriesSeries API創建 SeriesSeries基本屬性和方法Series索引操作Series切片操作Series過濾數據Series算術運算Series缺失數據處理Series排序和排名Series統計函數Pandas數據結構DataFrameDataFr…

2023/12/11 作業

1.思維導圖 2.作業 成果&#xff1a; 第一個頭文件 #ifndef TEST3GET_H #define TEST3GET_H #include <QWidget> #include<QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class test3get; } QT_END_NAMESPACE class test3get : public QWidget { Q_OBJE…

QT學習(19):QIODevice

目錄 QIODevice類&#xff1a;一、一般操作1、open()和close()2、read()3、write() 二、隨機存取設備和順序設備三、讀寫信號四、阻塞函數五、虛函數readData、readLineData、writeData六、內存緩沖區七、事務機制 QIODevicePrivate類QRingBuffer和QRingChunk QIODevice類&…

安卓.apk的文件app應用程序開發后如何安裝運行到真機上測試?

當您完成了一個安卓app的開發之后&#xff0c;進行真機測試是確保應用程序穩定運行的關鍵步驟之一。下面我們會講述幾種將安卓app安裝到手機進行測試的方法&#xff0c;請根據具體情況選擇合適的方式。 圖片來源&#xff1a;安卓.apk的文件app應用程序開發后如何安裝運行到真機…

Scala-初學

前提&#xff0c;已經安裝好Scala 在Linux終端 準備資料&#xff1a; a.txt 內容 HIVE 底層 是 hdfs 和 mapreduce 實現存儲 和 計算的 。 HIVE 也 可以 使用 hadoop 配置 的 壓縮 方法 對 中間 結果 或 最終 數據 進行 壓縮 1 import scala.io.Source scala> val lines So…

C++ 指針常量和常量指針的區別

指針常量 指針常量&#xff1a;顧名思義它就是一個常量&#xff0c;但是是指針修飾的。 格式為&#xff1a; int * const p //指針常量在這個例子下定義以下代碼&#xff1a; int a&#xff0c;b&#xff1b; int * const p&a //指針常量 //那么分為一下兩種操作 *p9;//操…