官網:https://kubernetes.io/docs/setup/independent/install-kubeadm/
1 我的主機是在aliyun上,默認配置了阿里源
配置阿里源:
修改/etc/apt/source爲:
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
2 安裝docker
apt-get install docker.io
查看docker版本:
3 安裝k8s
主要是安裝kubeadm kubelet kubectl
kubeadm : 用來初始化集羣的指令
kubelet : 在集羣中的每個節點上用來啓動 pod 和 container 等
kubectl: 用來與集羣通信的命令行工具
3.1 默認是從谷歌下載,我們可以添加阿里的k8s源
在/etc/apt/source的最後增加一行:
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
3.2 進行下載:
apt-get update && apt-get install -y apt-transport-https curl
apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated
4 初始化master結點,執行kubeadm init
由於kubeadm init執行時會下載一些從谷歌服務器的docker鏡像,我們可以提前下載好這些鏡像(避免訪問谷歌)
直接執行會報錯:
4.1 列舉並下載所需鏡像
kubeadm config images list
DockerHub上已經備份了這些鏡像(主要是備份在mirrorgooglecontainers上,鏡像coredns可以直接搜索的到):
docker pull mirrorgooglecontainers/kube-apiserver:v1.13.3
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.3
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3
docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker pull coredns/coredns:1.2.6
然後修改tag成k8s執行init檢查的鏡像:
docker tag mirrorgooglecontainers/kube-apiserver:v1.13.3 k8s.gcr.io/kube-apiserver:v1.13.3
docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.3 k8s.gcr.io/kube-controller-manager:v1.13.3
docker tag mirrorgooglecontainers/kube-scheduler:v1.13.3 k8s.gcr.io/kube-scheduler:v1.13.3
docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
4.2 配置kubelet的cgroup drive
確保docker的cgroup drive和kubelet的一致
查看docker的:
docker info | grep -i cgroup
kubelet的:
vim /etc/default/kubelet
修改爲:
KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs
重啓kubelet:
systemctl daemon-reload
systemctl restart kubelet
4.3 執行kubeadm init
主要是以下命令:
kubeadm init --kubernetes-version="v1.13.3" --pod-network-cidr=10.244.0.0/16
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
kubectl get pods --all-namespaces
kubectl get nodes
詳細介紹:
查看kubeadm的版本:
執行:
kubeadm init --kubernetes-version="v1.13.3" --pod-network-cidr=10.244.0.0/16
注意第二個紅圈的命令用於添加新結點(這個給出的kubeadm join後的hash值有效期是24小時,24小時過後便失效)
可以使用 kubeadm token list 來查看當前的 token 表
如果超過了24小時,又準備繼續添加新的節點,那麼就需要在master節點創建新的token
kubeadm token create --print-join-command
使用過後會輸出一串新的kubeadm join 及hash值。利用這個新的命令就可以添加新的節點進入集羣了
4.4 然後執行命令:
非root用戶執行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root用戶執行(僅本次有效),這個文件包含了登陸kubectl的驗證信息:
export KUBECONFIG=/etc/kubernetes/admin.conf
可以設置永久的環境變量,這樣下次登陸,kubectl就能直接連上本機的server,而不用再設置一次環境變量:
vim /etc/profile
末尾添加:
export KUBECONFIG=/etc/kubernetes/admin.conf
4.6 配置網絡插件
配置calico:
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
網絡插件選擇:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
用 kubectl get pods --all-namespaces 檢查
注:coredns是ContainerCreating時,是因爲kubeadm init沒有指定pod-network-cidr:
4.6 使用kubectl get nodes命令
kubectl get nodes
5 配置從節點:
和主節點一樣下載好k8s,docker,init前所需鏡像後,直接執行kubeadm join:
kubeadm join 172.26.242.27:6443 --token 1jsfkt.a7j1hg7j08gdwwla --discovery-token-ca-cert-hash sha256:a397401844993c5d8e44ff74b383d8a936a92e0fb0da1f9ebf4b3df90eb2d1ba
6 查看結點信息:
注:
1 kubeadm init命令詳情:
# kubeadm init
# --apiserver-advertise-address=59.110.220.63 開放公網ip爲apiserver 這裏填你主機的公網IP;
# --apiserver-bind-port=6443 默認綁定6443端口;
# --kubernetes-version="v1.13.3" 指定k8s集羣的版本v1.13.3(指定版本後就不需要連接google服務器進行新版本檢查了,對國內節點安裝的朋友,這個參數必不可少!!版本與你下載的kubeadm、kubectl、kubelet相同即可);
# --pod-network-cidr=10.244.0.0/16 選擇calico網絡pod ,這是用於k8s集羣間通信的網絡組件,有多種可供選擇的方式,詳見:https://v1-11.docs.kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network
# --apiserver-cert-extra-sans=172.17.76.239 添加內網 apiserver 節點間通訊使用內網傳遞信息 這裏填寫你主機的內網IP;
# 於是乎一個比較可靠的 kubeadm init 命令就被我們得到了:
kubeadm init --apiserver-advertise-address=59.110.220.63 --apiserver-bind-port=6443 --kubernetes-version="v1.13.3" --pod-network-cidr=10.244.0.0/16 --apiserver-cert-extra-sans=172.17.76.239
2 kubeadm reset
如果從節點執行了init,可以執行kubeadm reset後再執行kubeadm join
kubeadm reset:如果想重新運行 init或者join
3 docker join 時 --discovery-token-ca-cert-hash 忘了
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
輸出:
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
4 刪除K8s節點;
master上運行:
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>
節點上運行:
kubeadm reset
參考文檔:
https://blog.csdn.net/weixin_38070561/article/details/82982710
出錯:
1 運行 kubectl get node出錯:
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
解決:mv $HOME/.kube $HOME/.kube.bak
2
查看pod狀態時:kubectl describe pod Pod_Name 出現報錯:
nodes had taints that the pod didn't tolerate
原因:kubernetes出於安全考慮默認情況下無法在master節點上部署pod
執行:
kubectl taint nodes --all node-role.kubernetes.io/master-
如果覺得配置k8s麻煩,可以配置rancher,rancher通過圖像化界面管理k8s集羣,而且沒有網絡的問題。