由於工作的需要, 手工部署一個 Kubernetes 環境(k8s)。(以前都是雲上搞定,拿來用)
習慣把這種工作記錄下來,自己備查也和別人分享
網上相關文章很多, 我也參考了很多,這里推薦一個 鏈接
https://www.kubernetes.org.cn/5462.html
可以基於這個鏈接做, 碰到問題了,再去查其它文章。 當然也可以基於我的文章。 強烈建議讀完全文再操作,尤其是最后的ps部分
------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 首先准備兩台機器 ubt 18.04 安裝好 docker
| 機器名 | IP | 作用說明 | |
| kube-master | 192.168.0.200 | k8 管理節點 | |
| node1 | 192.168.0.201 | k8 工作節點 |
怎么修改機器名,自己網上查去
hosts 文件為:
192.168.0.200 kube-master 192.168.0.201 node1
關閉防火牆,關閉swap 等
2. 兩個難點之一 , 安裝 kubelet kubeadm kubectl
因為訪問國外網絡慢,所以需要修改 apt-get 的訪問源
/etc/apt/sources.list 添加deb 行 deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
執行 apt-get update 執行 apt-get install -y kubelet kubeadm kubectl 需要 sudo 自己加 可能在 apt-get update 時會碰到 no pubkey ... 執行下面命令解決 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
kubelet kubeadm kubectl 安裝好了,工作完成了 1/3. kubelet 是k8相關服務,kubectl 是k8s 管理客戶端,kubeadm 是部署工具
3. 部署主(管理)節點
本來是執行
kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.200
一步完成, 但是由於國內的網絡環境,眾所周知的原因,不得不繞彎。兩難點之二
在執行 init 的時候 會向 k8s.gcr.io 獲取 kube-apiserver:v1.15.0 等 docker 鏡像, 但是 k8s.gcr.io 訪問不通。
所以,我們要從拉取 別人的鏡像, 然后改名, 再執行 kube init . 注意,一定要版本一致,今天是1.15, 明天可能是16 ,
列出需要哪些鏡像: command not found hylas@kube-master:~$ kubeadm config images list --kubernetes-version v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.3.10 k8s.gcr.io/coredns:1.3.1
拉取鏡像 docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0 docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0 docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0 docker pull mirrorgooglecontainers/kube-proxy:v1.15.0 docker pull mirrorgooglecontainers/pause:3.1 docker pull mirrorgooglecontainers/etcd:3.3.10 docker pull coredns/coredns:1.3.1
改名
docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0 docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0 docker tag mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0 docker tag mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0 docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
拉取完成后,執行 kubeadm init 。。。。。。。。。。。。。。。。。
成功標志, 出現: kubeadm join 10.10.10.10:6443 --token kekvgu.nw1n76h84f4camj6 \ --discovery-token-ca-cert-hash sha256:4ee74205227c78ca62f2d641635afa4d50e6634acfaa8291f28582c7e3b0e30e
如果沒有出現,就說明沒成功,根據錯誤反復弄。 使用 kubeadm reset 清除 kubeadm init 生成的垃圾, 有些文件可以用 rm -rf 刪除。
需要記錄這行內容: kubeadmin join ......
添加工作節點用到
執行:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
執行后 kubectl 環境有了,可以執行 kubectl nodes 看看了。 2/3 的工作量完成了。
4. 主節點生效
現在主節點還是沒用,需要搭建一個網絡給集群用。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
執行上面的命令搭建 flannel , k8s有很多網絡選擇。 有興趣的自己研究。
網絡搭建完成后,執行剛才保存下來的
kubeadm join ....................
執行完成后kubectl get nodes 可查看到
hylas@kube-master:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready master 8h v1.15.1 node1 Ready <none> 5h v1.15.1
kube-master ready , node1 是看不到的
5. 添加 node1 工作節點,
在 192.168.0.201 機器上 安裝 kubelet kubeadm kubectl 執行 kubeadm join .....
不需要執行 init 和網絡
完成后 執行 kubectl get nodes 就能看到 上面這個圖了。 恭喜,你的k8s 集群就已經完成了,以后可以增加節點,減少節點。
6. 創建一個 helloword 應用,看看效果
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort
用kubectl 部署, 用 kubectl get nodes, get pods , get cs 查看集群服務狀態
打開瀏覽器: 192.168.0.200:80 看你的hello word , 大功告成。
3/3 工作完成 文章完結 。
補充:
需要關閉 swap
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
#關閉磁盤交換 很重要必須執行
sudo swapoff -a
ps2:
形成第二個 join
kubeadm token create openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //' kubeadm join 10.4.37.24:6443 --token 4lqozr.xyawinzvspo4zha7 --discovery-token-ca-cert-hash sha256:b6ecd6ad73e072f2290a14213e32b681cd41c9010a9403bb32e1e213f7c167d2
ps3:
強烈建議安裝 docker.io 18.09.8 版本
ps4:
解決pod不能訪問外網問題
執行
iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F iptables -L -n iptables -t nat -I POSTROUTING -s 192.244.3.0/24 -j MASQUERADE
其中 192.244.3.0 是 kb get pods -o wide 獲得的 IP , 在指定的node上執行
參考:
https://codyjava.iteye.com/blog/2435846
http://dockone.io/question/1350
