一、資源下載
1、阿里云官方鏡像站
Rocky Linux 9.5 鏡像地址:https://mirrors.aliyun.com/rockylinux/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso
2、Calico 3.28.4
(1)百度網盤下載鏈接:
Calico images:
鏈接: https://pan.baidu.com/s/137bmlXkxgDrlo4ot41ADJw 提取碼: 9hvv
calico-v3.28.4.yaml
鏈接: https://pan.baidu.com/s/1Fn00SHrPpq34gy4mT6BY1A 提取碼: nr55
2、dashboard 2.7.0
通過網盤分享的文件:recommended.yaml
鏈接: https://pan.baidu.com/s/1LhhFs4z9T9DyImmWYzvU0Q 提取碼: h42p
二、環境準備
1、關閉防火墻
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
# 查看防火墻狀態
firewall-cmd --state
2、禁用swap
# 臨時關閉
swapoff -a
# 永久關閉,(編輯 /etc/fstab 文件,找到包含 swap 的行(如果有的話),并在行首添加 # 來注釋掉該行)
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、關閉 selinux
# 關閉 selinux
修改配置文件/etc/selinux/config
SELINUX=disabled
setenforce 0
# 本地部署建議直接關閉 selinux 或將其設置為寬容模式(SELINUX=permissive)
# 生產環境:如果需要更高的安全性,建議保持 SELinux 啟用
4、開啟 bridge 網橋過濾
# 創建一個配置文件 /etc/sysctl.d/k8s.conf,并通過 sysctl 配置內核參數
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 加載 br_netfilter模塊
# 由于開啟bridge功能,需要加載br_netfilter模塊來允許在bridge設備上的數據包經過iptables防火墻處理
modprobe br_netfilter
# 使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
# 查看是否加載成功:
lsmod | grep br_netfilter
#會輸出以下內容
br_netfilter 32768 0
bridge 303104 1 br_netfilter
5、集群規劃
主機名 | IP | 角色 | 配置 |
---|---|---|---|
master | 192.168.31.106 | 管理節點 | 2CPU/4G內存/20G |
node1 | 192.168.31.107 | 工作節點 | 2CPU/4G內存/20G |
node2 | 192.168.31.108 | 工作節點 | 2CPU/4G內存/20G |
docker harbor | 192.168.31.109 | 鏡像倉庫 | 2CPU/4G內存/20G |
三、Containerd
1、安裝 Containerd 軟件包
# 添加阿里云 docker-ce 倉庫
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 列出當前系統中所有可安裝的 containerd 版本,并按照版本號從高到低進行排序,同時顯示重復的版本。
dnf list containerd.io --showduplicates | sort -r
# 安裝最新版本 containerd,也可以指定版本安裝(dnf install -y containerd.io-1.6.20-3.1.el9.x86_64)
dnf install containerd.io -y
# 生成 containerd 配置文件
containerd config default | tee /etc/containerd/config.toml
# 啟用 Cgroup 用于限制進程的資源使用量,如CPU、內存資源
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
# 替換文件中 pause 鏡像的下載地址為阿里云倉庫
# 可先查看 /etc/containerd/config.toml 中 sandbox_image 中 pause 是否是 3.8 版本,不是的話自行修改
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
# 指定contaienrd接口文件地址,在k8s環境中,kubelet通過 containerd.sock 文件與containerd進行通信
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 啟動 containerd 并設置隨機自啟
systemctl enable containerd --now
2、配置鏡像加速
# 配置 containerd 的鏡像加速
# 創建文件夾
sudo mkdir -p /etc/containerd/certs.d/docker.io
# /etc/containerd/certs.d/docker.io 目錄下添加 hosts.toml 文件,內容如下
server = "https://registry-1.docker.io"
[host."https://qa9ktbtj.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
[host."https://mirror.ccs.tencentyun.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://docker.mirrors.ustc.edu.cn"]
capabilities = ["pull", "resolve"]
[host."https://www.daocloud.io/mirror"]
capabilities = ["pull", "resolve"]
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
# 檢查 containerd 主配置 /etc/containerd/config.toml
# 找到 config_path , 添加 /etc/containerd/certs.d
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
# 重啟 containerd:
sudo systemctl restart containerd
四、Kubernetes
1、安裝 kubeadm / kubectl / kubelet
# 配置 kubeadm 倉庫,使用阿里云YUM源
cat > /etc/yum.repos.d/k8s.repo <<EOF
[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
# 查看可安裝的版本
dnf list --showduplicates kubeadm kubelet kubectl
# 直接安裝,默認安裝最新版
dnf install -y kubeadm kubelet kubectl
# 選擇版本安裝
dnf install -y kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0
# 設置 kubelet 使用 systemd 作為 cgroup 驅動,用于限制、控制和隔離進程組的資源使用(如 CPU、內存、磁盤 I/O 等)。
tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
# 設置 kubelet 開機自啟動
# kubeadm 和 kubectl 是命令行工具,并非后臺服務,不需要設置開機自啟動
# kubelet 是一個守護進程(daemon),負責管理 Pod 和容器的生命周期,需要始終運行以確保節點正常工作
systemctl enable kubelet
2、集群初始化
# 在master節點生成初始化集群的配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
# 打開配置文件修改以下內容
# 本機的IP地址
advertiseAddress: 192.168.0.1
# 本機名稱
name: master
#集群鏡像下載地址,修改為阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# 通過配置文件初始化集群,一個 master 節點
kubeadm init --config kubeadm-config.yaml
# 如果打算配置多個 master 節點,執行下面命令
kubeadm init --config kubeadm-config.yaml --upload-certs
# 根據集群初始化后的提示,master節點直接執行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# node 節點加入集群的命令初始后會一并輸出,放在 node 節點執行
kubeadm join 192.168.31.106:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:cc364e5e0d15d81a9ee2ca0cafd987a77ca8563366d19e16f67e53a46a52e156
# 根據提示將node節點加入集群,加入成功后在master節點驗證
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 3m31s v1.28.2
node1 NotReady <none> 12s v1.28.2
node2 NotReady <none> 89s v1.28.2
# 如果哪個節點出現問題,可以使用下列命令重置當前節點后再執行加入集群的命令
kubeadm reset
# 在 maste 節點執行,獲取子節點加入集群令牌,將輸出命令直接在 node 節點執行
kubeadm token create --print-join-command
3、部署集群網絡 Calico
方式一:
# master 節點下載 Calico 文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.4/manifests/calico.yaml
# 創建 Calico 網絡
kubectl apply -f calico.yaml
# 查看 Calico Pod 狀態是否為 Running
[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-9d57d8f49-xv6lh 1/1 Running 27 (31m ago) 129m
calico-node-66shx 1/1 Running 2 (5h40m ago) 25h
calico-node-gjwjc 1/1 Running 2 (5h40m ago) 25h
calico-node-xhnxw 1/1 Running 2 (5h35m ago) 25h
coredns-6554b8b87f-cw5tx 1/1 Running 0 129m
coredns-6554b8b87f-l5pkj 1/1 Running 0 129m
etcd-master 1/1 Running 2 (5h40m ago) 26h
kube-apiserver-master 1/1 Running 3 (30m ago) 26h
kube-controller-manager-master 1/1 Running 3 (31m ago) 26h
kube-proxy-q5flt 1/1 Running 2 (5h40m ago) 26h
kube-proxy-qcxhp 1/1 Running 2 (5h35m ago) 26h
kube-proxy-vw9dm 1/1 Running 2 (5h40m ago) 26h
kube-scheduler-master 1/1 Running 3 (31m ago) 26h
# 如果失敗,可查看日志
kubectl describe pod calico-kube-controllers-9d57d8f49-xv6lh -n kube-system
方式二:
# 必選組件
# 1、calico-node.tar
# Calico 的核心組件之一,在每個節點(包括單節點集群)上運行。
# 它負責配置網絡接口、路由和防火墻規則,確保 Pod 之間的網絡連接和隔離。
# 2、calico-cni.tar
# 提供 Container Network Interface (CNI) 插件支持,用于為容器分配 IP 地址,并配置網絡接口。
# 3、calico-kube-controllers.tar
# 監聽 Kubernetes API Server 的事件,同步 Kubernetes 的網絡策略到 Calico 的數據平面。
# 盡管在單節點集群中可能不使用復雜的網絡策略,但該控制器有助于維護集群的網絡狀態一致性。
# 可選組件
# calico-typha.tar:Typha 主要用于大規模集群中減輕 kube-apiserver 的負擔。在單節點集群中,通常不需要此組件。
# calico-flannel-migration-controller.tar, calico-pod2daemon.tar, calico-dikastes.tar, calico-key-cert-provisioner.tar:這些組件主要適用于特定需求或遷移場景,在標準單節點集群部署中通常是不必要的。
# 列出所有可用的命名空間
ctr namespaces list
# 下載上面提供的 Calico 3.28.4,解壓縮
tar -xzvf calico-3.28.4.tar.gz
# 將必選的三個鏡像導入到 containerd 中
# 只在 master 導入就可以
ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-node.tar
ctr -n k8s.io images import calico-kube-controllers.tar
# 執行
kubectl apply -f calico.yaml
4、crictl 常用命令
# crictl 是 Kubernetes 容器運行時接口(CRI)的命令行工具,用于與支持 CRI 的容器運行時(如 containerd 或 CRI-O)交互。它可以在 Kubernetes 環境中調試和管理容器、鏡像和 Pod
# crictl 全稱可以理解為 Container Runtime Interface Control
# 1、鏡像管理
# 拉取鏡像
crictl pull <image-name>
# 示例:
sudo crictl pull docker.io/nginx:latest
# 列出本地鏡像
sudo crictl images
# 刪除鏡像
sudo crictl rmi <image-id>
# 2、容器管理
# 列出正在運行的容器
sudo crictl ps
# 列出所有容器(包括已停止的)
sudo crictl ps -a
# 啟動容器
sudo crictl start <container-id>
# 停止容器
sudo crictl stop <container-id>
# 刪除容器
sudo crictl rm <container-id>
# 查看容器日志
sudo crictl logs <container-id>
# 實時查看日志
sudo crictl logs -f <container-id>
5、kubernetes 證書續訂
# 檢查 API Server 證書有效期
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
# 檢查所有 kubeadm 證書
# ca 證書是 10 年,其它都是 1 年
[root@master ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Apr 23, 2026 09:03 UTC 364d ca no
apiserver Apr 23, 2026 09:03 UTC 364d ca no
apiserver-etcd-client Apr 23, 2026 09:03 UTC 364d etcd-ca no
apiserver-kubelet-client Apr 23, 2026 09:03 UTC 364d ca no
controller-manager.conf Apr 23, 2026 09:03 UTC 364d ca no
etcd-healthcheck-client Apr 23, 2026 09:03 UTC 364d etcd-ca no
etcd-peer Apr 23, 2026 09:03 UTC 364d etcd-ca no
etcd-server Apr 23, 2026 09:03 UTC 364d etcd-ca no
front-proxy-client Apr 23, 2026 09:03 UTC 364d front-proxy-ca no
scheduler.conf Apr 23, 2026 09:03 UTC 364d ca no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Apr 21, 2035 04:54 UTC 9y no
etcd-ca Apr 21, 2035 04:54 UTC 9y no
front-proxy-ca Apr 21, 2035 04:54 UTC 9y no
# 續訂所有證書
kubeadm certs renew all
# 重啟控制平面組件(靜態 Pod)
systemctl restart kubelet
五、部署 dashboard
# 下載 Dashboard v2.7.0 官方 YAML 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# image: kubernetesui/dashboard:v2.7.0 替換為
# image: registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.7.0
# image: kubernetesui/metrics-scraper:v1.0.8 替換為
# image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8
# 部署到集群
kubectl apply -f recommended.yaml
# 驗證 Pod 狀態
kubectl get pods -n kubernetes-dashboard
# 正常輸出應顯示 kubernetes-dashboard Pod 狀態為 Running:
[root@master ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-7c85965fd4-2ww7m 1/1 Running 0 26s
kubernetes-dashboard-7d8bbf6bb6-czqrc 1/1 Running 0 26s
# kubectl edit 命令并不會直接編輯一個文件,
# 而是通過臨時打開一個文本編輯器(比如 vi、nano 或系統默認的編輯器)來修改 Kubernetes 集群中存儲的對象配置。
# 這些對象的數據實際上存儲在 Kubernetes 的 etcd 數據庫中,而不是以文件的形式存儲在本地。
# 修改 SVC 訪問模式,目的是為了從集群外部訪問 Kubernetes Dashboard 服務
# 將ClusterIP改為NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 查看 SVC 訪問模式是否修改
# svc 是 Service 的簡稱,沒修改之前 TYPE 全都是 ClusterIP
[root@master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.108.39.200 <none> 8000/TCP 3m47s
kubernetes-dashboard NodePort 10.105.95.211 <none> 443:31950/TCP 3m47s
# 創建 dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard # 必須與 Dashboard 所在的命名空間一致
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin # 賦予集群管理員權限
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 應用配置
kubectl apply -f dashboard-admin.yaml
# 獲取 Token 登錄 Dashboard
kubectl -n kubernetes-dashboard create token admin-user
# 訪問 dashboard,獲取 Token 即可登錄查看
https://192.168.31.106:31950
六、部署項目
1、獲取 kubernetes 集群可用的鏡像
# 在 docker harbor 服務器上拉取一個 nginx 鏡像,然后上傳到 docker harbor
# 登錄到私有鏡像倉庫,輸入賬號密碼
docker login i.dd.com:443
# 拉取 nginx:latest 鏡像到本地
docker pull nginx:latest
# 為本地的 nginx:latest 鏡像創建一個新的標簽(tag),并將其標記為私有鏡像倉庫的路徑
docker tag nginx:latest i.dd.com:443/nginx/nginx:1.0
# 將本地標記為 i.dd.com:443/nginx/nginx:1.0 的鏡像推送到私有鏡像倉庫
docker push i.dd.com:443/nginx/nginx:1.0
2、存儲訪問私有 Docker Harbor 鏡像倉庫的認證信息
# master 節點創建docker registry secret
kubectl create secret docker-registry tt \
--docker-server=i.dd.com:443 \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-email=jcn@example.com
# 列出命名空間中的所有 Secret:
kubectl get secrets
# 如果你想要查看特定命名空間中的 Secret,請加上 -n 參數
kubectl get secrets -n <namespace>
# 查看 secret 詳細信息
kubectl get secret tt --output=yaml
3、配置 nginx-test.yaml
# 新建一個 nginx-test.yaml 文件,放到 master 節點根目錄下,內容如下
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: i.dd.com:8443/nginx/mynginx:1.0
ports:
- containerPort: 80
imagePullPolicy: Always
env:
- name: ENVIRONMENT
value: "production"
imagePullSecrets:
- name: tt
---
# Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30001
---
# Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 根據 CPU 利用率自動擴展或縮減副本數
4、將 Harbor 中的測試項目 nginx 部署到集群中
# 將資源配置應用到 Kubernetes 集群中
kubectl apply -f nginx-test.yaml
# 查看 pod,也可以登陸 dashboard 查看
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-5dfc977c65-7kmnf 1/1 Running 0 15s
nginx-deployment-5dfc977c65-7lmhp 1/1 Running 0 15s
# 瀏覽器訪問 http://IP:30001 即可查看項目 nginx-test