環境
我們先用 macOS Catalina 10.15.2 來做筆記喔
1. 虛擬機
一開始當然是虛擬機啦,讓我們用 vagrant 搭配 virtual box 吧~
1.1 安裝 vagrant 跟 virtual box
brew cask install vagrant
vagrant version
vagrant 使用版本 2.2.10
支援的 virtual box 版本沒有到最新的 6, 我們到這邊下載舊版吧
https://www.virtualbox.org/wiki/
如果 mac 不給你開的話,記得可以到
系統偏好設定
>安全性與隱私
>一般
開啟權限
1.2 設定 vagrant
第一步要先建立一個 Vagrantfile,我們選用 ubuntu 16.04 TLS
這邊也有更多選擇 –> https://app.vagrantup.com/boxes/search
# 先在你喜歡的地方開個資料夾吧
mkdir -p ~/projects/vagrant/k8s-master
cd ~/projects/vagrant/k8s-master
vim Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
# 選用的檔案,xenial 是 ubuntu16 的名字
config.vm.box = "ubuntu/xenial64"
# 將虛擬機內部的 6443 port 導出到本機的 26443 port
# config.vm.network "forwarded_port", guest: 6443, host: 26443
config.vm.network "private_network", ip: "172.16.16.100"
# 分配 2GB 的記憶體給虛擬機
config.vm.provider "virtualbox" do |vb|
v.name = "k8s-m1"
vb.memory = 2048
vb.cpus = 2
end
# 設定帳號密碼是 ubuntu:ubuntu
config.vm.provision 'shell', inline: <<-SHELL
echo 'ubuntu:ubuntu' | sudo chpasswd
SHELL
end
1.3 用 vagrant 啟動虛擬機
設定好後就開起來連進去吧
vagrant up
vagrant ssh
2. 安裝 kubernetes server
2.1 安裝 container 服務
最重要的,我們要先裝 docker » 我是指南
## 進入 super user 模式來安裝
sudo su
## 以下開始安裝 Docker CE
## Set up the repository:
## Install packages to allow apt to use a repository over HTTPS
apt-get update -y && apt-get install -y \
apt-transport-https ca-certificates curl software-properties-common
## Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
## Add Docker apt repository.
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
## Install Docker CE.
apt-get update -y && apt-get install -y \
containerd.io=1.2.10-3 \
docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)
## Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
systemctl daemon-reload
systemctl restart docker
# If you want the docker service to start on boot, run the following command:
sudo systemctl enable docker
2.2 安裝 kubernetes
我們需要 kubelet、 kubeadm 和 kubectl » 指南
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 禁用 swap
swapoff -a; sed -i '/swap/d' /etc/fstab
# 更改網路設定
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2.3 kubernetes master 之 kubeadm
連線回來後記得切換回 super user
vagrant ssh
# 這時候可以看到 hostname 已經變成 k8s-m1
sudo su
這邊簡單選用默認的 Flannel 實作 pod 與 pod 間溝通的介面~
kubeadm only supports Container Network Interface (CNI) based networks
kubeadm init \
--apiserver-advertise-address=172.16.16.100 \
--pod-network-cidr=172.16.0.0/16
等待個 2~3 分鐘
成功後會提示你以下訊息! 就表示成功了
Your Kubernetes control-plane has initialized successfully!
## 讓 user 可以連線到 k8s cluster
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
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
## 加入 node 到 cluster,複製起來晚點開好其他 node 後要用
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.15:6443 --token 3vex22.6kqkhji310d3ckp0 \
--discovery-token-ca-cert-hash sha256:cb8bb2fde074ba2a294413122a5a9208479b12a73ec316c01bd9a8b485add2fa
先跑個他提示的訊息,讓 user 可以連線到 cluster
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.4 安裝 kubernetes 網路介面
接下來要為我們的 k8s cluster 建立 pod network,他的工作是負責跟 Container 連線,他們各自有實作 CNI( Container Network Interface),詳細可以來參考Kubernetes網絡模型列表
這裡我們選擇官方偷偷推薦的 Calico
(CentOS 的 Flannel
也很多人用)
kubectl create -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
2.5 image 存起來才可以複製好多個
回到本地端 vagrant 的資料夾,把目前的狀態打包起來
給想要有很多台 master 的你~~
vagrant package --output k8s-master.box
2.6 讓 master 可以用於部署
在預設情況下,為了安全和穩定性,master node 會被隔離開來,不允許部署 Pod 上去
但是如果你要做單節點的話~~
kubectl taint nodes --all node-role.kubernetes.io/master-
3. 安裝 kubernetes worker
3.1 Vagrant 啟動檔案
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
NodeCount = 4
(1..NodeCount).each do |i|
config.vm.define "k8s-w#{i}" do |node|
node.vm.box = "ubuntu/xenial64"
node.vm.hostname = "k8s-w#{i}"
node.vm.network "private_network", ip: "172.16.16.10#{i}"
node.vm.provider "virtualbox" do |v|
v.name = "k8s-w#{i}"
v.memory = 2048
v.cpus = 1
end
node.vm.provision 'shell', inline: <<-SHELL
echo 'ubuntu:ubuntu' | sudo chpasswd
SHELL
end
end
end
3.2 安裝步驟
2.1
2.2
vagrant 開多台vm時,連線回去要加上名字:
vagrant ssh k8s-w1
3.3 加入 kubernetes cluster
到 master 機器上拿到加入 cluster 的指令
kubeadm token create --print-join-command
再回來 worker 機器上,使用 sudo 加入節點後貼上剛才拿到的指令
sudo su
kubeadm join 172.16.16.100:6443 --token 7fz9ob.a6sno93d0zwcz3v9 --discovery-token-ca-cert-hash sha256:cb8bb2fde074ba2a294413122a5a9208479b12a73ec316c01bd9a8b485add2fa
回到 master
kubectl get nodes
以上 k8s 架設就大功告成了,把 master 的 ~/.kube/config
複製一份回到本地端就可以用 local 端拜訪囉~
Reference
https://rickhw.github.io/2019/03/17/Container/Install-K8s-with-Kubeadm/ https://zhuanlan.zhihu.com/p/31398416 https://www.vagrantup.com/docs/providers/virtualbox https://www.youtube.com/watch?v=mMmxMoprxiY 更換 master IP https://github.com/kubernetes/kubeadm/issues/338