實驗環境:VMware Fusion 11.0.2
操作系統:CentOS 7.6
主機名 | IP地址 | CPU | 內存 |
---|---|---|---|
k8s2m | 172.16.183.151 | 2核 | 4G |
k8s2n | 172.16.183.161 | 1核 | 1G |
裝系統的時候就已經設置為靜態IP了,語言為英語,時區是上海。另外因為kubernetes默認不支持swap分區,所以在硬盤分區的時候直接把swap分區拿掉了。這里可以先忽略這些。
如果裝系統時分配了 swap 分區,臨時關閉 swap 分區可以用: swapoff -a ,永久關閉可以在 /etc/fstab 里面注釋掉,這段開始忘了寫了,用紅色寫出來吧。
未聲明的話,下列命令在 k8s2m 和 k8s2n 上都能執行。
1、配置 SSH 免密登陸
在本機的hosts 文件中加入如下內容:
72.16.183.151 k8s2m 172.16.183.161 k8s2n
然后查看本機是否有 id_rsa.pub 文件,如果沒有則通過 ssh-keygen 生成
if [ -f "$HOME/.ssh/id_rsa.pub" ];then echo "File exists"; else ssh-keygen; fi
將本地公鑰安裝到虛擬機的root賬戶下
ssh-copy-id root@k8s2m ssh-copy-id root@k8s2n
至此免密登陸配置完成。
2、解決 setLocale 問題
接下來開兩個終端通過ssh進入系統,在終端得到如下輸出:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
在終端直接執行如下命令,然后退出ssh,再次進入,或者直接重啟虛擬機
cat <<EOF > /etc/environment LANG=en_US.UTF-8 LC_ALL=C EOF
3、設置 SELinux 為 permissive 模式
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
4、停止並且禁用動態防火牆
systemctl disable firewalld && systemctl stop firewalld
5、添加 kubernetes.repo 和 docker-ce.repo
原本是都用 cat EOF 方式來做的,結果發現在我MAC上SSH連接進去執行后文件內容一致,但即便 yum clean all 后仍然無法生效,這里還是使用 vi,vim等編輯器往里面粘貼算了。
vi /etc/yum.repos.d/kubernetes.repo
[kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-debuginfo] name=Docker CE Stable - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-source] name=Docker CE Stable - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-edge] name=Docker CE Edge - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/edge enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-edge-debuginfo] name=Docker CE Edge - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/edge enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-edge-source] name=Docker CE Edge - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/edge enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test] name=Docker CE Test - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-debuginfo] name=Docker CE Test - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-source] name=Docker CE Test - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly] name=Docker CE Nightly - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-debuginfo] name=Docker CE Nightly - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-source] name=Docker CE Nightly - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
6、安裝 docker-ce
這里kubeadm的版本是1.13.1,支持的 docker 版本最高應該是 18.06.x,通過執行 yum list docker-ce --showduplicates | sort -r 得到 docker 各版本的列表:
這里選 18.06.1.ce-3.el7
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
安裝 docker-ce:
yum install -y docker-ce-18.06.1.ce-3.el7
啟動 docker 服務,並將 docker 服務設置為開機啟動
systemctl enable docker && systemctl start docker
7、安裝 kubelet、kubeadm 和 kubectl
以下是安裝 kubernetes 所需的工具
yum install -y kubelet kubeadm kubectl
啟動 docker、kubelet 服務,並將 docker、kubelet 服務設置為開機啟動
systemctl enable kubelet && systemctl start kubelet
8、安裝鏡像
列出 kubeadm 需要安裝的鏡像列表,然后使用 sed 修改后執行:
kubeadm config images list |sed -e 's#k8s.gcr.io\/coredns#coredns\/coredns#g'|sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#mirrorgooglecontainers#g'|sh -x
裝好的鏡像 tag 跟 kubeadm 直接裝的是不一樣的,這里給予修正:
docker images |grep -E 'mirrorgooglecontainers|coredns/coredns'|awk '{print "docker tag ",$1":"$2,$1":"$2}'|sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2'|sed -e 's#coredns#k8s.gcr.io#3'|sh -x
最后移除掉多余的 tag
docker images |grep -E 'mirrorgooglecontainers|coredns/coredns'|awk '{print "docker rmi ",$1":"$2}'|sh -x
9、配置 net.bridge.bridge-nf-call-iptables
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
然后重啟 kubelet
systemctl daemon-reload
systemctl restart kubelet
10、創建kubernetes master,只需要在 master 節點(k8s2m)上執行
在 master 上執行下面命令創建 kubernetes master,為何加 --pod-network-cidr=10.244.0.0/16 看這里
kubeadm init --pod-network-cidr=10.244.0.0/16
命令執行結束后,根據提示執行如下操作,如果本身是 root 用戶,第三條其實不用執行的:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面還有一條如下形式的提示,拷貝出來,在 worker 節點(k8s2n)上需要執行
kubeadm join 172.16.183.151:6443 --token ############## --discovery-token-ca-cert-hash #############################
最后安裝 pod network add-on,這里裝 flannel,在安裝之前這里有如下說明,也是為何
鏈接地址: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#tabs-pod-install-4
For flannel to work correctly, you must pass --pod-network-cidr=10.244.0.0/16 to kubeadm init.
安裝flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果想要查看 pods 或 nodes,分別執行如下命令(另外 pods 就是跑在 docker 上的,也可以通過 docker ps 來查看):
kubectl get pods --all-namespaces kubectl get nodes --all-namespaces
想要查看實時狀態還可以執行如下命令,-n2也就是2秒刷新一次結果:
watch -n2 kubectl get pods --all-namespaces
watch -n2 kubectl get nodes --all-namespaces
11、將 worker 節點(k8s2n) 加入 master 節點(k8s2m)
最后只需要在 worker 節點(k8s2n)上執行如下命令(在 master 節點 init 結束讓存下的命令):
kubeadm join 172.16.183.151:6443 --token ############## --discovery-token-ca-cert-hash #############################
當在master 節點 (k8s2m) 執行 kubectl get nodes ,能看到兩個節點,並且狀態都是 Ready 的時候,這里的任務也就暫時完成了。