個人博客站—運維鹿:http://www.kervin24.top/
CSDN博客—做個超努力的小奚: https://blog.csdn.net/qq_52914969?type=blog
?
一、kubernetes介紹
Kubernetes本質是一組服務器集群,它可以在集群的每個節點上運行特定的程序,來對節點中的容器進行過管理。它的目的就是實現資源管理的自動化,主要提供了以下的主要功能:
-
自我修復:一旦某個容器崩潰,能夠在1秒中左右迅速啟動新的容器
-
彈性伸縮:可以根據需要,自動對集群中正在運行的容器數量進行調整
-
服務發現:服務可以通過自動發現的形式找到它所依賴的服務
-
負載均衡:如果一個服務啟動了多個容器,能夠自動實現請求的負載均衡
-
版本回退:如果發現新發布的程序版本有問題,可以立即回退到原來的版本
-
存儲編排:可以根據容器自身的需求自動創建存儲卷
二、 集群環境搭建
2.1、集群類型
Kubernertes集群大體分為兩類:一主多從和多主多從
-
一主多從:一臺master節點和多臺node節點,搭建簡單,但是有單機故障風險,適合用于測試環境
-
多主多從:多臺master節點和多臺node節點,搭建麻煩,安全性高,適合用于生產環境
2.2、安裝方式
Kubernetes有多種部署方式,目前主流的方式有kubeadm、minikube、二進制包
-
minikube:一個用于快速搭建單節點kubernetes的工具
-
kubeadm:應該用于快速搭建kubernetes集群的工具
-
二進制包:從官網下載每個組件的二進制包,依次去安裝
2.3、環境搭建
2.3、環境搭建1.33版【kubeadm方式】
主機名 | IP | 配置 | 系統發行版 |
---|---|---|---|
master | 192.168.80.10 | 4C2G | CentOS Linux release 7.8 |
node1 | 192.168.80.11 | 4C2G | CentOS Linux release 7.8 |
node2 | 192.168.80.12 | 4C2G | CentOS Linux release 7.8 |
2.3.1、搭建三臺虛擬機
搭建k8s,系統發行版需要至少centos7.5,需要預留/var目錄下預留≥5G的足夠的空間
?1 這里采用了阿里云7.8的CentOS-7-x86_64-Minimal-2003.iso鏈接地址:https://mirrors.aliyun.com/centos-vault/7.8.2003/isos/x86_64/?spm=a2c6h.25603864.0.0.454a60bdb8NRXT?2 如果是掛載新iso,利用F2或者F12進BIOS,改光盤驅動安裝iso?3、更改centos的yum源為阿里云cd /etc/yum.repos.d/mv CentOS-Base.repo CentOS-Base.repo.backupcurl https://mirrors.aliyun.com/repo/Centos-7.repovi CentOS-Base.repo 將curl內容復制進去?4、yum install -y wgt 驗證成功
2.3.2、主機名解析
?主機名成解析 編輯三臺服務器的/etc/hosts文件,添加下面內容# 192.168.80.10 master# 192.168.80.11 node1# 192.168.80.12 node2
2.3.3、時間同步
kubernetes要求集群中的節點時間必須精確一致,這里直接使用chronyd服務從網絡同步時間
?#啟動chronyd服務[root@master ~]# systemctl start chronyd#設置chronyd服務開機自啟[root@master ~]# systemctl enable chronyd#chronyd服務啟動稍等幾秒鐘,就可以使用date命令驗證時間了[root@master ~]# date2025年 08月 04日 星期一 17:08:57 CST
2.3.4、禁用iptables和firewalld服務
kubernetes和docker在運動中會產生大量的iptables規則,為了不讓系統規則跟它們混淆,直接關閉系統的規則
?#關閉firewalld服務[root@master ~]# systemctl stop firewalld[root@master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.?#關閉iptables服務[root@master ~]# systemctl stop iptablesFailed to stop iptables.service: Unit iptables.service not loaded.
2.3.5、禁用selinux
selinux是linux系統下的一個安全服務,如果不關閉它,在安裝集群中會產生各種各樣的奇葩問題
?#編輯/etc/selinux/config文件,修改SELINUX的值為disabled#注意修改完畢之后需要重啟linux服務SELINUX=disabled
#通過getenforce來命令檢查是否生效
2.3.6、禁用swap分區
swap分區指的是虛擬內存分區,它的作用是在物
?#編輯分區配置文件/etc/fstab,注釋掉swap分區一行#注意修改完畢之后需要重啟linux服務[root@master ~]# vim /etc/fstab /dev/mapper/centos00-root / ? ? ? ? ? ? ? ? ? ? ? xfs ? ? defaults ? ? ? 0 0UUID=77663676-1afb-461c-997d-26c7b5e1f096 /boot ? ? ? ? ? ? ? ? ? xfs ? ? defaults ? ? ? 0 0#/dev/mapper/centos00-swap swap ? ? ? ? ? ? ? ? ? swap ? defaults ? ? ? 0 0
理內存使用完之后,將磁盤空間虛擬成內存來使用。啟用swap設備會對系統的性能產生非常負面的影響,因此kubernetes要求每個節點都要禁用swap設備,但是如果因為某些原因確實不能關閉swap,就需要在集群安裝過程當中通過明確的參數進行配置說明。
--------------------------------------------
檢查是否swap為禁用狀態
2.3.7、修改linux的內核參數
?#修改linux的內核參數,添加網橋過濾和地址轉發功能#編輯/etc/sysctl.d/kubernetes.conf文件,添加如下配置:net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1?#重新加載配置[root@master ~]# sysctl -p?#加載網橋過濾模塊[root@master ~]# modprobe br_netfilter?#查看網橋過濾模塊是否加載成功[root@master ~]# lsmod | grep br_netfilterbr_netfilter ? ? ? ? ? 22256 0 bridge ? ? ? ? ? ? ? 151336 1 br_netfilter
2.3.8、配置ipvs功能
在kubernetes中service有兩種代理模型,一種是基于iptables的,一種是基于ipvs的
兩者比較的話,ipvs的性能明顯要高一些,但是如果需要使用它,需要手動載入ipvs模塊
?#1 安裝ipset和ipvsadm[root@master yum.repos.d]# yum install ipset ipvsadmin -y?#2 添加需要加載的模塊寫入腳本[root@master yum.repos.d]#cat <<EOF > /etc/sysconfig/modules/ipvs.modules#!/bin/bashmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrack_ipv4EOF?#3 為腳本文件添加執行權限[root@master modules]# chmod +x /etc/sysconfig/modules/ipvs.modules ?#4 執行腳本文件[root@master modules]# /bin/bash /etc/sysconfig/modules/ipvs.modules ?#5 查看對應的模塊是否加載成功[root@master modules]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 ? ? 15053 0 nf_defrag_ipv4 ? ? ? ? 12729 1 nf_conntrack_ipv4ip_vs_sh ? ? ? ? ? ? ? 12688 0 ip_vs_wrr ? ? ? ? ? ? 12697 0 ip_vs_rr ? ? ? ? ? ? ? 12600 0 ip_vs ? ? ? ? ? ? ? ? 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrrnf_conntrack ? ? ? ? 139264 2 ip_vs,nf_conntrack_ipv4libcrc32c ? ? ? ? ? ? 12644 3 xfs,ip_vs,nf_conntrack
-----------------------------------------------------
執行完以上所有步驟,需要重新啟動linux系統
reboot
2.4、安裝docker和cri-dockerd
三臺都需要安裝
2.4.1、安裝docker
詳見Docker基本管理 - 運維鹿 docker基礎教程
1、安裝依賴包yum install -y yum-utils device-mapper-persistent-data lvm2-------------------------------------yum-utils:提供了yum-config-manager工具。devicemapper:是Linux內核中支持邏輯卷管理的通用設備映射機制,它為實現用于存儲資源管理的塊設備驅動提供了一個高度模塊化的內核架構。device mapper:存儲驅動程序需要device-mapper-persistent-data和lvm2。?2、設置阿里云鏡像源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo?3、安裝Docker-CE并設置為開機自動啟動yum install -y docker-ce docker-ce-cli containerd.io-----------------------------------報錯解決:這個報錯是container-selinux版本低或者是沒安裝的原因yum 安裝container-selinux 一般的yum源又找不到這個包需要安裝epel源 才能yum安裝container-selinux然后在安裝docker-ce就可以了。########################wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum install epel-releaseyum makecacheyum install container-selinux####################systemctl start docker.servicesystemctl enable docker.service--------------------------------------------------安裝好的Docker系統有兩個程序,Docker服務端和Docker客戶端。其中Docker服務端是一個服務進程,負責管理所有容器。Docker客戶端則扮演著Docker服務端的遠程控制器,可以用來控制Docker的服務端進程。大部分情況下Docker服務端和客戶端運行在一臺機器上。??4、配置鏡像加速配置修改配置文件/etc/docker/daemon.json(沒有時新建該文件)。-------------------{"registry-mirrors": ["https://docker.xuanyuan.me" ,"https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]}---------------------systemctl daemon-reload ###然后重啟Docker Daemon。systemctl restart docker
2.4.2、安裝cri-dockerd
以下參考實戰Kubernetes之快速部署 K8s 集群 v1.28.0-云社區-華為云
kubernetes1.24版本開始不再支持docker
因此,還需要安裝cri-dockerd來用于為Docker提供一個能夠支持K8S容器運行時標準的工具
#安裝cri-dockerd
# 通過 wget 命令獲取 cri-dockerd軟件
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd-0.3.12-3.el7.x86_64.rpm# 通過 rpm 命令執行安裝包
rpm -ivh cri-dockerd-0.3.12-3.el7.x86_64.rpm#安裝完成后修改配置文件(/usr/lib/systemd/system/cri-docker.service),
在 “ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://”
這一行增加 “--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9”。#配置文件修改后,重新加載配置并開啟 cri-dockerd 服務。
# 加載配置并開啟服務
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
2.5、安裝kuberbetes組件
三臺都需要安裝
1、 #編輯/etc/yum.repos.d/kubernetes.repo,添加以下配置
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
EOF2、#安裝kubeadm、kubelet和kubect1 (目前最新版本1.28-0)
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0#配置kubernet的cgroup
#編輯/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"3、# 設置 kubelet 自啟動
systemctl enable kubelet#在安裝kubernetes集群之前,查看所需鏡像可以通過下面命令查看
[root@master yum.repos.d]# kubeadm config images list
I0807 22:34:11.171481 4387 version.go:256] remote version is much newer: v1.33.3; falling back to: stable-1.28
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
2.6、集群初始化
2.6.1、Master節點加入K8S集群
下面的操作只需要在master節點上執行
kubeadm init \--apiserver-advertise-address=192.168.80.10 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.28.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16 \--cri-socket=unix:///var/run/cri-dockerd.sock \--ignore-preflight-errors=all相關參數解釋:
apiserver-advertise-address:集群廣播地址,用 master 節點的內網 IP。
image-repository:由于默認拉取鏡像地址 k8s.gcr.io 國內無法訪問,這里指定阿里云鏡像倉庫地址。
kubernetes-version: K8s 版本,與上面安裝的軟件版本一致。
service-cidr:集群 Service 網段。
pod-network-cidr:集群 Pod 網段。
cri-socket:指定 cri-socket 接口,我們這里使用 unix:///var/run/cri-dockerd.sock。
執行命令后耐心等待,直到安裝完成,會出現以上內容。
其中,在以上返回結果中有 3 條命令需要立即執行,這是用來設置 kubectl 工具的管理員權限,執行之后就可以在 Master 節點上通過終端窗口使用 kubectl 命令。
# 在 Master 節點上執行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.6.2、Node節點加入K8S集群
K8s 初始化之后,就可以在其他 2 個工作節點上執行 “kubeadm join” 命令,
因為我們使用了 cri-dockerd ,需要在命令加上 “–cri-socket=unix:///var/run/cri-dockerd.sock” 參數。
在master節點上,可重新生成并獲取token和sha256
[root@master /]# kubeadm token create --print-join-command
kubeadm join 192.168.80.10:6443 --token uobpxl.g3wk6xz24ubdw0hi --discovery-token-ca-cert-hash sha256:fe73798d15cf93f4cd1051d85502237505aeddf0d78653a04664e9f4d167c44c# 在兩個工作節點上執行
kubeadm join 192.168.80.10:6443 --token uobpxl.g3wk6xz24ubdw0hi \--discovery-token-ca-cert-hash sha256:fe73798d15cf93f4cd1051d85502237505aeddf0d78653a04664e9f4d167c44c \--cri-socket=unix:///var/run/cri-dockerd.sock#在master節點上執行get nodes查看集群節點狀態
[root@master /]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 23m v1.28.2
node1 NotReady <none> 26s v1.28.2
node2 NotReady <none> 7s v1.28.2
注意到所有節點的狀態都是 “NotReady”,這是由于集群還缺少網絡插件,集群的內部網絡還沒有正常運作。
2.7、安裝網絡插件calico
kubernetes支持多種網絡插件,比如flannel、calico、canal等等,本次選擇calico
# 下載 Calico 插件部署文件
wget https://docs.projectcalico.org/manifests/calico.yaml通過vi編輯器修改 “calico.yaml”的4601和4602行
文件中的 “CALICO_IPV4POOL_CIDR” 參數,
需要與前面 “kubeadm init” 命令中的 “–pod-network-cidr” 參數一樣(10.244.0.0/16)[root@master opt]# kubectl apply -f calico.yaml
#這里要稍微等一會,calico生效很慢,可以重啟服務器嘗試
至此,kubernetes集群已經安裝成功