使用 kubeadm 建立 kubernetes 叢集 v1.21

jxlwqq發表於2021-05-07

本地開發環境以 macOS 為例。

Github 倉庫地址:github.com/jxlwqq/kubernetes-examp...

安裝 VirtualBox 和 Vagrant

啟動虛擬機器

虛擬機器配置了3臺,分別是 k8s-1(192.168.205.10)k8s-2(192.168.205.11)k8s-3(192.168.205.12)。配置詳見 Vagrantfile 這個檔案。

虛擬機器初始化的時候,已經幫助你安裝了 Docker 環境,詳見 config.vm.provision “shell” 中資訊。Vagrant 是用 Ruby 寫的,語法都是通用的,應該能看懂,看不懂也沒關係。

git clone https://github.com/jxlwqq/kubernetes-examples.git # clone 倉庫到本地
cd installing-kubernetes-with-deployment-tools # 進入這個目錄
vagrant box add centos/7 # 提前下載作業系統映象檔案,方便後續快速啟動
vagrant up # 啟動虛擬機器

登入虛擬機器

開3個命令列視窗,分別登入這3臺虛擬機器:

cd installing-kubernetes-with-deployment-tools # 一定要進入在 Vagrantfile 所在的目錄
vagrant ssh k8s-1 # 這臺作為 master
vagrant ssh k8s-2 # node
vagrant ssh k8s-3 # node

允許 iptables 檢查橋接流量

提示:在虛擬機器:k8s-1k8s-2k8s-3中執行命令。

確保 br_netfilter 模組被載入。這一操作可以通過執行 lsmod | grep br_netfilter 來完成。若要顯式載入該模組,可執行 sudo modprobe br_netfilter。

為了讓你的 Linux 節點上的 iptables 能夠正確地檢視橋接流量,你需要確保在你的 sysctl 配置中將 net.bridge.bridge-nf-call-iptables 設定為 1。如下:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

安裝 kubeadm、kubelet 和 kubectl

提示:在虛擬機器:k8s-1k8s-2k8s-3中執行命令。

使用阿里雲的映象進行安裝:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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

# 將 SELinux 設定為 permissive 模式(相當於將其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 關閉 swap
sudo swapoff -a

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

配置 cgroup 驅動程式

提示:在虛擬機器:k8s-1k8s-2k8s-3中執行命令。

配置 Docker 守護程式,尤其是使用 systemd 來管理容器的 cgroup:

sudo mkdir /etc/docker

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

sudo systemctl daemon-reload
sudo systemctl restart docker

驗證與 gcr.io 容器映象倉庫的連通性

提示:在虛擬機器:k8s-1k8s-2k8s-3中執行命令。

使用 kubeadm config images pull 驗證與 gcr.io 容器映象倉庫的連通性,不過會失敗。

我們通過拉取阿里雲的Docker映象倉庫,然後在打 Tag 的方式,來曲線解決這個問題。

node 節點上部分 image 是使用不到的,我們暫時就都一股腦的都 pull 下來。

kubeadm config images list # 檢視所需的映象

# 替換 kube-apiserver
sudo docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0 k8s.gcr.io/kube-apiserver:v1.21.0
sudo docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0

# 替換 kube-controller-manager
sudo docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0 k8s.gcr.io/kube-controller-manager:v1.21.0
sudo docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0

# 替換 kube-scheduler
sudo docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0 k8s.gcr.io/kube-scheduler:v1.21.0
sudo docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0

# 替換 kube-proxy
sudo docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0 k8s.gcr.io/kube-proxy:v1.21.0
sudo docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0

# 替換 pause
sudo docker pull registry.aliyuncs.com/google_containers/pause:3.4.1
sudo docker tag registry.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/pause:3.4.1
sudo docker rmi registry.aliyuncs.com/google_containers/pause:3.4.1

# 替換 etcd
sudo docker pull registry.aliyuncs.com/google_containers/etcd:3.4.13-0
sudo docker tag registry.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
sudo docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.13-0

# 替換 coredns
sudo docker pull coredns/coredns:1.8.0
sudo docker tag coredns/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
sudo docker rmi coredns/coredns:1.8.0

初始化 master 節點

提示:在虛擬機器:k8s-1中執行命令。

sudo kubeadm init --kubernetes-version=v1.21.0 --apiserver-advertise-address=192.168.205.10  --pod-network-cidr=10.244.0.0/16

根據返回的提示:設定:

# To start using your cluster, you need to run the following as a regular user:

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

最後返回 join 的資訊:

# Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.205.10:6443 --token g012n6.65ete4bw7ys92tuv
 --discovery-token-ca-cert-hash sha256:fdae044c194ed166f7b1b0746f5106008660ede517dd4cf436dfe68cc446c878

node 加入叢集

提示:在虛擬機器:k8s-2k8s-3中執行命令。

兩個引數 token 和 hash 的值替換成你自己叢集返回的值:

sudo kubeadm join 192.168.205.10:6443 --token g012n6.65ete4bw7ys92tuv \ --discovery-token-ca-cert-hash sha256:fdae044c194ed166f7b1b0746f5106008660ede517dd4cf436dfe68cc446c878

安裝 Pod 網路附加元件

提示:在虛擬機器:k8s-1中執行命令。

這裡選擇 flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

檢視 node 狀態

提示:在虛擬機器:k8s-1中執行命令。

kubectl get nodes

返回:

NAME STATUS   ROLES                          AGE   VERSION
k8s-1 Ready    control-plane,master          12m   v1.21.0
k8s-2 Ready    <none>                        12m   v1.21.0
k8s-3 Ready    <none>                        11m   v1.21.0

清場

銷燬虛擬機器:

vagrant destroy

參考

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章