--- tags: 套件部署, Kuberentes GA: UA-79596126-4 title: Kuberentes部署與安裝 --- {%hackmd BJrTq20hE %} ###### 作者: 史啜林 ###### 撰寫日期:2020/12/24 # Kuberentes 部署安裝 關於K8s的部署網路上已經有很多很多的教學與說明了,這邊不特別細部解釋跟說明,以下流程是經過驗證並可以正常使用的環境。 (最主要會打這篇是因為公司的雲太爛了,所以只好自己弄一個k8s環境來跑我的區塊鏈實驗QAQ) 我的架構如下圖所示 ![](https://i.imgur.com/jsIJQZy.png) ### 實驗環境 - Ubuntu 20.04 - docker 19.03.8 - kubectl 1.20.1 - kubeadm 1.20.1 - kubelet 1.20.1 ### Step 1: Delete SWAP 在安裝 k8s 前,必須把所有 node 的 swap disable 。 ```bash $ sudo swapoff -a $ sudo vim /etc/fstab # /swapfile ... ... ``` ![](https://i.imgur.com/pGLK7nr.png) ### Step 2: Install docker 安裝方式有很多種,這裡採用apt套件 ```bash $ sudo apt-get -y install docker-compose $ sudo usermod -aG docker ${USER} --------------- logout & login --------------- $ docker version ``` ![](https://i.imgur.com/HzhIFfD.png) ### Step 3-1: Install Kubectl Kubeadm Kubelet 首先在所有節點安裝下面指令 ```bash $ sudo apt-get update && sudo apt-get install -y apt-transport-https curl $ curl -O https://packages.cloud.google.com/apt/doc/apt-key.gpg $ sudo apt-key add apt-key.gpg $ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" $ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl ``` 安裝完後,確認版本 ```bash $ kubectl version $ kubeadm version $ kubelet --version ``` 控制版本,將 kubelet、kubeadm、kubectl mark 起來,不要讓 Node 自己升級並且順便取得需要的image ```bash $ sudo apt-mark hold kubelet kubeadm kubectl $ kubeadm config images pull ``` ### Step 3-2 : 在 master 中初始化 kubeadm 此處可以指定 Pod 以及 Service 的 CIDR IP,當然也可以走 default (因為預設 Pod 跟 Service 都是 10.X.X.X,跟公司的內網相同,一個不小心就繞道公司的路由去了,會回不來XD) ```bash $ sudo kubeadm init --pod-network-cidr 172.17.0.0/16 --service-cidr 172.16.0.0/16 ``` 完成後會看到類似如下結果 (token每次產生都不同) ```bash Your Kubernetes control-plane has initialized successfully! 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 Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf 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/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.131.4:6443 --token f9bvtp.zfurci0tw593y4bu \ --discovery-token-ca-cert-hash sha256:581d22b40c315129632cba6f16508dd82a6f5fc0d2ed9492391dddf00ae4af50 ``` --- #### 不一定執行,可以一直以來都用 root 來做 因為使用k8s指令會需要透過root權限,因此可以透過以下指令讓一般使用者不須需oot權限也可以進行操作 ```bash $ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` --- 透過下述指令,master node的Status 會顯示 NotReady ,這是因為還沒安裝 CNI。 ```bash $ kubectl get nodes ``` ![](https://i.imgur.com/xqTaUeW.png) 看一下目前現有的 pods 有哪些。 ```bash $ kubectl get pods -n kube-system ``` ![](https://i.imgur.com/vrlWXvN.png) 可以發現coredns也都還處於pending狀態 ### Step 4: Install CNI 接著安裝 CNI ,此處使用的是 Calico ,因為這是官方建議的 ```bash $ curl https://docs.projectcalico.org/manifests/calico.yaml -O ``` :::info :bulb: **注意**: 在 apply calico.yaml 前,如果你有意變更 Pod CIDR 的 IP 的話,請修正3644行的指令,將其填上你 init 的 Pod CIDR IP ::: ![](https://i.imgur.com/3kVh6ko.png) ```bash $ kubectl apply -f calico.yaml $ kubectl -n kube-system get pod -w ``` 安裝的過程中,因為指令 kubectl -n kube-system get pod -w 的關係,可以看到 container 逐漸被啟動 ![](https://i.imgur.com/wTadcNS.png) ### Step 5: Apply cluster node 在每個想加入的 worker 中輸入上述產生的 token ```bash $ sudo kubeadm join 192.168.131.4:6443 --token f9bvtp.zfurci0tw593y4bu \ --discovery-token-ca-cert-hash sha256:581d22b40c315129632cba6f16508dd82a6f5fc0d2ed9492391dddf00ae4af50 ``` 完成後如下圖 ![](https://i.imgur.com/XAMbvZl.png) ![](https://i.imgur.com/IHo5OUW.png) ![](https://i.imgur.com/4pkZu7l.png) 此時稍等一下,讓他們彼此溝通,你可以去泡個茶、尿個尿或是去買可不可!! 之後在 master node 上查看是否所有節點均完成 ```bash $ kubectl get nodes ``` ![](https://i.imgur.com/XOlZBjt.png) 查看目前有的元件服務細節 ```bash $ kubectl -n kube-system get all ``` ![](https://i.imgur.com/eRXb4u6.png) 這樣便完成了一個熱騰騰的 k8s 環境~!! 請享用!! # Kuberentes 節點新增 k8s 方便的除了 container 的管理之外,橫向擴展也相對容易,這邊我們來示範新增一個節點的步驟 首先看看目前有的節點 ``` kubectl get nodes ``` ![](https://i.imgur.com/NVHEKOJ.png) 接著我們先啟動預計新增的節點,一樣該裝的套件都要先裝好!! 完成後先看看我們的 token 是甚麼 ``` kubeadm token create --print-join-command ``` ![](https://i.imgur.com/2miFkaT.png) 接著切換到預計新增的節點的 host,將 token 的指令貼上 ``` kubeadm join 192.168.131.4:6443 --token kdpege.pevvw5qtat3nhihb --discovery-token-ca-cert-hash sha256:581d22b40c315129632cba6f16508dd82a6f5fc0d2ed9492391dddf00ae4af50 ``` ![](https://i.imgur.com/YovXZ0D.png) 完成後我們在切回去看看 master 的節點狀態,可以發現我們剛剛加入的節點,但他現在會處於 NotReady 的狀態,大概過個幾分鐘就會跳回 Ready 的狀態了 ![](https://i.imgur.com/SEgSeHP.png) ![](https://i.imgur.com/429XFZz.png) 接著記得更新一下自己的 /etc/hosts 的設定 (如果有設定 DNS 的話就不用了喔!)