開始安裝K8S集羣了,一開始我還打算先創建三個負載均衡的master節點的,不事後來據說最一開始的測試環境只要一個master節點外加兩個node節點便可。
html
系統初始化node
首先是三個centos的服務器。而後開始安裝組件,這裏爲了方便三個機器上裝的軟件,拉的鏡像都同樣了,實際上能夠少安裝的一點,不過反正也節約不了多少空間,由於這些軟件和鏡像不是很大。linux
先是關防火牆和selinux之類的操做確保這些設置不會影響到操做。
git
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config systemctl stop firewalld systemctl disable firewalld swapoff -a setenforce 0
還有記得把/etc/fstab裏的有swap字符的一行給註釋掉,不然重啓後kubelet的服務會出錯。參考命令github
sed -i 's/.*swap.*/#&/' /etc/fstab
安裝dockerdocker
接下來就是開始下軟件和拉鏡像的活了。它們同時存在的問題就是官方源不能下(由於它是某外國知名搜索引擎的服務器)。因此要加一下鏡像源。centos
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum list docker-ce --showduplicates | sort -r yum -y install docker-ce systemctl start docker systemctl status docker systemctl enable docker
安裝kubernetsapi
安裝 kubelet、kubeadm、kubectl,注意一下版本,yum源下載的版本默認是最新的,那麼容器鏡像至少要比這個版本新,若是沒有,請在下載的時候註明版本信息。我在作本次測試環境的時候全部的軟件和鏡像都是1.16.0的版本。bash
加阿里雲的鏡像源。
服務器
cat>>/etc/yum.repos.d/kubrenetes.repo<<EOF [kubernetes] name=Kubernetes Repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg EOF
yum install -y kubelet kubeadm kubectl systemctl enable kubelet && systemctl start kubelet
加上版本的下載方法。
yum install -y kubelet-1.16.0 kubeadm-1.16.0 kubectl-1.16.0
若是你已經下錯了,能夠用一些命令來解決。
rpm -qa | grep kube 查看版本
yum downgrade <package> //這個是yum降級的命令
先輸入命令
kubeadm config images list
它會告訴你,你須要下載哪些鏡像,你內心得有個底,至少這些鏡像你要先下載完成才能完成繼續。
當我在作的時候,屏幕上顯示的是
k8s.gcr.io/kube-apiserver:v1.16.7
k8s.gcr.io/kube-controller-manager:v1.16.7
k8s.gcr.io/kube-scheduler:v1.16.7
k8s.gcr.io/kube-proxy:v1.16.7
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
若是你輸入了命令,後面的版本可能會有變化,可是前面基本是是一致的。
而後開始用kubeadmin init的方法去初始化集羣。不過直接運行網上常見的命令估計90%是失敗的。我在踩坑的時候找到兩個辦法,能夠試試。
一個是:
kubeadm init --kubernetes-version=v1.16.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository=registry.aliyuncs.com/google_containers
這個方法加了一個--image-repository=registry.aliyuncs.com/google_containers參數改變了下載地址。
不過這麼作以後,你依舊要把這些docker鏡像的倉庫名改成k8s.gcr.io。
例如你在用命令docker images看到了鏡像的列表。
裏面有一個鏡像叫作registry.aliyuncs.com/google_containers/kube-apiserver
那麼你要用命令docker tag registry.aliyuncs.com/google_containers/kube-apiserver k8s.gcr.io/kube-apiserver
這樣的方法去改。有不少個這樣的鏡像它們的倉庫名都要改。改完以後你能夠用docker rmi <images>逐個的把原來registry.aliyuncs.com/google_containers打頭的鏡像通通刪除。固然你留着也沒問題。
第二個方法,請參考https://www.cnblogs.com/xingyys/p/11594189.html
用腳本去完成操做
#!/bin/bash## 使用以下腳本下載國內鏡像,並修改tag爲google的tagset -e KUBE_VERSION=v1.16.0 KUBE_PAUSE_VERSION=3.1 ETCD_VERSION=3.3.15-0 CORE_DNS_VERSION=1.6.2 GCR_URL=k8s.gcr.io ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers images=(kube-proxy:${KUBE_VERSION}kube-scheduler:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-apiserver:${KUBE_VERSION} pause:${KUBE_PAUSE_VERSION} etcd:${ETCD_VERSION} coredns:${CORE_DNS_VERSION}) for imageName in ${images[@]} ; do docker pull $ALIYUN_URL/$imageName docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName docker rmi $ALIYUN_URL/$imageNamedone done
而後再運行init命令(如下命令的參數怎麼設置呢?第二行的爲本機的IP,第三行是容器的版本,第四行則是pod網絡,這個儘可能不要改吧。)
sudo kubeadm init \ --apiserver-advertise-address 192.168.10.20 \ --kubernetes-version=v1.16.0 \ --pod-network-cidr=10.244.0.0/16
以下圖,而後初始化成功以後,會有一大堆的解釋,其中有幾條是讓你運行的命令,那麼就照作吧。
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
還有一條命令kubeadm join不是在本機上運行的。它看起來像這個樣子
kubeadm join 192.168.10.20:6443 --token lixsl8.v1auqmf91ty0xl0k \ --discovery-token-ca-cert-hash sha256:c3f92a6ed9149ead327342f48a545e7e127a455d5b338129feac85893d918a55
你要記住這個命令,由於裏面有惟一的token,這個每一臺都是不同的。即便你忘了也不要緊,你能夠用
kubeadm token create --print-join-command
從新找到它。
還有就是可能你不是一次就能成功的,若是kubeadm init中途有失敗的,你須要用命令
kubeadm reset
來重置master節點。不然會報錯,報錯一般會說xxx.yaml already exist
還有關於swap分區引發的問題
程序會提醒你用如下的命令去查看問題。
systemctl status kubelet jouralctl -xeu kubelet
在完成這一切以後,你可使用如下命令去查看pod的狀態。
kubectl get pods --all-namespaces -o wide
應該相似於這樣的一個樣子。
其中coredns這個容器的狀態時pending的,還須要裝一下網絡的組件。
安裝flanneld
你已經操做過如下的操做了吧?
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
而後下載quay.io的鏡像,同理用腳本去拉鏡像,或者本身去鏡像網站上拉鏡像。這裏依舊參考https://www.cnblogs.com/xingyys/p/11594189.html
#!/bin/bash set -e FLANNEL_VERSION=v0.11.0 # 在這裏修改源 QUAY_URL=quay.io/coreos QINIU_URL=quay-mirror.qiniu.com/coreos images=(flannel:${FLANNEL_VERSION}-amd64 flannel:${FLANNEL_VERSION}-arm64 flannel:${FLANNEL_VERSION}-arm flannel:${FLANNEL_VERSION}-ppc64le flannel:${FLANNEL_VERSION}-s390x) for imageName in ${images[@]} ; do docker pull $QINIU_URL/$imageName docker tag $QINIU_URL/$imageName $QUAY_URL/$imageName docker rmi $QINIU_URL/$imageNamedone done
而後去網上下載這個文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
若是wget不能成功下載,能夠在別的地方下載以後放到服務器裏去,我就是用迅雷下載的這個文件。
kubectl apply -f kube-flanneld.yaml
node節點的安裝
我在配置node節點的時候偷懶了,我用了master相同的的方法把全部的軟件和鏡像都下載下來了,實際上只要其中的一些,根據前面那個博客上的作法,你能夠把在master上已經下載好的鏡像打包複製到node節點上。
## master上執行docker save -o pause.tar k8s.gcr.io/pause:3.1 docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy## node上執行docker load -i pause.tar docker load -i kube-proxy.tar ## node上執行docker load -i pause.tar docker load -i kube-proxy.tar
flannel網絡也得在node上進行一遍。
而後還記得那條kubeadm join的命令嗎?就是那個帶token的那條,能夠輸入了。
在完成以上操做後,再回到master節點上,輸入命令kubectl get nodes看看相應的node都ready了嗎?