【02】Kubernets:使用 kubeadm 部署 K8S 集群
寫在前面的話
?
通過上一節(jié),知道了 K8S 有 Master / Node 組成,但是具體怎么個(gè)組成法,就是這一節(jié)具體談的內(nèi)容。概念性的東西我們會(huì)盡量以實(shí)驗(yàn)的形式將其復(fù)現(xiàn)。
?
?
部署 K8S 集群
?
互聯(lián)網(wǎng)常用的 K8S 集群部署方式:
1. kubeadm(我們本次用到的)
2. rancher
3. 云服務(wù)商提供的(如阿里云提供的 K8S)
4. yum 安裝(版本有點(diǎn)低,不推薦)
?
準(zhǔn)備:
| 192.168.100.101 | node1 | Master | kubeadm/kubelet/kubectl/docker-ce/flannel |
| 192.168.100.102 | node2 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
| 192.168.100.103 | node3 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
準(zhǔn)備 3 臺(tái)初始化的機(jī)器,內(nèi)存大于 2G。
至于 kubeadm 文檔如下,感興趣的可以去看看:
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
?
【1】所有節(jié)點(diǎn)初始化操作:
# 配置主機(jī)名解析 echo "192.168.100.101 node1" >>/etc/hosts echo "192.168.100.102 node2" >>/etc/hosts echo "192.168.100.103 node3" >>/etc/hosts# 關(guān)閉防火墻 systemctl stop firewalld systemctl disable firewalld# 取消 swap swapoff -a# 配置 ipvs echo 'net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1' > /etc/sysctl.d/k8s.conf# 使配置生效 modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf# kube-proxy 配置 ipvs echo 'modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4' >> /etc/sysconfig/modules/ipvs.modules# 生效配置 chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv4# 時(shí)間同步 yum -y install ntpdate ntpdate cn.pool.ntp.org echo "*/20 * * * * /usr/sbin/ntpdate cn.pool.ntp.org" >> /var/spool/cron/root簡(jiǎn)單的做個(gè)說明,上面的步驟是每個(gè)節(jié)點(diǎn)都需要進(jìn)行的初始化操作,屬于必須進(jìn)行了。第一個(gè)主機(jī)名解析需要根據(jù)自己的實(shí)際情況進(jìn)行一定量的修改。關(guān)閉防火墻是為了保證我們的通信能夠正常完成。至于開啟 ipvs 我們?cè)谏弦还?jié)提到過,在 K8S 1.11 版本以后,系統(tǒng)的負(fù)載均衡調(diào)度選用的是 ipvs 規(guī)則,能夠提高我們集群的性能。如果你不配置 ipvs,可能還會(huì)使用 iptables 規(guī)則,這不是我們想要看到的。
值得注意的是,時(shí)間同步在 docker 和 K8S 集群中都特別重要,所以一定要保證時(shí)間與互聯(lián)網(wǎng)時(shí)間同步,否則可能導(dǎo)致莫名其妙的 BUG,如:鏡像拉取失敗,報(bào)錯(cuò):
x509: certificate has expired or is not yet valid
?
【2】所有節(jié)點(diǎn)都安裝配置 docker:
# 卸載舊版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine# 安裝依賴 yum install -y yum-utils device-mapper-persistent-data lvm2 bridge-utils bash-completion wget# 配置阿里 yum 源 cd /etc/yum.repos.d wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安裝 docker yum -y install docker-ce配置 docker 阿里云下載加速:(這里的加速地址是網(wǎng)友的,如果你想用自己的,可以去阿里云搞一個(gè),具體就不詳細(xì)說明了,網(wǎng)上很多)
mkdir -p /etc/docker echo '{"registry-mirrors": ["https://eyg9yi6d.mirror.aliyuncs.com"] }' > /etc/docker/daemon.json啟動(dòng) docker:
systemctl enable docker systemctl start docker docker version我這里 docker 版本為:?18.09.6
?
【3】所有節(jié)點(diǎn)都配置 K8S 源并安裝 K8S:
cat <<EOF > /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 EOF安裝 K8S 并設(shè)置開機(jī)啟動(dòng),但是先不啟動(dòng):
yum makecache fast yum install -y kubelet kubeadm kubectlsystemctl enable kubelet
我們這里安裝 K8S 版本為:v1.14.2
?
【4】節(jié)點(diǎn)下載鏡像:
由于國內(nèi)網(wǎng)絡(luò)的原因,K8S 的鏡像站是連接不上的,需要手動(dòng)去下載,這里有個(gè)我寫的腳本,修改成你的 K8S 版本就行(K8S_VERSION):
#!/bin/bash################################################################# # 作者:Dy1an <1214966109@qq.com> # 日期:2019-05-23 # 作用:下載 K8S 相關(guān)鏡像 ################################################################################################################################## # 系統(tǒng)相關(guān)變量 ################################################################# LINE="===================================================================" MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings K8S_VERSION="v1.14.2"################################################################# # 拉取鏡像 ################################################################# echo ${LINE} echo "Pull Kubernetes ${K8S_VERSION} Images from aliyuncs.com ......" echo ${LINE} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1################################################################# # 修改 tag ################################################################# echo ${LINE} echo "Change Kubernetes ${K8S_VERSION} Images tags ......" echo ${LINE} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} k8s.gcr.io/kube-apiserver:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} k8s.gcr.io/kube-scheduler:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} k8s.gcr.io/kube-controller-manager:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} k8s.gcr.io/kube-proxy:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 k8s.gcr.io/pause:3.1 docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 k8s.gcr.io/coredns:1.3.1################################################################# # 提示完成 ################################################################# echo ${LINE} echo "Pull Kubernetes ${K8S_VERSION} Images FINISHED." echo ${LINE}在每臺(tái)機(jī)器上面執(zhí)行腳本,下載完成后查看鏡像:
docker images結(jié)果如圖:
?
【5】Master 主節(jié)點(diǎn)初始化:
在初始化之前,我們需要插播一個(gè)知識(shí)點(diǎn),那就是 K8S 網(wǎng)絡(luò),先看個(gè)圖:
在 K8S 集群中,我們主要會(huì)提到 3 個(gè)網(wǎng)絡(luò):
1. 節(jié)點(diǎn)網(wǎng)絡(luò):很好理解,就是每臺(tái)機(jī)器的真實(shí) IP 地址,比如:192.168.100.101,該 IP 稱作 Node IP。
2. Pod 網(wǎng)絡(luò):K8S 管理的最小單位是 Pod,我們可以把 Pod 就看成一個(gè) docker 容器,這個(gè) IP 就像容器的 IP,稱作 Pod IP。?
3. Service 網(wǎng)絡(luò):前兩 IP 都會(huì)配置到? Pod 或網(wǎng)卡,但是這個(gè)不會(huì),若多個(gè) Pod 組成一個(gè) Service,這個(gè) IP 就像統(tǒng)一入口。至于 Service,之后會(huì)詳講。該 IP 稱作 Cluster IP。
當(dāng)然還有其他網(wǎng)絡(luò),比如 pod 和 pod 之間通信的隧道?Overlay(疊加)網(wǎng)絡(luò)。以及 Pod 內(nèi)部容器間通過 lo 網(wǎng)卡通信的網(wǎng)絡(luò)。這些都不需要我們?nèi)リP(guān)注。只需要記住上面的 3 個(gè)就行。
?
為了實(shí)現(xiàn)這樣復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),我們引入了網(wǎng)絡(luò)插件,常見的插件有以下幾種:
1. flannel:簡(jiǎn)單易用,但不支持網(wǎng)絡(luò)策略。通過配置本地網(wǎng)絡(luò)協(xié)議棧實(shí)現(xiàn)給本機(jī) Pod 配置 IP。
2. project calico:支持網(wǎng)絡(luò)策略和網(wǎng)絡(luò)配置,默認(rèn)基于 BGP 網(wǎng)絡(luò)實(shí)現(xiàn)直接通信。
3. canel:flannel 和 calico 結(jié)合,flannel 提供網(wǎng)絡(luò),calico 提供策略。
?
基于上面的知識(shí)點(diǎn),我們?cè)賮沓跏蓟覀兊募?#xff0c;并定義了兩個(gè)服務(wù)網(wǎng)段:
# 添加配置 echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet# 初始化主節(jié)點(diǎn) kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.1.0.0/16 --service-cidr=10.96.0.0/12結(jié)果如圖:
從初始化節(jié)點(diǎn)打印的東西我們可以看到:
1. 系統(tǒng)初始化安裝了兩個(gè)附件:kube-proxy 和 CoreDNS(就是 kube-dns)。
2. 我們需要手動(dòng)執(zhí)行這個(gè) 3 個(gè)命令才算真正完成主節(jié)點(diǎn)初始化。
3. Node 節(jié)點(diǎn)加入集群的命令,需要我們記錄下來。?
執(zhí)行后續(xù)操作:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config查看集群狀態(tài):
kubectl get cs結(jié)果如圖:?
查看節(jié)點(diǎn)信息:
kubectl get nodes結(jié)果如圖:
此時(shí)可以看到,主節(jié)點(diǎn)的狀態(tài)是 NotReady 的,原因是還沒有配置 flannel。
注意:如果出現(xiàn)錯(cuò)誤,我們可以通過?/var/log/messages 查看日志。
安裝 flannel 網(wǎng)絡(luò)插件,項(xiàng)目地址:
https://github.com/coreos/flannel
?執(zhí)行命令在線安裝:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml結(jié)果如圖:
此時(shí)再度查看節(jié)點(diǎn)狀態(tài):
kubectl get nodes結(jié)果如圖,已經(jīng)變成 Ready 狀態(tài):?
查看當(dāng)前運(yùn)行的 Pod:
kubectl get pods -n kube-system結(jié)果如圖:
這里專門指定了名稱空間,如果不指定,會(huì)發(fā)現(xiàn)默認(rèn)的名稱空間中什么也沒有。可以查看下名稱空間:
kubectl get ns結(jié)果如圖:
至此,主節(jié)點(diǎn)配置基本完成,接下來配置 Node 節(jié)點(diǎn)!至于這些命令,之后會(huì)單獨(dú)講解。
?
【6】Node 節(jié)點(diǎn)初始化:
# 添加配置 echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet# 加入集群 kubeadm join 192.168.100.101:6443 --token no4hr8.4xv9xjyt9dxwqinq --discovery-token-ca-cert-hash sha256:239675f2ccb9e700ea1a60b8ff019672ea1a98c1f66ad6a81972cb5ec7d4f381結(jié)果如圖:
去主節(jié)點(diǎn)查看結(jié)果:容器啟動(dòng)需要一定的時(shí)間(1-2分鐘),所以直接查看可能出現(xiàn) NotReady 的情況,這是正常的。
主節(jié)點(diǎn)上查看運(yùn)行的詳細(xì)信息:
kubectl get pods -n kube-system -o wide結(jié)果如圖:-o wide 查看詳細(xì)信息!
可以看到,kube-proxy 和 kube-flannel 在其他節(jié)點(diǎn)上都有運(yùn)行。
這里我們得再強(qiáng)調(diào)一件事情,除了開始加入節(jié)點(diǎn)的命令我們得去 Node 從節(jié)點(diǎn)執(zhí)行,后續(xù)的命令我們都是在 Master 節(jié)點(diǎn)完成的,由此可以看出 Master 節(jié)點(diǎn)的重要性。
到此,K8S 簡(jiǎn)單的集群搭建完成!?
?
?
小結(jié)
?
整個(gè)部署過程中最麻煩的就是鏡像下載以及鏡像版本之間的兼容性。我們推薦使用相對(duì)成熟的版本部署我們的應(yīng)用。因?yàn)槲疫@里是測(cè)試,所以就選用的最新穩(wěn)定版。
主要的過程就像這些,看著很復(fù)雜,其實(shí)大多都說貼命令的過程。后續(xù)如果感興趣,其實(shí)完全可以寫成腳本,讓他一鍵部署。
轉(zhuǎn)載于:https://www.cnblogs.com/Dy1an/p/10812263.html
總結(jié)
以上是生活随笔為你收集整理的【02】Kubernets:使用 kubeadm 部署 K8S 集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS安装cheat和tldr
- 下一篇: Halcon例程详解(植物测量) ——