Rocky Linux 下載地址:https://dl.rockylinux.org/vault/rocky/
這里使用的鏡像是 Rocky-9.0-x86_64-minimal.iso
一、環境準備
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
# 查看防火墻狀態
firewall-cmd --state
# 關閉selinux
修改配置文件/etc/selinux/config
SELINUX=disabled
setenforce 0
# 禁用swap
# swap 是指計算機系統中用于虛擬內存管理的一種技術,通常在物理內存(RAM)不足時,將一部分數據暫時交換到硬盤上的一塊稱為 swap 分區或 swap 文件的存儲空間中,以釋放物理內存供其他程序使用。
# 在容器化環境中,特別是使用 Kubernetes 管理容器的集群中,禁用 swap 是推薦的做法。Kubernetes 和容器通常需要嚴格的內存管理,而 swap 的使用可能會導致不可預測的行為。因此,禁用 swap 可以確保容器在物理內存不足時更可靠地受限而不會頻繁地使用 swap。
# 臨時關閉
swapoff -a
# 永久關閉,編輯 /etc/fstab 文件,找到包含 swap 的行(如果有的話),并在行首添加 # 來注釋掉該行
sed -ri 's/.*swap.*/#&/' /etc/fstab
bridge(橋接) 是 Linux 系統中的一種虛擬網絡設備,它充當一個虛擬的交換機,為集群內的容器提供網絡通信功能,容器就可以通過這個 bridge 與其他容器或外部網絡通信了。
# 配置內核轉發及網橋過濾
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
vm.swappiness = 0
EOF
參數解釋:
net.bridge.bridge-nf-call-ip6tables=1:啟用 IPv6 的網絡地址轉換(NAT)功能,允許 iptables 調用 ip6tables 進行 IPv6 數據包的處理。
net.bridge.bridge-nf-call-iptables=1:啟用 iptables 的網絡地址轉換(NAT)功能,允許 iptables 進行網絡數據包的處理和轉發。
net.ipv4.ip_forward=1:啟用 Linux 內核的 IP 轉發功能,允許 Linux 主機作為一個路由器來轉發 IP 數據包。
vm.swappiness=0:將內核對交換空間(swap)的使用降到最低,更多地保留內存于物理內存中,而不是交換到磁盤上的交換空間。
由于開啟bridge功能,需要加載br_netfilter模塊來允許在bridge設備上的數據包經過iptables防火墻處理
# 加載 br_netfilter模塊
modprobe br_netfilter
# 使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
# 查看是否加載成功:
lsmod | grep br_netfilter
#會輸出以下內容
br_netfilter 32768 0
bridge 303104 1 br_netfilter
二、Docker
# 使用 dnf 工具自動安裝 yum-utils 軟件包
dnf install -y yum-utils
# 添加阿里云docker-ce倉庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝docker軟件包
dnf install -y docker-ce-20.10.15-3.el9.x86_64
# 啟用Docker Cgroup用于限制進程的資源使用量,如CPU、內存資源
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 設置 docker 開機自啟
systemctl enable docker
# 啟動 docker
systemctl start docker
# 查看 docker 狀態
systemctl status docker
# 輔助命令
# 列出當前系統中所有可安裝的 docker-ce 版本,并按照版本號從高到低進行排序,同時顯示重復的版本。
dnf list docker-ce --showduplicates | sort -r
三、Kubernetes
# 配置 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
# 安裝 Kubernetes 相關組件的指定版本(1.23.0)在系統中,以便準備好在你的系統上部署和管理 Kubernetes 集群
● kubeadm:用于初始化集群,并配置集群所需的組件并生成對應的安全證書和令牌;
● kubelet:負責與 Master 節點通信,并根據 Master 節點的調度決策來創建、更新和刪除 Pod,同時維護 Node 節點上的容器狀態;
● kubectl:用于管理k8集群的一個命令行工具;
dnf install -y --nogpgcheck kubeadm-1.23.0-0 kubelet-1.23.0-0 kubectl-1.23.0-0
# kubelet啟用Cgroup控制組,用于限制進程的資源使用量,如CPU、內存
tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
# 設置kubelet開機自啟動即可,集群初始化后自動啟動
systemctl enable kubelet
# 在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
# 通過配置文件初始化集群
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.0.1: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,master 3m31s v1.23.0
node1 NotReady <none> 12s v1.23.0
node2 NotReady <none> 89s v1.23.0
# 如果哪個節點出現問題,可以使用下列命令重置當前節點后再執行加入集群的命令
kubeadm reset
# 在 maste 節點執行,獲取子節點加入集群令牌,將輸出命令直接在 node 節點執行
kubeadm token create --print-join-command
部署 calico
# calico-3.24.1.yaml
鏈接:https://pan.baidu.com/s/1sHvsBqfjgvmYizNQA5nnaA
提取碼:6c3g
# calico-v3.24.1-img.tar.gz
鏈接:https://pan.baidu.com/s/1vqVHQtJB37TwYf9sTK4_rw
提取碼:k1uy
# 將上面兩個文件拷貝到根目錄下
# master節點執行
kubectl apply -f calico-3.24.1.yaml
# master 和 node 節點都需要執行
# 解壓縮
tar -xvf calico-v3.24.1-img.tar.gz
# 將鏡像加載到 Docker 本地鏡像庫中
docker load -i calico-cni-v3.24.1-img.tar
docker load -i calico-node-v3.24.1-img.tar
docker load -i calico-kube-controllers-v3.24.1-img.tar
# 查看Calico Pod狀態是否為Running
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-66966888c4-d5d5r 1/1 Running 0 6m28s
calico-node-8n9x2 1/1 Running 0 6m28s
calico-node-xffr5 1/1 Running 0 6m28s
coredns-65c54cc984-8t9nx 1/1 Running 0 30m
coredns-65c54cc984-ss6fw 1/1 Running 0 30m
# 驗證集群節點狀態,在 master 節點查看集群信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 25m v1.23.0
node1 Ready <none> 25m v1.23.0
node2 Ready <none> 24m v1.23.0
部署 dashboard
# 2.5.1 dashboard recommended.yaml
鏈接:https://pan.baidu.com/s/1uNy17qD0dTwDYPDuKdKKXA
提取碼:mobe
# master 節點執行
kubectl apply -f recommended.yaml
# 查看 Pod 狀態,確保 Pod 狀態都為 Running
kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6fdc7b6778-pmr4k 1/1 Running 0 56s
kubernetes-dashboard-7bcd78bd86-2tptp 1/1 Running 0 56s
# 查看 SVC
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.101.193.241 <none> 8000/TCP 89s
kubernetes-dashboard ClusterIP 10.111.110.38 <none> 443/TCP 90s
# 修改 SVC 訪問模式
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
將ClusterIP改為NodePort
# 再次查看 SVC
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.101.193.241 <none> 8000/TCP 3m29s
kubernetes-dashboard NodePort 10.111.110.38 <none> 443:31603/TCP 3m30s
# 根據輸出獲取端口是31603,使用火狐瀏覽器訪問 https://IP:31603
# 給 kubernetes-dashboard 賦值權限
kubectl create clusterrolebinding serviceaccount-cluster-admin --clusterrole=cluster-admin --user=system:serviceaccount:default:default
# 獲取 kubernetes-dashboard 登錄token,有過期時間,每次登錄都需要重新獲取
kubectl describe secret $(kubectl get secret -n kubernetes-dashboard | grep dashboard-admin | awk '{print $1}')
# 復制token填充,即可登陸dashboard
四、Harbor
# harbor-offline-installer-v2.10.3 下載地址
鏈接:https://pan.baidu.com/s/1M4S5H554vZQnPaMNP_8mRw
提取碼:mccg
# 上傳離線安裝包到服務器根目錄,解壓到 /data/ 目錄
tar -zxvf harbor-offline-installer-v2.10.3.tgz -C /data
# 復制一份 harbor.yml,只修改這一份
cp /data/harbor/harbor.yml.tmpl /data/harbor/harbor.yml
# 默認安裝的 Harbor 是通過不帶證書的 HTTP 協議提供服務。生產環境請一定配置 HTTPS。
# 這里直接配置https,證書使用的是阿里云的免費證書
# 將證書拷貝到 /data/harbor-cert 目錄下
# 配置 Harbor 組件內部通訊使用 TLS
# 為了使用生成 TLS 證書的工具,需要先導入離線鏡像
docker load -i /data/harbor/harbor.v2.10.3.tar.gz
# 使用 prepare 工具生成 TLS Certs 文件
docker run -v /data/harbor-cert:/hostfs goharbor/prepare:v2.10.3 gencert -p /internal/tls/cert -d 3650
# 官方文檔:https://goharbor.io/docs/2.10.0/install-config/configure-internal-tls/
cp /data/harbor-cert/internal/tls/cert/harbor_internal_ca.crt /data/harbor/common/config/shared/trust-certificates/
編輯 harbor.yml 文件
注意格式,尤其是縮進,不然會報錯
# Harbor 服務器的主機名或是 IP
hostname: i.dd.com
# 生產環境一定要使用 https
https:
# https 端口, 默認 443, 可根據實際環境修改。但是一定要與 external_url 參數的端口號一致
port: 8443
# Nginx 使用的 cert 和 key 文件(絕對路徑)
certificate: /data/harbor-cert/i.dd.com.pem
private_key: /data/harbor-cert/i.dd.com.key
# 啟用內部組件 TLS 通信
internal_tls:
enabled: true
dir: /data/harbor-cert/internal/tls/cert/
# 純內網使用不需要配置。如果 Harbor 需要通過防火墻或是其他方式轉發給外部訪問,需要配置此參數為外網 IP 或是外部域名。端口號一定要與 https.port 的端口號保持一致。
external_url: https://i.dd.com:8433
# Harbor admin 用戶的初始密碼,配置文件里可以不用改,但是部署完必須第一時間登錄 Harbor,更改密碼
harbor_admin_password: Harbor12345
# Harbor DB configuration
database:
# Harbor DB root 用戶的密碼, 必須修改.
password: OpsXlab2024!
# Harbor 數據存儲路徑
data_volume: /data/harbor-storage
# 運行安裝腳本
/data/harbor/install.sh
# 安裝成功后瀏覽器訪問 https://i.dd.com:8443
# 賬號:admin
# 密碼:Harbor12345
# 新建測試項目 nginx
# 登陸 Harbor
docker login i.dd.com:8443
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
# 上傳鏡像到測試項目 nginx
# 查看已有 image
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
# 重新打標簽
docker tag nginx:latest i.dd.com:8443/nginx/mynginx:1.0
# 上傳
docker push i.dd.com:8443/nginx/mynginx:1.0
五、部署項目
將 Harbor 中的測試項目 nginx 部署到集群中
新建一個 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: 8080
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 利用率自動擴展或縮減副本數
# master 節點創建docker registry secret
kubectl create secret docker-registry tt \
--docker-server=i.dd.com:8443 \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-email=jcn@example.com
# 將資源配置應用到 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 即可查看