實驗環境: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 的時候,這裡的任務也就暫時完成了。