K8s 入門指南(一):單節點集群環境搭建

前言

官方文檔:Kubernetes 文檔 | Kubernetes

系統配置 CentOS 7.9(2 核 2 G)

本文為 k8s 入門指南專欄,將會使用 kubeadm 搭建單節點 k8s 集群,詳細講解環境搭建部署的細節,專欄后面章節會以實戰代碼介紹相關概念,帶您快速入門 k8s

image.png

搭建方式

k8s 集群搭建有三種方式,目前主流的搭建 k8s 集群的方式有 kubeadm、minikube,二進制包

kubeadm

  • 是一個工具,用于快速搭建 kubernetes 集群,目前應該是比較方便和推薦的,簡單易用
  • kubeadm 是 Kubernetes 1.4 開始新增的特性
  • kubeadm init 以及 kubeadm join 這兩個命令可以快速創建 kubernetes 集群

minikube

  • 一般用于本地開發、測試和學習,不能用于生產環境
  • 是一個工具,minikube 快速搭建一個運行在本地的單節點的 Kubernetes

二進制包

  • 在官網下載相關的組件的二進制包,上面的兩個是工具,可以快速搭建集群,也就是相當于用程序腳本幫我們裝好了集群,前兩者屬于自動部署,簡化部署操作,自動部署屏蔽了很多細節,使得對各個模塊感知很少,遇到問題很難排查,如果手動安裝,對 kubernetes 理解也會更全面。
  • 目前生產環境的主流搭建方式,已在生產環境驗證,kubeadm 也可以搭建生產環境,不過 kubeadm 應該還沒有被大規模在生產環境驗證

本次我們作為演示的是 kubeadm

環境準備

官方文檔:安裝 kubeadm | Kubernetes

注:如果是使用的云服務器,下面的 swap、selinux 和防火墻都是默認關閉的,無需進行對應操作

安裝 Docker

官方文檔:Install Docker Engine on CentOS | Docker Docs

安裝腳本如下

#!/bin/bashset -e
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world

配置如下

cat > /etc/docker/daemon.json << EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

如果在國內,可以配置鏡像加速

阿里云鏡像加速地址:容器鏡像服務鏡像構建鏡像授權_鏡像托管-阿里云 (aliyun.com)

image.png

然后復制上面地址

# 更換鏡像為阿里云
vim /etc/docker/daemon.json
# 添加如下內容
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}systemctl restart docker
docker info

禁用 SELinux

將 SELinux 設置為 ?permissive? 模式

# 將 SELinux 設置為 permissive 模式(相當于將其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

關閉 Swap

Kubernetes 1.8 開始要求關閉系統的 Swap。如果不關閉,默認配置下 kubelet 將無法啟動。可以通過 kubelet 的啟動參數--fail-swap-on=false更改這個限制。我們這里簡單起見,直接關閉系統的 Swap

修改/etc/fstab文件,注釋掉SWAP的自動掛載,使用free -m確認 swap 已經關閉。
swappiness參數調整,修改/etc/sysctl.d/k8s.conf 添加下面一行:

vm.swappiness=0

執行 sysctl -p /etc/sysctl.d/k8s.conf 使修改生效

關閉防火墻

如果各個主機啟用了防火墻,需要開放 Kubernetes 各個組件所需要的端口

sudo systemctl stop firewalld
sudo systemctl disable firewalld

查看是否安裝成功

kubeadm version
kubectl version --client
kubelet --version

其他

設置允許 iptables 檢查橋接流量

cat > /etc/modules-load.d/k8s.conf << EOF
br_netfilter
EOFcat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsudo sysctl --system

安裝相關插件

yum -y install socat conntrack-tools

集群搭建

安裝 kubeadm

官方文檔:安裝 kubeadm | Kubernetes

kubeadm:用來初始化集群的指令。

kubelet:在集群中的每個節點上用來啟動 Pod 和容器等。

kubectl:用來與集群通信的命令行工具。

kubeadm 不能幫你安裝或者管理 kubelet 或 kubectl,所以你需要確保它們與通過 kubeadm 安裝的控制平面的版本相匹配。如果不這樣做,則存在發生版本偏差的風險,可能會導致一些預料之外的錯誤和問題。然而,控制平面與 kubelet 之間可以存在一個次要版本的偏差,但 kubelet 的版本不可以超過 API 服務器的版本。例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服務器,反之則不可以。

執行如下腳本安裝 kubeadm(國內線路)

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
yum install -y kubelet-1.20.2 kubeadm-1.20.2 kubectl-1.20.2 --disableexcludes=kubernetes
systemctl enable --now kubelet

安裝 kubectl

curl -Lo kubectl "https://storage.googleapis.com/kubernetes-release/release/v1.20.2/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/

拉取鏡像

執行 kubeadm config images pull 拉取鏡像,但是很大可能因為網絡原因連接失敗,可以使用如下阿里云命令(版本 v1.21)

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull coredns/coredns:1.7.0

在 k8s 安裝時會默認在鏡像中獲取 k8s.gcr.io 前綴的鏡像,所以我們需要將上文下載好的鏡像更改名稱

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1 k8s.gcr.io/kube-apiserver:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1 k8s.gcr.io/kube-proxy:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1 k8s.gcr.io/kube-controller-manager:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1 k8s.gcr.io/kube-scheduler:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag coredns/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0

注:后面 kubeadm init初始集群的時候可能報錯,顯示鏡像版本不對應,自行更改上面的版本即可,重新 docker pulldocker tag 即可,群體替換版本即可(1.21.1 -> 1.20.15),我這里就是偶爾需要用 1.21.1 版本,偶爾需要用 1.20.15 版本,所以我索性給這兩個版本鏡像都拉取到本地

修改主機映射

vim /etc/hosts

image.png

初始化服務

在初始化集群之前需要先重啟下 kubelet systemctl restart kubelet

kubeadm init --apiserver-advertise-address=172.25.234.148 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1
# 或
kubeadm init

解釋下命令

  1. kubeadm init: 這是命令的主體部分,它告訴 kubeadm 初始化一個新的 Kubernetes 控制平面。
  2. --apiserver-advertise-address=192.168.44.15: 這個選項指定 Kubernetes API Server 監聽的網絡地址。在這里,它設置為 192.168.44.15
  3. --pod-network-cidr=10.244.0.0/16: 這個選項指定用于 Pod 網絡的 CIDR 地址范圍。這是容器之間通信的地址范圍。在這里,它設置為 10.244.0.0/16
  4. --kubernetes-version=v1.21.1: 這個選項指定要安裝的 Kubernetes 版本,這里設置為 v1.21.1

如果出現問題,需要自行查看日志然后搜索解決(因為可能的出現錯誤太多,這里沒法一一列出)

image.png

可以嘗試重新啟動 kubelet systemctl restart kubelet ,然后重置集群kubeadm reset,然后再次嘗試初始化

image.png

注意:這里我使用的是 kubeadm init 初始化集群

下面解釋成功日志輸出,要使非 root 用戶可以運行 kubectl,請運行以下命令,它們也是 kubeadm init 輸出的一部分

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

如果是 root 用戶,可以運行如下

export KUBECONFIG=/etc/kubernetes/admin.conf

我們可以運行 kubectl apply -f [podnetwork].yaml 部署 Pod 網絡

然后如果多集群部署,并且多服務器之間內網是連通的話,可以使用如下命令添加工作節點

kubeadm join 172.25.234.148:6443 --token ls55pz.ed4wq51xex0ho1hh \--discovery-token-ca-cert-hash sha256:a082bb7e27b8c26625edeb8198e49967bd4dd4493b3b532c750a9f98f912f801

然后我們可以安裝 Flannel,Flannel 通過給每臺宿主機分配一個子網的方式為容器提供虛擬網絡,它基于 Linux TUN/TAP,使用 UDP 封裝 IP 包來創建 overlay 網絡,并借助 etcd 維護網絡的分配情況

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

最后驗證節點,如果為 Ready 則 master 節點已經注冊到了 k8s

kubectl get nodes

如果是 NotReady,可以執行以下語句判斷服務器狀態

image.png

kubectl get nodes -o yaml

然后查看 kubelet 日志 journalctl -f -u kubelet.service

部分日志顯示錯誤:networkPlugin cni failed to set up pod

vim /etc/yum.repos.d/kubernetes.repogpgcheck=0
repo_gpgcheck=0
# 上面兩項修改如下
gpgcheck=1
repo_gpgcheck=1# 然后執行如下
yum clean all
yum install kubernetes-cni -y

最后可以看到節點添加成功

image.png

總結

至此單節點環境部署已經結束,博主剛剛接觸學習 k8s,希望和大家分享學習中的經驗教訓,如果文中有錯誤紕漏還望各位指出

后面專欄大概還會有一到兩個章節,以實戰 demo 代碼學習 Pod,Deployment,Service 等概念

除此之外的話,我自己也嘗試過 windows(WSL2)搭建 minikube k8s 環境,不是很理想,哪怕是對于學習目的也并不推薦。然后其實相較于 CentOS 其實官方更推薦使用 Ubuntu ,官方社區長期維護,也比較穩定

參考鏈接

  • 通過 kubeadm 搭建單節點 k8s 環境 | yanyx’s blog
  • 用 Kubeadm 搭建一個 k8s 1.7.5 的單節點集群
  • 使用 kubeadm 搭建 kubernetes 單機 master - 阿里云開發者社區
  • guangzhengli/k8s-tutorials: k8s tutorials | k8s 教程

本文由博客一文多發平臺 OpenWrite 發布!

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

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

相關文章

P1001 A+B Problem題解

對于編程語言語法的學習最好的辦法就是在題目中學習&#xff0c;現在來開啟我們的學習之旅。 題目 輸入兩個整數a,b&#xff0c;輸出它們的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 輸入輸出樣例 輸入 20 30 輸出 50 代碼 #include<iostream> using names…

點擊登錄按鈕二次才跳轉到首頁

1.問題描述 點擊登錄按鈕&#xff0c;調取接口,成功后獲取數據并跳轉到首頁&#xff0c;都沒有問題&#xff0c;也沒有報錯&#xff0c;就是點擊第一次不跳轉&#xff0c;第二次才能跳轉&#xff0c;這是代碼 this.$message({message: "登陸成功",type: "succ…

Vue3+ts----根據配置項,動態生成表單

這里使用的UI框架是ElementPlus&#xff0c;更換其他組件直接更換constant.ts中的type配置和對應的Form組件即可. 大家可以npm install elementplus_dy_form來體驗。 思路&#xff1a; 1.這里需要使用h函數方便控制要渲染的表單 2.傳遞type作為組件或html元素進行渲染&#xff…

PHP基礎 - 輸入輸出

在 PHP 中,有多種方法可以用來輸出內容。下面是其中的幾種: 1、echo: 這是最常見的輸出語句之一,可以輸出一個或多個字符串。它是一個語言結構,可以省略括號。使用示例如下: <?php // 使用 echo 語句輸出一個字符串 echo "Hello, world!\n";// 可以使用…

虛擬儀器的外部接口設計

虛擬儀器的外部接口設計需要考慮多個因素。以下是一些可能涉及的方面&#xff1a; 接口類型&#xff1a;根據實際需要&#xff0c;選擇不同類型的接口。例如&#xff0c;計算機內部插卡式接口有isa接口和pci接口&#xff0c;適用于中小型測試系統。計算機外部通用總線接口有增…

P1035 [NOIP2002 普及組] 級數求和題解

題目 已知&#xff1a;.顯然對于任意一個整數 k&#xff0c;當 n 足夠大的時候,Sn?>k。 現給出一個整數k&#xff0c;要求計算出一個最小的n&#xff0c;使得Sn?>k。 輸入輸出樣例 輸入 1 輸出 2 代碼 #include<iostream> using namespace std; int mai…

周周愛學習之Redis重點總結

redis重點總結 在正常的業務流程中&#xff0c;用戶發送請求&#xff0c;然后到緩存中查詢數據。如果緩存中不存在數據的話&#xff0c;就會去數據庫查詢數據。數據庫中有的話&#xff0c;就會更新緩存然后返回數據&#xff0c;數據庫中也沒有的話就會給用戶返回一個空。 1.緩…

AIGC創作系統ChatGPT網站源碼,Midjourney繪畫,GPT聯網提問/即將支持TSS語音對話功能

一、AI創作系統 SparkAi創作系統是基于ChatGPT進行開發的Ai智能問答系統和Midjourney繪畫系統&#xff0c;支持OpenAI-GPT全模型國內AI全模型。本期針對源碼系統整體測試下來非常完美&#xff0c;可以說SparkAi是目前國內一款的ChatGPT對接OpenAI軟件系統。那么如何搭建部署AI…

leetcode 面試題 02.02. 返回倒數第k個節點

提建議就是&#xff0c;有些題還是有聯系的&#xff0c;建議就收看完 876.鏈表的中間節點&#xff08;http://t.csdnimg.cn/7axLa&#xff09;&#xff0c;再將這一題聯系起來 面試題 02.02. 返回倒數第k個節點 題目&#xff1a; 實現一種算法&#xff0c;找出單向鏈表中倒數第…

這些接口自動化測試工具如果不知道,就真out了!

一、Postman Postman是一款廣受歡迎的API測試工具&#xff0c;除了手動發送HTTP請求的基本功能&#xff0c;它還提供了自動化測試和腳本測試的功能&#xff0c;非常適合進行HTTP接口的自動化測試。 二、Rest-Assured Rest-Assured是一個Java庫&#xff0c;專為REST服務的測試…

java中守護線程的特點是什么?

Java 中守護線程&#xff08;Daemon Thread&#xff09;的特點如下&#xff1a; 隨主線程結束而結束&#xff1a; 守護線程是在后臺運行的線程&#xff0c;當所有的用戶線程都執行完畢后&#xff0c;即主線程結束&#xff0c;守護線程會隨之被終止。它不會阻止 JVM 退出。 不執…

C++異常剖析

什么是異常&#xff1f; 在程序運行的過程中&#xff0c;我們不可能保證我們的程序百分百不出現異常和錯誤&#xff0c;那么出現異常時該怎么報錯&#xff0c;讓我們知道是哪個地方錯誤了呢? C中就提供了異常處理的機制。 一、異常處理的關鍵字 &#xff08;1&#…

聯想電腦重裝系統Win10步驟和詳細教程

聯想電腦擁有強大的性能&#xff0c;很多用戶辦公都喜歡用聯想電腦。有使用聯想電腦的用戶反映系統出現問題了&#xff0c;想重新安裝一個正常的系統&#xff0c;但是不知道重新系統的具體步驟。接下來小編詳細介紹給聯想電腦重新安裝Win10系統系統的方法步驟。 推薦下載 系統之…

Codeforces Round 913 (Div. 3) (A-G)

后天就是 I C P C ICPC ICPC杭州站了&#xff0c;今天把之前做的 d i v 3 div3 div3題補一下&#xff0c;打完這場杭州站這賽季除了 E C F i n a l EC\,\,Final ECFinal就結束了&#xff0c;以后應該要多打 c f cf cf比賽練習保持手感&#xff0c;爭取下賽季沖一下金牌。 感覺這…

客廳顏值擔當:木飾面電視背景墻設計。福州中宅裝飾,福州裝修

你是否也為客廳的裝修設計而煩惱&#xff1f;現在&#xff0c;我為你帶來一款高顏值的木飾面電視背景墻設計&#xff0c;它將是你客廳的亮點所在。 1?? 確定背景墻的尺寸和位置 首先&#xff0c;你需要確定背景墻的尺寸和位置&#xff0c;這取決于你家電視的大小和放置位置。…

重新認識Word——多級列表和項目符號

重新認識Word——多級列表和項目符號 多級列表沒有運用標題樣式但標題格式統一 正式公本文書項目符號和自動編號項目符號自動編號軟回車重新起頭開始編號解決編號與文本距離過大問題 之前我們重新認識了Word里面的樣式&#xff0c;現在的情況就是&#xff0c;我的一些文字已經運…

Python Authlib庫:構建安全可靠的身份驗證系統

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在現代應用程序中&#xff0c;安全性是至關重要的&#xff0c;特別是在處理用戶身份驗證時。Authlib庫為Python開發者提供了一套強大的工具&#xff0c;用于簡化和增強身份驗證和授權流程。本文將深入探討Authli…

因小失大,一個普通的postman多接口順序執行,讓項目癱瘓了一天

Runner的使用 postman不僅可以單獨運行某個接口&#xff0c;postman的 Runner模塊可以運行多個接口&#xff0c;可以實現真正意義上的自動化接口測試 Runner的主要功能如下 按順序調用接口&#xff0c;執行用例&#xff1b; 批量發送請求&#xff1b; 對接口數據進行參數化…

yarn和npm的區別

2023-12-8 yarn和npm的區別 是常用的包管理工具&#xff0c;用于node.js項目中安裝、管理、和更新依賴項 有以下幾個區別&#xff1a; 性能和速度&#xff1a;在包的安裝和下載方面&#xff0c;yarn比npm更快速&#xff0c;yarn通過并行下載和緩存等優化策略&#xff0c;可以…

DreamPlace 的下載安裝與使用

DreamPlace 是一款芯片放置工具&#xff0c;用于宏單元&#xff08;macro&#xff09;和標準單元&#xff08;Standard Cell&#xff09;的放置以及布線&#xff0c;并計算 HPWL、Overlap 等用于衡量芯片性能的參數。 一、環境 1. 系統環境&#xff1a;Ubuntu 20.04 DreamPla…