Kubernates 雖然很火紅,但是到現在安裝仍非常不容易,網路上、書上寫的安裝程序,照著做要一次就成功不容易,多半會遇到一些問題需要解決。這裡整理的是我最近成功安裝的步驟,照著做是否一定會成功呢? 短期內沒問題,長期來說就又不確定了,因為 Kubernetes 發展的太快,會一直有變化。
- 兩台電腦,都是 CentOS 7,ip 及 hostname 分別為 192.168.0.110 / master-node、192.168.0.106 / worker-node。
為了讓兩台電腦可以互通,先在兩台電腦的 /etc/hosts 中加入如下內容: 192.168.0.110 master-node
192.168.0.106 worker-node
- Docker version 19.03.5
- Kubernates version 1.17.2
- 將作業系統裡的套件更新到最新
yum update
- 移除舊版 docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安裝相依的套件
yum install -y yum-utils device-mapper-persistent-data lvm2
- 設定要使用的 docker repository
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安裝 docker
yum install docker-ce docker-ce-cli containerd.io
這樣會安裝最新版的 docker。
- 啟動 docker
systemctl start docker
- 設定成自動啟動
systemctl enable docker
這樣設定,每次開機服務會自行動動。
- 設定 cgroup-driver
編輯 /etc/docker/daemon.json,內容如下,如果沒有這個檔案,直接創建一個。 {
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
最重要的是把 native.cgroupdriver 設為 systemd,後面安裝 K8s 時,也要調整相關設定,否則安裝會失敗。
- 重啟 docker
systemctl daemon-reload
systemctl restart docker
- 設定環境
setenforce 0
sed -i 's@SELINUX=enforcing@SELINUX=disabled@' /etc/sysconfig/selinux
swapoff -a
Kubernetes 基於效能的理由,規定 swap 要關閉,所以要如上設定,設定好要檢查 /etc/fstab,看看最後一行有沒有加上 #,如果沒有加上註解,就自行加上去,這樣重開機後 swap 才不會又被打開。
- 關閉防火牆
systemctl disable firewalld && systemctl stop firewalld
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
modprobe br_netfilter
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
sysctl -p
lsmod | grep br_netfilter
也可以只關閉 Kubernetes 會用到的防火牆,但是,port 很多,這裡直接把防火牆關閉,方便後面的設定。
- 設定 Kubernates 的 repository
檢查一下 /etc/yum.repos.d/kubernetes.repo 的內容是否如下? 沒有這個檔案可以自行新增。 [kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
- 安裝 Kubernates
yum install kubelet-1.17.2 kubectl-1.17.2 kubeadm-1.17.2 --nogpgcheck --disableexcludes=kubernetes
在 cluster 環境,master 及每一個 node 都要有 kubeadm。
- 設定 cgroup-driver=systemd
在 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 中加入 KUBERLET_CGROUP_ARGS 參數,並將這個參數加入啟動的參數中,內容如下: [Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_CGROUP_ARGS $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS
- 啟動 kubelet
systemctl daemon-reload
systemctl restart kubelet.service
啟動後沒有成功的話,也不一定會出現明顯的錯誤訊息,要使用如下指令看一下,是否出現 active (running)。 systemctl status -l kubelet.service
- master 初始化
kubeadm init --apiserver-advertise-address=192.168.0.110 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.17.2 --cri-socket="/var/run/dockershim.sock" --ignore-preflight-errors all
這段訊息很重要, 先照著上一個框的三個指令做,下面的框中的指令則是 worker-node 要加入 cluster 的指令,先執行這三個指令。 mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 安裝通用的 flannel容器網路介面CNI(Container Network Interface)元件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
這樣 master node 大功告成了!!
worker node 和 master node 的安裝差不多,先在 worker node 上重複上面 docker 的安裝及 Kubernetes 安裝的第 1~6 步驟,接著執行如下指令:
kubeadm join 192.168.0.110:6443 --token pwwfr9.9w1dn0lq70mraguk --discovery-token-ca-cert-hash sha256:4dcad4f89e0fd0246e8d19efd49d35d6c0f77e9481a6a999536a4775cc217024
過個兩分鐘,應該就可以加入 cluster,如何驗證? 回到 master node 上,執行如下指令,可以看到 Kubernetes 有兩個 node。
kubectl get nodes
沒有留言:
張貼留言