1 使用kubeadm部署Kubernetes
如無特殊說明,以下操作可以在所有節點上進行。
1.1 首先我們需要配置一下阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
1.2 開始安裝
執行以下命令開始安裝,可以預設安裝也可以指定版本安裝,目前的最新版本是1.24.1,預設即安裝此版本。
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
或
yum install kubelet kubeadm kubectl
1.3 安裝後檢視版本
kubeadm version
1.4 設定kubelet開機啟動
systemctl enable --now kubelet
1.5 初始化kubeadm配置資訊
kubeadm config print init-defaults >kubeadm-init.yaml
如上圖所示,可以看出image倉庫位置在k8s.gcr.io,為了防止拉取報錯,可以配置成阿里雲地址,定製出的config內容主要做了如下修改:
- imageRepository為阿里雲的registry
- 設定kubelet的cgroupDriver為systemd
- 設定kube-proxy代理模式為ipvs
apiVersion: kubeadm.k8s.io/v1beta3
mode: ipvs # kube-proxy 模式
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
cgroupDriver: systemd # 配置 cgroup driver
localAPIEndpoint:
advertiseAddress: 192.168.183.133 # ip地址
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: nodea
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 阿里源
kind: ClusterConfiguration
kubernetesVersion: 1.24.1
networking:
dnsDomain: cluster.local
serviceSubnet: 10.1.0.0/12
podSubnet: 10.88.0.0/16 # ip網段
scheduler: {}
詳細的配置說明可以參考該文件:https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/
1.6 拉取依賴映象
在開始初始化叢集之前,可以預先在各個伺服器節點上拉取所k8s需要的如下容器映象:
- kube-apiserver:v1.24.0
- kube-controller-manager:v1.24.0
- kube-scheduler:v1.24.0
- kube-proxy:v1.24.0
- pause:3.7
- etcd:3.5.3-0
- coredns:v1.8.6
kubeadm config images pull --config kubeadm-init.yaml
2 Master節點操作
2.1 叢集初始化
kubeadm init --config kubeadm-init.yaml
初始化過程中,可能會遇到“/proc/sys/net/bridge/bridge-nf-call-iptables does not exist”的錯誤,這是因為之前配置的br_netfilter沒有啟動,執行一下這個命令即可
modprobe br_netfilter
如果一切正常,則會遇到如下提示,
以及最重要的token
2.2 配置常規使用者使用kubectl訪問叢集
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.3 儲存配置檔案
kubectl -n kube-system get cm kubeadm-config -o yaml
2.4 檢視節點狀態
kubectl get node
3 Node節點操作
3.1 加入叢集
kubeadm join 192.168.183.133:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9ec147b59acdd7ac4f6d3b7b5bf378cf46535aa77117878d49e926a638eaf307
出現如下資訊,則說明Node節點已經成功加入到叢集
執行如下命令,發現網路報錯
kubectl get nodes
出現如上錯誤,我是把master節點上的admin.conf同步到兩個node節點裡,不知道大家是如何解決這個問題的。
在master節點做如下操作
scp /etc/kubernetes/admin.conf node02:/etc/kubernetes/
scp /etc/kubernetes/admin.conf node02:/etc/kubernetes/
```bash
![](https://img2022.cnblogs.com/blog/533598/202206/533598-20220616211924626-864940578.png)
在兩個節點上同時執行如下命令:
```bash
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config
3.2 安裝網路外掛
我們有兩種選擇,一個是Flannel,另一個是Calico
由CoreOS開發的專案Flannel,可能是最直接和最受歡迎的CNI外掛。它是容器編排系統中最成熟的網路結構示例之一,旨在實現更好的容器間和主機間網路。許多常見的Kubernetes叢集部署工具和許多Kubernetes發行版都可以預設安裝Flannel。
Calico是Kubernetes生態系統中另一種流行的網路選擇。雖然Flannel被公認為是最簡單的選擇,但Calico以其效能、靈活性而聞名。Calico的功能更為全面,不僅提供主機和pod之間的網路連線,還涉及網路安全和管理。Calico CNI外掛在CNI框架內封裝了Calico的功能。
此處我們使用Flannel外掛。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
下載後需要修改裡面的配置,首先設定一下網路卡
- 其次需要設定一下網段,這裡的網段和 1.5 步驟中的podSubnet的值保持一直,都是
- 10.88.0.0/16
執行命令
kubectl apply -f kube-flannel.yml
做出瞭如上操作之後還不行,還是會報錯,主要是CNI版本相容性問題,如圖
這裡可以把containerd中的CNI去除掉
mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
systemctl daemon-reload
systemctl restart containerd kubelet
3.3 叢集驗證
kubectl get cs
kubectl get nodes
再執行一下如下命令,檢視是否所有的pod都是執行正常的:
kubectl get pod --all-namespaces -o wide
3.4 驗證DNS解析
- 建立busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
kubectl create -f busybox.yaml
- 驗證一下狀態
kubectl get pods busybox
- DNS檢查
kubectl exec -i -t busybox -- nslookup kubernetes.default
經過一系列排錯後,再次執行如下命令:
kubectl exec -i -t busybox -- nslookup kubernetes.default
目前的操作只是練手而已,想要搭建高可用的叢集任重道遠,需要投入更多精力。
參考連結
http://www.manongjc.com/detail/25-lioggelnywerjyf.html
https://www.kubernetes.org.cn/1904.html
https://www.toutiao.com/article/7105957860210819623/
https://i4t.com/5451.html
https://blog.frognew.com/2022/05/kubeadm-install-kubernetes-1.24.html