基于 Rocky Linux 鏡像部署 kubernetes 集群

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 即可查看
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容