本地開發環境以 macOS 為例。
Github 倉庫地址:github.com/jxlwqq/kubernetes-examp...
安裝 VirtualBox 和 Vagrant
- 安裝 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-1
、k8s-2
和k8s-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-1
、k8s-2
和k8s-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-1
、k8s-2
和k8s-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-1
、k8s-2
和k8s-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-2
和k8s-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
參考
- Vagrant box centos/7
- Install Docker Engine on CentOS
- Installing kubeadm
- Configure the Docker daemon, in particular to use systemd for the management of the container’s cgroups
- Creating a cluster with kubeadm
- Cluster Networking
- 阿里雲 kubernetes yum 倉庫映象
- 讓 K8S 在 GFW 內愉快的航行
本作品採用《CC 協議》,轉載必須註明作者和本文連結