CentOS 7.6 使用kubeadm安裝Kubernetes 13

Javenn發表於2019-01-05

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

相關文章