kubeadm是官方社區推出的一個用於快速部署kubernetes集羣的工具。

這個工具能通過兩條指令完成一個kubernetes集羣的部署:

# 創建一個 Master 節點$ kubeadm init# 將一個 Node 節點加入到當前集羣中$ kubeadm join <Master節點的IP和端口 >

1. 安裝要求

在開始之前,部署Kubernetes集羣機器需要滿足以下幾個條件:

· 一台或多台機器,操作系統麒麟V10

· 硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多

· 集羣中所有機器之間網絡互通

· 可以訪問外網,需要拉取鏡像

· 禁止swap分區

2. 準備環境

-----------------------------------

2. 準備環境


角色

ip


k8s-master01

11.0.1.131


k8s-node01

11.0.1.132


#關閉防火牆:
 systemctl stop firewalld
 systemctl disable firewalld

#關閉selinux:
 sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
 setenforce 0  # 臨時


#關閉swap:
 swapoff -a  # 臨時
# vim /etc/fstab  # 永久

#設置主機名:
 hostnamectl set-hostname k8s-master01  &&  bash
 #hostnamectl set-hostname k8s-node01 && bash
 #hostnamectl set-hostname k8s-node02  && bash

#在master添加hosts:
cat >> /etc/hosts << EOF
11.0.1.131 k8s-master01
EOF

 # 加載必要的模塊
sudo modprobe br_netfilter
sudo modprobe overlay
# 驗證模塊已加載
lsmod | grep br_netfilter
# 應該看到 br_netfilter 模塊


#將橋接的IPv4流量傳遞到iptables的鏈:
 cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl --system

配置時間同步
# CentOS/RHEL/麒麟
sudo yum install -y chrony

# 編輯配置文件
sudo vi /etc/chrony.conf

# 或直接修改
sudo tee /etc/chrony.conf <<-'EOF'
# 使用阿里雲 NTP 服務器(國內推薦)
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

# 或使用國內其他 NTP 服務器
server ntp.tuna.tsinghua.edu.cn iburst
server time.pool.aliyun.com iburst
server cn.pool.ntp.org iburst

# 允許同步的客户端網絡
# allow 192.168.0.0/16
# allow 10.0.0.0/8

# 本地時間源(如果外部服務器不可用)
local stratum 10

# 記錄時間調整
driftfile /var/lib/chrony/drift

# 啓用實時時鐘(RTC)同步
rtcsync

# 記錄統計信息
logdir /var/log/chrony
makestep 1.0 3
EOF

# 啓動服務
sudo systemctl enable --now chronyd

# 檢查狀態
sudo chronyc sources -v
sudo chronyc tracking

# 查看時間源統計
sudo chronyc sourcestats

# 手動同步
sudo chronyc -a makestep

安裝docker 、cri-docker、 kubeadm 、kubectl、kubelet 服務

# 安裝docker

2、安裝Docker

tar xf docker-26.1.4.tgz
chmod +x docker/*
mv docker/* /usr/bin/

配置啓動的服務
sudo tee /etc/systemd/system/docker.service <<-'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=containerd.service

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

[Install]
WantedBy=multi-user.target
EOF


#安裝cri-docker
tar xzvf cri-dockerd-0.3.9.amd64.tgz

# 安裝到系統
sudo cp cri-dockerd/cri-dockerd /usr/local/bin/
sudo chmod +x /usr/local/bin/cri-dockerd

# 驗證
/usr/local/bin/cri-dockerd --version


#配置啓動服務
sudo tee /etc/systemd/system/cri-docker.service <<-'EOF'
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=docker.service

[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF


# 啓動服務  systemctl restart docker && systemctl enable  docker
# 啓動服務  systemctl restart cri-docker && systemctl enable  cri-docker

#cat /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {"max-size": "100m"},
  "storage-driver": "overlay2",
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
# 啓動服務  systemctl restart docker && systemctl enable  docker
# 啓動服務  systemctl restart cri-docker && systemctl enable  cri-docker


# 安裝kubelet  、kubeadm 、kubectl 組件
tar -xf k8s1.tar 
rpm -i ./*.rpm
systemctl enable  kubelet


集羣的初始化

kubeadm init   --apiserver-advertise-address=11.0.1.148   --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.34.3  --service-cidr=10.96.0.0/12   --pod-network-cidr=10.244.0.0/16   --ignore-preflight-errors=all

拷貝kubectl使用的連接k8s認證文件到默認路徑

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

#查看node節點
kubectl get nodes
NAME           STATUS     ROLES           AGE   VERSION
k8s-master01   NotReady   control-plane   49m   v1.34.3


安裝網絡插件

[root@k8s-master01 ~]# kubectl apply -f cali-1.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
serviceaccount/calico-cni-plugin created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/tiers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/adminnetworkpolicies.policy.networking.k8s.io created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

安裝dashibo的web 頁面

kubectl apply -f dashboard-v2.0.3.yaml  

創建管理員賬户並獲取令牌

# 1. 創建具有管理員權限的ServiceAccount
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-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
EOF

# 2. 獲取登錄令牌(有效期1年)
kubectl -n kubernetes-dashboard create token admin-user --duration=8760h

創建 NodePort 服務(適合外部訪問)

# 創建NodePort服務暴露Dashboard
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard-external
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001  # 端口範圍30000-32767
  selector:
    k8s-app: kubernetes-dashboard
EOF

# 查看分配的端口
kubectl get svc -n kubernetes-dashboard kubernetes-dashboard-external