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

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

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

1. 安裝要求

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

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

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

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

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

· 禁止swap分區

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

安裝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"
  ]
}



#安裝kubelet、kubeadm 、kubectl 服務
tar -xf  kube.tar 
rpm -i ./*.rpm
systemctl enable  kubelet

集羣初始化

kubeadm init   --apiserver-advertise-address=11.0.1.131  --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   --ignore-preflight-errors=all

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

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf 
$HOME/.kube/configsudo 
chown (id -g) $HOME/.kube/config#查看node節點
kubectl get nodes
NAME           STATUS     ROLES           AGE   VERSION   
k8s-master01   NotReady   control-plane   49m   v1.28.0

5. 加入Kubernetes Node

在11.0.1.132(Node)執行。

向集羣添加新節點,執行在kubeadm init輸出的kubeadm join命令:

#所有的node 節點執行kubeadm join 11.0.1.131:16443 --token 5s30j7.cp5rjrfcnwe6yn49 \        --discovery-token-ca-cert-hash sha256:225727afa50dabc8d80dd8a5f85d3b799bb7e6a64abedd14f3a8af1978fad854

默認token有效期為24小時,當過期之後,該token就不可用了。這時就需要重新創建token,操作如下:

$ kubeadm token create$ kubeadm token list$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924$ kubeadm join 11.0.1.143:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924

或者直接命令快捷生成:kubeadm token create --print-join-command

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

6. 部署容器網絡(CNI)

6.1 caclio

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network 

注意:只需要部署下面其中一個,推薦Calico。

Calico是一個純三層的數據中心網絡方案,Calico支持廣泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一個計算節點利用 Linux Kernel 實現了一個高效的虛擬路由器( vRouter) 來負責數據轉發,而每個 vRouter 通過 BGP 協議負責把自己上運行的 workload 的路由信息向整個 Calico 網絡內傳播。

此外,Calico 項目還實現了 Kubernetes 網絡策略,提供ACL功能。

https://docs.projectcalico.org/getting-started/kubernetes/quickstart 

curl https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/calico.yaml -O

下載完後還需要修改裏面定義Pod網絡(CALICO_IPV4POOL_CIDR),與前面kubeadm init指定的一樣

修改完後應用清單:

kubectl apply -f calico.yamlkubectl get pods -n kube-system

7. 部署 Dashboard

 7.1 插件為caclio 的k8s集羣web

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml默認Dashboard只能集羣內部訪問,修改Service為NodePort類型,暴露到外部:
$ vi recommended.yaml
...
kind: Service
apiVersion: v1metadata: 
labels:    
   k8s-app: kubernetes-dashboard  
   name: kubernetes-dashboard  
   namespace: kubernetes-dashboardspec:  
   ports:    
   - port: 443      
   targetPort: 8443      
   nodePort: 30001  
   selector:    
   k8s-app: kubernetes-dashboard 
   type: NodePort
   ...
   kubectl apply -f recommended.yaml
   kubectl get pods -n kubernetes-dashboardNAME                                         READY   STATUS    RESTARTS   AGEdashboard-metrics-scraper-6b4884c9d5-gl8nr   1/1     Running   0          13mkubernetes-dashboard-7f99b75bf4-89cds        1/1     Running   0          13m
訪問地址:https://NodeIP:30001
創建service account並綁定默認cluster-admin管理員集羣角色:
# 創建用户 kubectl create serviceaccount dashboard-admin -n kube-system# 用户授權 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin# 獲取用户Token kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
使用輸出的token登錄Dashboard